mirror of
https://github.com/Ed94/gencpp.git
synced 2024-12-22 15:54:45 -08:00
Got raylib bootstrapped to compile
Still need to setup a refactor script among other things before using.
This commit is contained in:
parent
d5a4b77033
commit
a900e86b65
22
.gitignore
vendored
22
.gitignore
vendored
@ -16,25 +16,15 @@
|
|||||||
gencpp.hpp
|
gencpp.hpp
|
||||||
gencpp.cpp
|
gencpp.cpp
|
||||||
|
|
||||||
# Build results
|
**/*.lib
|
||||||
[Dd]ebug/
|
**/*.pdb
|
||||||
[Dd]ebugPublic/
|
**/*.exe
|
||||||
[Rr]elease/
|
**/*.dll
|
||||||
[Rr]eleases/
|
|
||||||
x64/
|
|
||||||
x86/
|
|
||||||
[Ww][Ii][Nn]32/
|
|
||||||
[Aa][Rr][Mm]/
|
|
||||||
[Aa][Rr][Mm]64/
|
|
||||||
bld/
|
|
||||||
[Bb]in/
|
|
||||||
[Oo]bj/
|
|
||||||
[Ll]og/
|
|
||||||
[Ll]ogs/
|
|
||||||
vc140.pdb
|
|
||||||
|
|
||||||
|
release/**
|
||||||
|
|
||||||
# Unreal
|
# Unreal
|
||||||
**/Unreal/*.h
|
**/Unreal/*.h
|
||||||
**/Unreal/*.cpp
|
**/Unreal/*.cpp
|
||||||
! **/Unreal/validate.unreal.cpp
|
! **/Unreal/validate.unreal.cpp
|
||||||
|
project/auxillary/vis_ast/dependencies/temp
|
||||||
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -28,7 +28,8 @@
|
|||||||
"functional": "cpp",
|
"functional": "cpp",
|
||||||
"vector": "cpp",
|
"vector": "cpp",
|
||||||
"list": "cpp",
|
"list": "cpp",
|
||||||
"xhash": "cpp"
|
"xhash": "cpp",
|
||||||
|
"glfw3.h": "c"
|
||||||
},
|
},
|
||||||
"C_Cpp.intelliSenseEngineFallback": "disabled",
|
"C_Cpp.intelliSenseEngineFallback": "disabled",
|
||||||
"mesonbuild.configureOnOpen": true,
|
"mesonbuild.configureOnOpen": true,
|
||||||
|
@ -8,7 +8,6 @@ $devshell = Join-Path $path_scripts 'helpers/devshell.ps1'
|
|||||||
$format_cpp = Join-Path $path_scripts 'helpers/format_cpp.psm1'
|
$format_cpp = Join-Path $path_scripts 'helpers/format_cpp.psm1'
|
||||||
$incremental_checks = Join-Path $path_scripts 'helpers/incremental_checks.ps1'
|
$incremental_checks = Join-Path $path_scripts 'helpers/incremental_checks.ps1'
|
||||||
$vendor_toolchain = Join-Path $path_scripts 'helpers/vendor_toolchain.ps1'
|
$vendor_toolchain = Join-Path $path_scripts 'helpers/vendor_toolchain.ps1'
|
||||||
$update_deps = Join-Path $path_scripts 'update_deps.ps1'
|
|
||||||
|
|
||||||
$path_project = Join-Path $path_root 'project'
|
$path_project = Join-Path $path_root 'project'
|
||||||
$path_aux = Join-Path $path_project 'auxillary'
|
$path_aux = Join-Path $path_project 'auxillary'
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Platform architecture */
|
// Platform architecture
|
||||||
|
|
||||||
#if defined( _WIN64 ) || defined( __x86_64__ ) || defined( _M_X64 ) || defined( __64BIT__ ) || defined( __powerpc64__ ) || defined( __ppc64__ ) || defined( __aarch64__ )
|
#if defined( _WIN64 ) || defined( __x86_64__ ) || defined( _M_X64 ) || defined( __64BIT__ ) || defined( __powerpc64__ ) || defined( __ppc64__ ) || defined( __aarch64__ )
|
||||||
# ifndef ARCH_64_BIT
|
# ifndef ARCH_64_BIT
|
||||||
|
8
project/auxillary/vis_ast/code/platform/win32/launch.cpp
Normal file
8
project/auxillary/vis_ast/code/platform/win32/launch.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#if INTELLISENSE_DIRECTIVES
|
||||||
|
#include "win32.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int __stdcall WinMain( HINSTANCE instance, HINSTANCE prev_instance, char* commandline, int num_cmd_show)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
1
project/auxillary/vis_ast/code/platform/win32/types.hpp
Normal file
1
project/auxillary/vis_ast/code/platform/win32/types.hpp
Normal file
@ -0,0 +1 @@
|
|||||||
|
using HINSTANCE = void*;
|
247
project/auxillary/vis_ast/dependencies/raylib/include/config.h
Normal file
247
project/auxillary/vis_ast/dependencies/raylib/include/config.h
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
/**********************************************************************************************
|
||||||
|
*
|
||||||
|
* 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 SUPPORT_MODULE_RSHAPES 1
|
||||||
|
#define SUPPORT_MODULE_RTEXTURES 1
|
||||||
|
#define SUPPORT_MODULE_RTEXT 1 // WARNING: It requires SUPPORT_MODULE_RTEXTURES to load sprite font textures
|
||||||
|
#define SUPPORT_MODULE_RMODELS 1
|
||||||
|
#define 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 SUPPORT_CAMERA_SYSTEM 1
|
||||||
|
// Gestures module is included (rgestures.h) to support gestures detection: tap, hold, swipe, drag
|
||||||
|
#define SUPPORT_GESTURES_SYSTEM 1
|
||||||
|
// Mouse gestures are directly mapped like touches and processed by gestures system
|
||||||
|
#define SUPPORT_MOUSE_GESTURES 1
|
||||||
|
// Reconfigure standard input to receive key inputs, works with SSH connection.
|
||||||
|
#define 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 SUPPORT_WINMM_HIGHRES_TIMER 1
|
||||||
|
// Use busy wait loop for timing sync, if not defined, a high-resolution timer is set up and used
|
||||||
|
//#define SUPPORT_BUSY_WAIT_LOOP 1
|
||||||
|
// Use a partial-busy wait loop, in this case frame sleeps for most of the time, but then runs a busy loop at the end for accuracy
|
||||||
|
#define SUPPORT_PARTIALBUSY_WAIT_LOOP 1
|
||||||
|
// Allow automatic screen capture of current screen pressing F12, defined in KeyCallback()
|
||||||
|
#define SUPPORT_SCREEN_CAPTURE 1
|
||||||
|
// Allow automatic gif recording of current screen pressing CTRL+F12, defined in KeyCallback()
|
||||||
|
#define SUPPORT_GIF_RECORDING 1
|
||||||
|
// Support CompressData() and DecompressData() functions
|
||||||
|
#define SUPPORT_COMPRESSION_API 1
|
||||||
|
// Support automatic generated events, loading and recording of those events when required
|
||||||
|
//#define SUPPORT_EVENTS_AUTOMATION 1
|
||||||
|
// Support custom frame control, only for advance users
|
||||||
|
// By default EndDrawing() does this job: draws everything + SwapScreenBuffer() + manage frame timing + PollInputEvents()
|
||||||
|
// Enabling this flag allows manual control of the frame processes, use at your own risk
|
||||||
|
//#define SUPPORT_CUSTOM_FRAME_CONTROL 1
|
||||||
|
|
||||||
|
// rcore: Configuration values
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
#define MAX_FILEPATH_CAPACITY 8192 // Maximum file paths capacity
|
||||||
|
#define MAX_FILEPATH_LENGTH 4096 // Maximum length for filepaths (Linux PATH_MAX default value)
|
||||||
|
|
||||||
|
#define MAX_KEYBOARD_KEYS 512 // Maximum number of keyboard keys supported
|
||||||
|
#define MAX_MOUSE_BUTTONS 8 // Maximum number of mouse buttons supported
|
||||||
|
#define MAX_GAMEPADS 4 // Maximum number of gamepads supported
|
||||||
|
#define MAX_GAMEPAD_AXIS 8 // Maximum number of axis supported (per gamepad)
|
||||||
|
#define MAX_GAMEPAD_BUTTONS 32 // Maximum number of buttons supported (per gamepad)
|
||||||
|
#define MAX_TOUCH_POINTS 8 // Maximum number of touch points supported
|
||||||
|
#define MAX_KEY_PRESSED_QUEUE 16 // Maximum number of keys in the key input queue
|
||||||
|
#define MAX_CHAR_PRESSED_QUEUE 16 // Maximum number of characters in the char input queue
|
||||||
|
|
||||||
|
#define MAX_DECOMPRESSION_SIZE 64 // Max size allocated for decompression in MB
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// 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 (SetShaderValueTexture())
|
||||||
|
|
||||||
|
#define RL_MAX_MATRIX_STACK_SIZE 32 // Maximum size of internal Matrix stack
|
||||||
|
|
||||||
|
#define RL_MAX_SHADER_LOCATIONS 32 // Maximum number of shader locations supported
|
||||||
|
|
||||||
|
#define RL_CULL_DISTANCE_NEAR 0.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 SUPPORT_QUADS_DRAW_MODE 1
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Module: rtextures - Configuration Flags
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Selecte desired fileformats to be supported for image data loading
|
||||||
|
#define SUPPORT_FILEFORMAT_PNG 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_BMP 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_TGA 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_JPG 1
|
||||||
|
#define SUPPORT_FILEFORMAT_GIF 1
|
||||||
|
#define SUPPORT_FILEFORMAT_QOI 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_PSD 1
|
||||||
|
#define SUPPORT_FILEFORMAT_DDS 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_HDR 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_PIC 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_KTX 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_ASTC 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_PKM 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_PVR 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_SVG 1
|
||||||
|
|
||||||
|
// Support image export functionality (.png, .bmp, .tga, .jpg, .qoi)
|
||||||
|
#define SUPPORT_IMAGE_EXPORT 1
|
||||||
|
// Support procedural image generation functionality (gradient, spot, perlin-noise, cellular)
|
||||||
|
#define SUPPORT_IMAGE_GENERATION 1
|
||||||
|
// Support multiple image editing functions to scale, adjust colors, flip, draw on images, crop...
|
||||||
|
// If not defined, still some functions are supported: ImageFormat(), ImageCrop(), ImageToPOT()
|
||||||
|
#define 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 SUPPORT_DEFAULT_FONT 1
|
||||||
|
// Selected desired font fileformats to be supported for loading
|
||||||
|
#define SUPPORT_FILEFORMAT_FNT 1
|
||||||
|
#define SUPPORT_FILEFORMAT_TTF 1
|
||||||
|
|
||||||
|
// Support text management functions
|
||||||
|
// If not defined, still some functions are supported: TextLength(), TextFormat()
|
||||||
|
#define SUPPORT_TEXT_MANIPULATION 1
|
||||||
|
|
||||||
|
// On font atlas image generation [GenImageFontAtlas()], add a 3x3 pixels white rectangle
|
||||||
|
// at the bottom-right corner of the atlas. It can be useful to for shapes drawing, to allow
|
||||||
|
// drawing text and shapes with a single draw call [SetShapesTexture()].
|
||||||
|
#define SUPPORT_FONT_ATLAS_WHITE_REC 1
|
||||||
|
|
||||||
|
// rtext: Configuration values
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
#define MAX_TEXT_BUFFER_LENGTH 1024 // Size of internal static buffers used on some functions:
|
||||||
|
// TextFormat(), TextSubtext(), TextToUpper(), TextToLower(), TextToPascal(), TextSplit()
|
||||||
|
#define 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 SUPPORT_FILEFORMAT_OBJ 1
|
||||||
|
#define SUPPORT_FILEFORMAT_MTL 1
|
||||||
|
#define SUPPORT_FILEFORMAT_IQM 1
|
||||||
|
#define SUPPORT_FILEFORMAT_GLTF 1
|
||||||
|
#define SUPPORT_FILEFORMAT_VOX 1
|
||||||
|
#define 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 SUPPORT_MESH_GENERATION 1
|
||||||
|
|
||||||
|
// rmodels: Configuration values
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
#define MAX_MATERIAL_MAPS 12 // Maximum number of shader maps supported
|
||||||
|
#define MAX_MESH_VERTEX_BUFFERS 7 // Maximum vertex buffers (VBO) per mesh
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Module: raudio - Configuration Flags
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Desired audio fileformats to be supported for loading
|
||||||
|
#define SUPPORT_FILEFORMAT_WAV 1
|
||||||
|
#define SUPPORT_FILEFORMAT_OGG 1
|
||||||
|
#define SUPPORT_FILEFORMAT_MP3 1
|
||||||
|
#define SUPPORT_FILEFORMAT_QOA 1
|
||||||
|
//#define SUPPORT_FILEFORMAT_FLAC 1
|
||||||
|
#define SUPPORT_FILEFORMAT_XM 1
|
||||||
|
#define SUPPORT_FILEFORMAT_MOD 1
|
||||||
|
|
||||||
|
// raudio: Configuration values
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
#define AUDIO_DEVICE_FORMAT ma_format_f32 // Device output format (miniaudio: float-32bit)
|
||||||
|
#define AUDIO_DEVICE_CHANNELS 2 // Device output channels: stereo
|
||||||
|
#define AUDIO_DEVICE_SAMPLE_RATE 0 // Device sample rate (device default)
|
||||||
|
|
||||||
|
#define MAX_AUDIO_BUFFER_POOL_CHANNELS 16 // Maximum number of audio pool channels
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Module: utils - Configuration Flags
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Standard file io library (stdio.h) included
|
||||||
|
#define SUPPORT_STANDARD_FILEIO 1
|
||||||
|
// Show TRACELOG() output messages
|
||||||
|
// NOTE: By default LOG_DEBUG traces not shown
|
||||||
|
#define SUPPORT_TRACELOG 1
|
||||||
|
//#define SUPPORT_TRACELOG_DEBUG 1
|
||||||
|
|
||||||
|
// utils: Configuration values
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
#define MAX_TRACELOG_MSG_LENGTH 256 // Max length of one trace-log message
|
||||||
|
|
||||||
|
#endif // CONFIG_H
|
1619
project/auxillary/vis_ast/dependencies/raylib/include/raylib.h
Normal file
1619
project/auxillary/vis_ast/dependencies/raylib/include/raylib.h
Normal file
File diff suppressed because it is too large
Load Diff
2190
project/auxillary/vis_ast/dependencies/raylib/include/raymath.h
Normal file
2190
project/auxillary/vis_ast/dependencies/raylib/include/raymath.h
Normal file
File diff suppressed because it is too large
Load Diff
558
project/auxillary/vis_ast/dependencies/raylib/include/rcamera.h
Normal file
558
project/auxillary/vis_ast/dependencies/raylib/include/rcamera.h
Normal file
@ -0,0 +1,558 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* 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(BUILD_LIBTYPE_SHARED)
|
||||||
|
#if defined(__TINYC__)
|
||||||
|
#define __declspec(x) __attribute__((x))
|
||||||
|
#endif
|
||||||
|
#define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll)
|
||||||
|
#elif defined(USE_LIBTYPE_SHARED)
|
||||||
|
#define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef RLAPI
|
||||||
|
#define RLAPI // Functions defined as 'extern' by default (implicit specifiers)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(RCAMERA_STANDALONE)
|
||||||
|
#define CAMERA_CULL_DISTANCE_NEAR 0.01
|
||||||
|
#define CAMERA_CULL_DISTANCE_FAR 1000.0
|
||||||
|
#else
|
||||||
|
#define CAMERA_CULL_DISTANCE_NEAR RL_CULL_DISTANCE_NEAR
|
||||||
|
#define CAMERA_CULL_DISTANCE_FAR RL_CULL_DISTANCE_FAR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
// NOTE: Below types are required for standalone usage
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
#if defined(RCAMERA_STANDALONE)
|
||||||
|
// Vector2, 2 components
|
||||||
|
typedef struct Vector2 {
|
||||||
|
float x; // Vector x component
|
||||||
|
float y; // Vector y component
|
||||||
|
} Vector2;
|
||||||
|
|
||||||
|
// Vector3, 3 components
|
||||||
|
typedef struct Vector3 {
|
||||||
|
float x; // Vector x component
|
||||||
|
float y; // Vector y component
|
||||||
|
float z; // Vector z component
|
||||||
|
} Vector3;
|
||||||
|
|
||||||
|
// Matrix, 4x4 components, column major, OpenGL style, right-handed
|
||||||
|
typedef struct Matrix {
|
||||||
|
float m0, m4, m8, m12; // Matrix first row (4 components)
|
||||||
|
float m1, m5, m9, m13; // Matrix second row (4 components)
|
||||||
|
float m2, m6, m10, m14; // Matrix third row (4 components)
|
||||||
|
float m3, m7, m11, m15; // Matrix fourth row (4 components)
|
||||||
|
} Matrix;
|
||||||
|
|
||||||
|
// Camera type, defines a camera position/orientation in 3d space
|
||||||
|
typedef struct Camera3D {
|
||||||
|
Vector3 position; // Camera position
|
||||||
|
Vector3 target; // Camera target it looks-at
|
||||||
|
Vector3 up; // Camera up vector (rotation over its axis)
|
||||||
|
float fovy; // Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic
|
||||||
|
int projection; // Camera projection type: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC
|
||||||
|
} Camera3D;
|
||||||
|
|
||||||
|
typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D
|
||||||
|
|
||||||
|
// Camera projection
|
||||||
|
typedef enum {
|
||||||
|
CAMERA_PERSPECTIVE = 0, // Perspective projection
|
||||||
|
CAMERA_ORTHOGRAPHIC // Orthographic projection
|
||||||
|
} CameraProjection;
|
||||||
|
|
||||||
|
// Camera system modes
|
||||||
|
typedef enum {
|
||||||
|
CAMERA_CUSTOM = 0, // Camera custom, controlled by user (UpdateCamera() does nothing)
|
||||||
|
CAMERA_FREE, // Camera free mode
|
||||||
|
CAMERA_ORBITAL, // Camera orbital, around target, zoom supported
|
||||||
|
CAMERA_FIRST_PERSON, // Camera first person
|
||||||
|
CAMERA_THIRD_PERSON // Camera third person
|
||||||
|
} CameraMode;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Global Variables Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
//...
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" { // Prevents name mangling of functions
|
||||||
|
#endif
|
||||||
|
|
||||||
|
RLAPI Vector3 GetCameraForward(Camera *camera);
|
||||||
|
RLAPI Vector3 GetCameraUp(Camera *camera);
|
||||||
|
RLAPI Vector3 GetCameraRight(Camera *camera);
|
||||||
|
|
||||||
|
// Camera movement
|
||||||
|
RLAPI void CameraMoveForward(Camera *camera, float distance, bool moveInWorldPlane);
|
||||||
|
RLAPI void CameraMoveUp(Camera *camera, float distance);
|
||||||
|
RLAPI void CameraMoveRight(Camera *camera, float distance, bool moveInWorldPlane);
|
||||||
|
RLAPI void CameraMoveToTarget(Camera *camera, float delta);
|
||||||
|
|
||||||
|
// Camera rotation
|
||||||
|
RLAPI void CameraYaw(Camera *camera, float angle, bool rotateAroundTarget);
|
||||||
|
RLAPI void CameraPitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp);
|
||||||
|
RLAPI void CameraRoll(Camera *camera, float angle);
|
||||||
|
|
||||||
|
RLAPI Matrix GetCameraViewMatrix(Camera *camera);
|
||||||
|
RLAPI Matrix GetCameraProjectionMatrix(Camera* camera, float aspect);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // RCAMERA_H
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************************
|
||||||
|
*
|
||||||
|
* CAMERA IMPLEMENTATION
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#if defined(RCAMERA_IMPLEMENTATION)
|
||||||
|
|
||||||
|
#include "raymath.h" // Required for vector maths:
|
||||||
|
// Vector3Add()
|
||||||
|
// Vector3Subtract()
|
||||||
|
// Vector3Scale()
|
||||||
|
// Vector3Normalize()
|
||||||
|
// Vector3Distance()
|
||||||
|
// Vector3CrossProduct()
|
||||||
|
// Vector3RotateByAxisAngle()
|
||||||
|
// Vector3Angle()
|
||||||
|
// Vector3Negate()
|
||||||
|
// MatrixLookAt()
|
||||||
|
// MatrixPerspective()
|
||||||
|
// MatrixOrtho()
|
||||||
|
// MatrixIdentity()
|
||||||
|
|
||||||
|
// raylib required functionality:
|
||||||
|
// GetMouseDelta()
|
||||||
|
// GetMouseWheelMove()
|
||||||
|
// IsKeyDown()
|
||||||
|
// IsKeyPressed()
|
||||||
|
// GetFrameTime()
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// 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
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
//...
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Returns the cameras forward vector (normalized)
|
||||||
|
Vector3 GetCameraForward(Camera *camera)
|
||||||
|
{
|
||||||
|
return Vector3Normalize(Vector3Subtract(camera->target, camera->position));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the cameras up vector (normalized)
|
||||||
|
// Note: The up vector might not be perpendicular to the forward vector
|
||||||
|
Vector3 GetCameraUp(Camera *camera)
|
||||||
|
{
|
||||||
|
return Vector3Normalize(camera->up);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the cameras right vector (normalized)
|
||||||
|
Vector3 GetCameraRight(Camera *camera)
|
||||||
|
{
|
||||||
|
Vector3 forward = GetCameraForward(camera);
|
||||||
|
Vector3 up = GetCameraUp(camera);
|
||||||
|
|
||||||
|
return Vector3CrossProduct(forward, up);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moves the camera in its forward direction
|
||||||
|
void CameraMoveForward(Camera *camera, float distance, bool moveInWorldPlane)
|
||||||
|
{
|
||||||
|
Vector3 forward = GetCameraForward(camera);
|
||||||
|
|
||||||
|
if (moveInWorldPlane)
|
||||||
|
{
|
||||||
|
// Project vector onto world plane
|
||||||
|
forward.y = 0;
|
||||||
|
forward = Vector3Normalize(forward);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale by distance
|
||||||
|
forward = Vector3Scale(forward, distance);
|
||||||
|
|
||||||
|
// Move position and target
|
||||||
|
camera->position = Vector3Add(camera->position, forward);
|
||||||
|
camera->target = Vector3Add(camera->target, forward);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moves the camera in its up direction
|
||||||
|
void CameraMoveUp(Camera *camera, float distance)
|
||||||
|
{
|
||||||
|
Vector3 up = GetCameraUp(camera);
|
||||||
|
|
||||||
|
// Scale by distance
|
||||||
|
up = Vector3Scale(up, distance);
|
||||||
|
|
||||||
|
// Move position and target
|
||||||
|
camera->position = Vector3Add(camera->position, up);
|
||||||
|
camera->target = Vector3Add(camera->target, up);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moves the camera target in its current right direction
|
||||||
|
void CameraMoveRight(Camera *camera, float distance, bool moveInWorldPlane)
|
||||||
|
{
|
||||||
|
Vector3 right = GetCameraRight(camera);
|
||||||
|
|
||||||
|
if (moveInWorldPlane)
|
||||||
|
{
|
||||||
|
// Project vector onto world plane
|
||||||
|
right.y = 0;
|
||||||
|
right = Vector3Normalize(right);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale by distance
|
||||||
|
right = Vector3Scale(right, distance);
|
||||||
|
|
||||||
|
// Move position and target
|
||||||
|
camera->position = Vector3Add(camera->position, right);
|
||||||
|
camera->target = Vector3Add(camera->target, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moves the camera position closer/farther to/from the camera target
|
||||||
|
void CameraMoveToTarget(Camera *camera, float delta)
|
||||||
|
{
|
||||||
|
float distance = Vector3Distance(camera->position, camera->target);
|
||||||
|
|
||||||
|
// Apply delta
|
||||||
|
distance += delta;
|
||||||
|
|
||||||
|
// Distance must be greater than 0
|
||||||
|
if (distance <= 0) distance = 0.001f;
|
||||||
|
|
||||||
|
// Set new distance by moving the position along the forward vector
|
||||||
|
Vector3 forward = GetCameraForward(camera);
|
||||||
|
camera->position = Vector3Add(camera->target, Vector3Scale(forward, -distance));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotates the camera around its up vector
|
||||||
|
// Yaw is "looking left and right"
|
||||||
|
// If rotateAroundTarget is false, the camera rotates around its position
|
||||||
|
// Note: angle must be provided in radians
|
||||||
|
void CameraYaw(Camera *camera, float angle, bool rotateAroundTarget)
|
||||||
|
{
|
||||||
|
// Rotation axis
|
||||||
|
Vector3 up = GetCameraUp(camera);
|
||||||
|
|
||||||
|
// View vector
|
||||||
|
Vector3 targetPosition = Vector3Subtract(camera->target, camera->position);
|
||||||
|
|
||||||
|
// Rotate view vector around up axis
|
||||||
|
targetPosition = Vector3RotateByAxisAngle(targetPosition, up, angle);
|
||||||
|
|
||||||
|
if (rotateAroundTarget)
|
||||||
|
{
|
||||||
|
// Move position relative to target
|
||||||
|
camera->position = Vector3Subtract(camera->target, targetPosition);
|
||||||
|
}
|
||||||
|
else // rotate around camera.position
|
||||||
|
{
|
||||||
|
// Move target relative to position
|
||||||
|
camera->target = Vector3Add(camera->position, targetPosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotates the camera around its right vector, pitch is "looking up and down"
|
||||||
|
// - lockView prevents camera overrotation (aka "somersaults")
|
||||||
|
// - rotateAroundTarget defines if rotation is around target or around its position
|
||||||
|
// - rotateUp rotates the up direction as well (typically only usefull in CAMERA_FREE)
|
||||||
|
// NOTE: angle must be provided in radians
|
||||||
|
void CameraPitch(Camera *camera, float angle, bool lockView, bool rotateAroundTarget, bool rotateUp)
|
||||||
|
{
|
||||||
|
// Up direction
|
||||||
|
Vector3 up = GetCameraUp(camera);
|
||||||
|
|
||||||
|
// View vector
|
||||||
|
Vector3 targetPosition = Vector3Subtract(camera->target, camera->position);
|
||||||
|
|
||||||
|
if (lockView)
|
||||||
|
{
|
||||||
|
// In these camera modes we clamp the Pitch angle
|
||||||
|
// to allow only viewing straight up or down.
|
||||||
|
|
||||||
|
// Clamp view up
|
||||||
|
float maxAngleUp = Vector3Angle(up, targetPosition);
|
||||||
|
maxAngleUp -= 0.001f; // avoid numerical errors
|
||||||
|
if (angle > maxAngleUp) angle = maxAngleUp;
|
||||||
|
|
||||||
|
// Clamp view down
|
||||||
|
float maxAngleDown = Vector3Angle(Vector3Negate(up), targetPosition);
|
||||||
|
maxAngleDown *= -1.0f; // downwards angle is negative
|
||||||
|
maxAngleDown += 0.001f; // avoid numerical errors
|
||||||
|
if (angle < maxAngleDown) angle = maxAngleDown;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotation axis
|
||||||
|
Vector3 right = GetCameraRight(camera);
|
||||||
|
|
||||||
|
// Rotate view vector around right axis
|
||||||
|
targetPosition = Vector3RotateByAxisAngle(targetPosition, right, angle);
|
||||||
|
|
||||||
|
if (rotateAroundTarget)
|
||||||
|
{
|
||||||
|
// Move position relative to target
|
||||||
|
camera->position = Vector3Subtract(camera->target, targetPosition);
|
||||||
|
}
|
||||||
|
else // rotate around camera.position
|
||||||
|
{
|
||||||
|
// Move target relative to position
|
||||||
|
camera->target = Vector3Add(camera->position, targetPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rotateUp)
|
||||||
|
{
|
||||||
|
// Rotate up direction around right axis
|
||||||
|
camera->up = Vector3RotateByAxisAngle(camera->up, right, angle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotates the camera around its forward vector
|
||||||
|
// Roll is "turning your head sideways to the left or right"
|
||||||
|
// Note: angle must be provided in radians
|
||||||
|
void CameraRoll(Camera *camera, float angle)
|
||||||
|
{
|
||||||
|
// Rotation axis
|
||||||
|
Vector3 forward = GetCameraForward(camera);
|
||||||
|
|
||||||
|
// Rotate up direction around forward axis
|
||||||
|
camera->up = Vector3RotateByAxisAngle(camera->up, forward, angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the camera view matrix
|
||||||
|
Matrix GetCameraViewMatrix(Camera *camera)
|
||||||
|
{
|
||||||
|
return MatrixLookAt(camera->position, camera->target, camera->up);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the camera projection matrix
|
||||||
|
Matrix GetCameraProjectionMatrix(Camera *camera, float aspect)
|
||||||
|
{
|
||||||
|
if (camera->projection == CAMERA_PERSPECTIVE)
|
||||||
|
{
|
||||||
|
return MatrixPerspective(camera->fovy*DEG2RAD, aspect, CAMERA_CULL_DISTANCE_NEAR, CAMERA_CULL_DISTANCE_FAR);
|
||||||
|
}
|
||||||
|
else if (camera->projection == CAMERA_ORTHOGRAPHIC)
|
||||||
|
{
|
||||||
|
double top = camera->fovy/2.0;
|
||||||
|
double right = top*aspect;
|
||||||
|
|
||||||
|
return MatrixOrtho(-right, right, -top, top, CAMERA_CULL_DISTANCE_NEAR, CAMERA_CULL_DISTANCE_FAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return MatrixIdentity();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(RCAMERA_STANDALONE)
|
||||||
|
// Update camera position for selected mode
|
||||||
|
// Camera mode: CAMERA_FREE, CAMERA_FIRST_PERSON, CAMERA_THIRD_PERSON, CAMERA_ORBITAL or CUSTOM
|
||||||
|
void UpdateCamera(Camera *camera, int mode)
|
||||||
|
{
|
||||||
|
Vector2 mousePositionDelta = GetMouseDelta();
|
||||||
|
|
||||||
|
bool moveInWorldPlane = ((mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON));
|
||||||
|
bool rotateAroundTarget = ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL));
|
||||||
|
bool lockView = ((mode == CAMERA_FIRST_PERSON) || (mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL));
|
||||||
|
bool rotateUp = false;
|
||||||
|
|
||||||
|
if (mode == CAMERA_ORBITAL)
|
||||||
|
{
|
||||||
|
// Orbital can just orbit
|
||||||
|
Matrix rotation = MatrixRotate(GetCameraUp(camera), CAMERA_ORBITAL_SPEED*GetFrameTime());
|
||||||
|
Vector3 view = Vector3Subtract(camera->position, camera->target);
|
||||||
|
view = Vector3Transform(view, rotation);
|
||||||
|
camera->position = Vector3Add(camera->target, view);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Camera rotation
|
||||||
|
if (IsKeyDown(KEY_DOWN)) CameraPitch(camera, -CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp);
|
||||||
|
if (IsKeyDown(KEY_UP)) CameraPitch(camera, CAMERA_ROTATION_SPEED, lockView, rotateAroundTarget, rotateUp);
|
||||||
|
if (IsKeyDown(KEY_RIGHT)) CameraYaw(camera, -CAMERA_ROTATION_SPEED, rotateAroundTarget);
|
||||||
|
if (IsKeyDown(KEY_LEFT)) CameraYaw(camera, CAMERA_ROTATION_SPEED, rotateAroundTarget);
|
||||||
|
if (IsKeyDown(KEY_Q)) CameraRoll(camera, -CAMERA_ROTATION_SPEED);
|
||||||
|
if (IsKeyDown(KEY_E)) CameraRoll(camera, CAMERA_ROTATION_SPEED);
|
||||||
|
|
||||||
|
// Camera movement
|
||||||
|
if (!IsGamepadAvailable(0))
|
||||||
|
{
|
||||||
|
// Camera pan (for CAMERA_FREE)
|
||||||
|
if ((mode == CAMERA_FREE) && (IsMouseButtonDown(MOUSE_BUTTON_MIDDLE)))
|
||||||
|
{
|
||||||
|
const Vector2 mouseDelta = GetMouseDelta();
|
||||||
|
if (mouseDelta.x > 0.0f) CameraMoveRight(camera, CAMERA_PAN_SPEED, moveInWorldPlane);
|
||||||
|
if (mouseDelta.x < 0.0f) CameraMoveRight(camera, -CAMERA_PAN_SPEED, moveInWorldPlane);
|
||||||
|
if (mouseDelta.y > 0.0f) CameraMoveUp(camera, -CAMERA_PAN_SPEED);
|
||||||
|
if (mouseDelta.y < 0.0f) CameraMoveUp(camera, CAMERA_PAN_SPEED);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Mouse support
|
||||||
|
CameraYaw(camera, -mousePositionDelta.x*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget);
|
||||||
|
CameraPitch(camera, -mousePositionDelta.y*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keyboard support
|
||||||
|
if (IsKeyDown(KEY_W)) CameraMoveForward(camera, CAMERA_MOVE_SPEED, moveInWorldPlane);
|
||||||
|
if (IsKeyDown(KEY_A)) CameraMoveRight(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane);
|
||||||
|
if (IsKeyDown(KEY_S)) CameraMoveForward(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane);
|
||||||
|
if (IsKeyDown(KEY_D)) CameraMoveRight(camera, CAMERA_MOVE_SPEED, moveInWorldPlane);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Gamepad controller support
|
||||||
|
CameraYaw(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_X) * 2)*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget);
|
||||||
|
CameraPitch(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_Y) * 2)*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp);
|
||||||
|
|
||||||
|
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) <= -0.25f) CameraMoveForward(camera, CAMERA_MOVE_SPEED, moveInWorldPlane);
|
||||||
|
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) <= -0.25f) CameraMoveRight(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane);
|
||||||
|
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) >= 0.25f) CameraMoveForward(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane);
|
||||||
|
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) >= 0.25f) CameraMoveRight(camera, CAMERA_MOVE_SPEED, moveInWorldPlane);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode == CAMERA_FREE)
|
||||||
|
{
|
||||||
|
if (IsKeyDown(KEY_SPACE)) CameraMoveUp(camera, CAMERA_MOVE_SPEED);
|
||||||
|
if (IsKeyDown(KEY_LEFT_CONTROL)) CameraMoveUp(camera, -CAMERA_MOVE_SPEED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mode == CAMERA_THIRD_PERSON) || (mode == CAMERA_ORBITAL) || (mode == CAMERA_FREE))
|
||||||
|
{
|
||||||
|
// Zoom target distance
|
||||||
|
CameraMoveToTarget(camera, -GetMouseWheelMove());
|
||||||
|
if (IsKeyPressed(KEY_KP_SUBTRACT)) CameraMoveToTarget(camera, 2.0f);
|
||||||
|
if (IsKeyPressed(KEY_KP_ADD)) CameraMoveToTarget(camera, -2.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // !RCAMERA_STANDALONE
|
||||||
|
|
||||||
|
// Update camera movement, movement/rotation values should be provided by user
|
||||||
|
void UpdateCameraPro(Camera *camera, Vector3 movement, Vector3 rotation, float zoom)
|
||||||
|
{
|
||||||
|
// Required values
|
||||||
|
// movement.x - Move forward/backward
|
||||||
|
// movement.y - Move right/left
|
||||||
|
// movement.z - Move up/down
|
||||||
|
// rotation.x - yaw
|
||||||
|
// rotation.y - pitch
|
||||||
|
// rotation.z - roll
|
||||||
|
// zoom - Move towards target
|
||||||
|
|
||||||
|
bool lockView = true;
|
||||||
|
bool rotateAroundTarget = false;
|
||||||
|
bool rotateUp = false;
|
||||||
|
bool moveInWorldPlane = true;
|
||||||
|
|
||||||
|
// Camera rotation
|
||||||
|
CameraPitch(camera, -rotation.y*DEG2RAD, lockView, rotateAroundTarget, rotateUp);
|
||||||
|
CameraYaw(camera, -rotation.x*DEG2RAD, rotateAroundTarget);
|
||||||
|
CameraRoll(camera, rotation.z*DEG2RAD);
|
||||||
|
|
||||||
|
// Camera movement
|
||||||
|
CameraMoveForward(camera, movement.x, moveInWorldPlane);
|
||||||
|
CameraMoveRight(camera, movement.y, moveInWorldPlane);
|
||||||
|
CameraMoveUp(camera, movement.z);
|
||||||
|
|
||||||
|
// Zoom target distance
|
||||||
|
CameraMoveToTarget(camera, zoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RCAMERA_IMPLEMENTATION
|
209
project/auxillary/vis_ast/dependencies/raylib/include/rcore.h
Normal file
209
project/auxillary/vis_ast/dependencies/raylib/include/rcore.h
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
/**********************************************************************************************
|
||||||
|
*
|
||||||
|
* rcore - Common types and globals (all platforms)
|
||||||
|
*
|
||||||
|
* LIMITATIONS:
|
||||||
|
* - Limitation 01
|
||||||
|
* - Limitation 02
|
||||||
|
*
|
||||||
|
* POSSIBLE IMPROVEMENTS:
|
||||||
|
* - Improvement 01
|
||||||
|
* - Improvement 02
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* LICENSE: zlib/libpng
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2023 Ramon Santamaria (@raysan5) and contributors
|
||||||
|
*
|
||||||
|
* This software is provided "as-is", without any express or implied warranty. In no event
|
||||||
|
* will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose, including commercial
|
||||||
|
* applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not claim that you
|
||||||
|
* wrote the original software. If you use this software in a product, an acknowledgment
|
||||||
|
* in the product documentation would be appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
||||||
|
* as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
**********************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef RCORE_H
|
||||||
|
#define RCORE_H
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#include "utils.h" // Required for: TRACELOG() macros
|
||||||
|
|
||||||
|
#include "rlgl.h" // Required for: graphics layer functionality
|
||||||
|
|
||||||
|
#define RAYMATH_IMPLEMENTATION
|
||||||
|
#include "raymath.h" // Required for: Vector2/Vector3/Matrix functionality
|
||||||
|
|
||||||
|
#include <stdlib.h> // Required for: srand(), rand(), atexit()
|
||||||
|
#include <stdio.h> // Required for: sprintf() [Used in OpenURL()]
|
||||||
|
#include <string.h> // Required for: strrchr(), strcmp(), strlen(), memset()
|
||||||
|
#include <time.h> // Required for: time() [Used in InitTimer()]
|
||||||
|
#include <math.h> // Required for: tan() [Used in BeginMode3D()], atan2f() [Used in LoadVrStereoConfig()]
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Defines and Macros
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
#ifndef MAX_FILEPATH_CAPACITY
|
||||||
|
#define MAX_FILEPATH_CAPACITY 8192 // Maximum capacity for filepath
|
||||||
|
#endif
|
||||||
|
#ifndef MAX_FILEPATH_LENGTH
|
||||||
|
#define MAX_FILEPATH_LENGTH 4096 // Maximum length for filepaths (Linux PATH_MAX default value)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAX_KEYBOARD_KEYS
|
||||||
|
#define MAX_KEYBOARD_KEYS 512 // Maximum number of keyboard keys supported
|
||||||
|
#endif
|
||||||
|
#ifndef MAX_MOUSE_BUTTONS
|
||||||
|
#define MAX_MOUSE_BUTTONS 8 // Maximum number of mouse buttons supported
|
||||||
|
#endif
|
||||||
|
#ifndef MAX_GAMEPADS
|
||||||
|
#define MAX_GAMEPADS 4 // Maximum number of gamepads supported
|
||||||
|
#endif
|
||||||
|
#ifndef MAX_GAMEPAD_AXIS
|
||||||
|
#define MAX_GAMEPAD_AXIS 8 // Maximum number of axis supported (per gamepad)
|
||||||
|
#endif
|
||||||
|
#ifndef MAX_GAMEPAD_BUTTONS
|
||||||
|
#define MAX_GAMEPAD_BUTTONS 32 // Maximum number of buttons supported (per gamepad)
|
||||||
|
#endif
|
||||||
|
#ifndef MAX_TOUCH_POINTS
|
||||||
|
#define MAX_TOUCH_POINTS 8 // Maximum number of touch points supported
|
||||||
|
#endif
|
||||||
|
#ifndef MAX_KEY_PRESSED_QUEUE
|
||||||
|
#define MAX_KEY_PRESSED_QUEUE 16 // Maximum number of keys in the key input queue
|
||||||
|
#endif
|
||||||
|
#ifndef MAX_CHAR_PRESSED_QUEUE
|
||||||
|
#define MAX_CHAR_PRESSED_QUEUE 16 // Maximum number of characters in the char input queue
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAX_DECOMPRESSION_SIZE
|
||||||
|
#define MAX_DECOMPRESSION_SIZE 64 // Maximum size allocated for decompression in MB
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Flags operation macros
|
||||||
|
#define FLAG_SET(n, f) ((n) |= (f))
|
||||||
|
#define FLAG_CLEAR(n, f) ((n) &= ~(f))
|
||||||
|
#define FLAG_TOGGLE(n, f) ((n) ^= (f))
|
||||||
|
#define FLAG_CHECK(n, f) ((n) & (f))
|
||||||
|
|
||||||
|
#if (defined(__linux__) || defined(PLATFORM_WEB)) && (_POSIX_C_SOURCE < 199309L)
|
||||||
|
#undef _POSIX_C_SOURCE
|
||||||
|
#define _POSIX_C_SOURCE 199309L // Required for: CLOCK_MONOTONIC if compiled with c99 without gnu ext.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
typedef struct { int x; int y; } Point;
|
||||||
|
typedef struct { unsigned int width; unsigned int height; } Size;
|
||||||
|
|
||||||
|
// Core global state context data
|
||||||
|
typedef struct CoreData {
|
||||||
|
struct {
|
||||||
|
const char *title; // Window text title const pointer
|
||||||
|
unsigned int flags; // Configuration flags (bit based), keeps window state
|
||||||
|
bool ready; // Check if window has been initialized successfully
|
||||||
|
bool fullscreen; // Check if fullscreen mode is enabled
|
||||||
|
bool shouldClose; // Check if window set for closing
|
||||||
|
bool resizedLastFrame; // Check if window has been resized last frame
|
||||||
|
bool eventWaiting; // Wait for events before ending frame
|
||||||
|
|
||||||
|
Point position; // Window position (required on fullscreen toggle)
|
||||||
|
Point previousPosition; // Window previous position (required on borderless windowed toggle)
|
||||||
|
Size display; // Display width and height (monitor, device-screen, LCD, ...)
|
||||||
|
Size screen; // Screen width and height (used render area)
|
||||||
|
Size previousScreen; // Screen previous width and height (required on borderless windowed toggle)
|
||||||
|
Size currentFbo; // Current render width and height (depends on active fbo)
|
||||||
|
Size render; // Framebuffer width and height (render area, including black bars if required)
|
||||||
|
Point renderOffset; // Offset from render area (must be divided by 2)
|
||||||
|
Size screenMin; // Screen minimum width and height (for resizable window)
|
||||||
|
Size screenMax; // Screen maximum width and height (for resizable window)
|
||||||
|
Matrix screenScale; // Matrix to scale screen (framebuffer rendering)
|
||||||
|
|
||||||
|
char **dropFilepaths; // Store dropped files paths pointers (provided by GLFW)
|
||||||
|
unsigned int dropFileCount; // Count dropped files strings
|
||||||
|
|
||||||
|
} Window;
|
||||||
|
struct {
|
||||||
|
const char *basePath; // Base path for data storage
|
||||||
|
|
||||||
|
} Storage;
|
||||||
|
struct {
|
||||||
|
struct {
|
||||||
|
int exitKey; // Default exit key
|
||||||
|
char currentKeyState[MAX_KEYBOARD_KEYS]; // Registers current frame key state
|
||||||
|
char previousKeyState[MAX_KEYBOARD_KEYS]; // Registers previous frame key state
|
||||||
|
|
||||||
|
// NOTE: Since key press logic involves comparing prev vs cur key state, we need to handle key repeats specially
|
||||||
|
char keyRepeatInFrame[MAX_KEYBOARD_KEYS]; // Registers key repeats for current frame.
|
||||||
|
|
||||||
|
int keyPressedQueue[MAX_KEY_PRESSED_QUEUE]; // Input keys queue
|
||||||
|
int keyPressedQueueCount; // Input keys queue count
|
||||||
|
|
||||||
|
int charPressedQueue[MAX_CHAR_PRESSED_QUEUE]; // Input characters queue (unicode)
|
||||||
|
int charPressedQueueCount; // Input characters queue count
|
||||||
|
|
||||||
|
} Keyboard;
|
||||||
|
struct {
|
||||||
|
Vector2 offset; // Mouse offset
|
||||||
|
Vector2 scale; // Mouse scaling
|
||||||
|
Vector2 currentPosition; // Mouse position on screen
|
||||||
|
Vector2 previousPosition; // Previous mouse position
|
||||||
|
|
||||||
|
int cursor; // Tracks current mouse cursor
|
||||||
|
bool cursorHidden; // Track if cursor is hidden
|
||||||
|
bool cursorOnScreen; // Tracks if cursor is inside client area
|
||||||
|
|
||||||
|
char currentButtonState[MAX_MOUSE_BUTTONS]; // Registers current mouse button state
|
||||||
|
char previousButtonState[MAX_MOUSE_BUTTONS]; // Registers previous mouse button state
|
||||||
|
Vector2 currentWheelMove; // Registers current mouse wheel variation
|
||||||
|
Vector2 previousWheelMove; // Registers previous mouse wheel variation
|
||||||
|
|
||||||
|
} Mouse;
|
||||||
|
struct {
|
||||||
|
int pointCount; // Number of touch points active
|
||||||
|
int pointId[MAX_TOUCH_POINTS]; // Point identifiers
|
||||||
|
Vector2 position[MAX_TOUCH_POINTS]; // Touch position on screen
|
||||||
|
char currentTouchState[MAX_TOUCH_POINTS]; // Registers current touch state
|
||||||
|
char previousTouchState[MAX_TOUCH_POINTS]; // Registers previous touch state
|
||||||
|
|
||||||
|
} Touch;
|
||||||
|
struct {
|
||||||
|
int lastButtonPressed; // Register last gamepad button pressed
|
||||||
|
int axisCount[MAX_GAMEPADS]; // Register number of available gamepad axis
|
||||||
|
bool ready[MAX_GAMEPADS]; // Flag to know if gamepad is ready
|
||||||
|
char name[MAX_GAMEPADS][64]; // Gamepad name holder
|
||||||
|
char currentButtonState[MAX_GAMEPADS][MAX_GAMEPAD_BUTTONS]; // Current gamepad buttons state
|
||||||
|
char previousButtonState[MAX_GAMEPADS][MAX_GAMEPAD_BUTTONS]; // Previous gamepad buttons state
|
||||||
|
float axisState[MAX_GAMEPADS][MAX_GAMEPAD_AXIS]; // Gamepad axis state
|
||||||
|
|
||||||
|
} Gamepad;
|
||||||
|
} Input;
|
||||||
|
struct {
|
||||||
|
double current; // Current time measure
|
||||||
|
double previous; // Previous time measure
|
||||||
|
double update; // Time measure for frame update
|
||||||
|
double draw; // Time measure for frame draw
|
||||||
|
double frame; // Time measure for one frame
|
||||||
|
double target; // Desired time for one frame, if 0 not applied
|
||||||
|
unsigned long long int base; // Base time measure for hi-res timer (PLATFORM_ANDROID, PLATFORM_DRM)
|
||||||
|
unsigned int frameCounter; // Frame counter
|
||||||
|
|
||||||
|
} Time;
|
||||||
|
} CoreData;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Global Variables Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
extern CoreData CORE;
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,555 @@
|
|||||||
|
/**********************************************************************************************
|
||||||
|
*
|
||||||
|
* rgestures - Gestures system, gestures processing based on input events (touch/mouse)
|
||||||
|
*
|
||||||
|
* CONFIGURATION:
|
||||||
|
* #define RGESTURES_IMPLEMENTATION
|
||||||
|
* Generates the implementation of the library into the included file.
|
||||||
|
* If not defined, the library is in header only mode and can be included in other headers
|
||||||
|
* or source files without problems. But only ONE file should hold the implementation.
|
||||||
|
*
|
||||||
|
* #define RGESTURES_STANDALONE
|
||||||
|
* If defined, the library can be used as standalone to process gesture events with
|
||||||
|
* no external dependencies.
|
||||||
|
*
|
||||||
|
* CONTRIBUTORS:
|
||||||
|
* Marc Palau: Initial implementation (2014)
|
||||||
|
* Albert Martos: Complete redesign and testing (2015)
|
||||||
|
* Ian Eito: Complete redesign and testing (2015)
|
||||||
|
* Ramon Santamaria: Supervision, review, update and maintenance
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* LICENSE: zlib/libpng
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2023 Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* This software is provided "as-is", without any express or implied warranty. In no event
|
||||||
|
* will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose, including commercial
|
||||||
|
* applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not claim that you
|
||||||
|
* wrote the original software. If you use this software in a product, an acknowledgment
|
||||||
|
* in the product documentation would be appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
||||||
|
* as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
**********************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef RGESTURES_H
|
||||||
|
#define RGESTURES_H
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI 3.14159265358979323846
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Defines and Macros
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
#ifndef MAX_TOUCH_POINTS
|
||||||
|
#define MAX_TOUCH_POINTS 8 // Maximum number of touch points supported
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
// NOTE: Below types are required for standalone usage
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Boolean type
|
||||||
|
#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
|
||||||
|
#include <stdbool.h>
|
||||||
|
#elif !defined(__cplusplus) && !defined(bool) && !defined(RL_BOOL_TYPE)
|
||||||
|
typedef enum bool { false = 0, true = !false } bool;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(RL_VECTOR2_TYPE)
|
||||||
|
// Vector2 type
|
||||||
|
typedef struct Vector2 {
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
} Vector2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(RGESTURES_STANDALONE)
|
||||||
|
// Gestures type
|
||||||
|
// NOTE: It could be used as flags to enable only some gestures
|
||||||
|
typedef enum {
|
||||||
|
GESTURE_NONE = 0,
|
||||||
|
GESTURE_TAP = 1,
|
||||||
|
GESTURE_DOUBLETAP = 2,
|
||||||
|
GESTURE_HOLD = 4,
|
||||||
|
GESTURE_DRAG = 8,
|
||||||
|
GESTURE_SWIPE_RIGHT = 16,
|
||||||
|
GESTURE_SWIPE_LEFT = 32,
|
||||||
|
GESTURE_SWIPE_UP = 64,
|
||||||
|
GESTURE_SWIPE_DOWN = 128,
|
||||||
|
GESTURE_PINCH_IN = 256,
|
||||||
|
GESTURE_PINCH_OUT = 512
|
||||||
|
} Gesture;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TOUCH_ACTION_UP = 0,
|
||||||
|
TOUCH_ACTION_DOWN,
|
||||||
|
TOUCH_ACTION_MOVE,
|
||||||
|
TOUCH_ACTION_CANCEL
|
||||||
|
} TouchAction;
|
||||||
|
|
||||||
|
// Gesture event
|
||||||
|
typedef struct {
|
||||||
|
int touchAction;
|
||||||
|
int pointCount;
|
||||||
|
int pointId[MAX_TOUCH_POINTS];
|
||||||
|
Vector2 position[MAX_TOUCH_POINTS];
|
||||||
|
} GestureEvent;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Global Variables Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
//...
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" { // Prevents name mangling of functions
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ProcessGestureEvent(GestureEvent event); // Process gesture event and translate it into gestures
|
||||||
|
void UpdateGestures(void); // Update gestures detected (must be called every frame)
|
||||||
|
|
||||||
|
#if defined(RGESTURES_STANDALONE)
|
||||||
|
void SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags
|
||||||
|
bool IsGestureDetected(int gesture); // Check if a gesture have been detected
|
||||||
|
int GetGestureDetected(void); // Get latest detected gesture
|
||||||
|
|
||||||
|
float GetGestureHoldDuration(void); // Get gesture hold time in seconds
|
||||||
|
Vector2 GetGestureDragVector(void); // Get gesture drag vector
|
||||||
|
float GetGestureDragAngle(void); // Get gesture drag angle
|
||||||
|
Vector2 GetGesturePinchVector(void); // Get gesture pinch delta
|
||||||
|
float GetGesturePinchAngle(void); // Get gesture pinch angle
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // RGESTURES_H
|
||||||
|
|
||||||
|
/***********************************************************************************
|
||||||
|
*
|
||||||
|
* RGESTURES IMPLEMENTATION
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#if defined(RGESTURES_IMPLEMENTATION)
|
||||||
|
|
||||||
|
#if defined(RGESTURES_STANDALONE)
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" { // Prevents name mangling of functions
|
||||||
|
#endif
|
||||||
|
// Functions required to query time on Windows
|
||||||
|
int __stdcall QueryPerformanceCounter(unsigned long long int *lpPerformanceCount);
|
||||||
|
int __stdcall QueryPerformanceFrequency(unsigned long long int *lpFrequency);
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#elif defined(__linux__)
|
||||||
|
#if _POSIX_C_SOURCE < 199309L
|
||||||
|
#undef _POSIX_C_SOURCE
|
||||||
|
#define _POSIX_C_SOURCE 199309L // Required for CLOCK_MONOTONIC if compiled with c99 without gnu ext.
|
||||||
|
#endif
|
||||||
|
#include <sys/time.h> // Required for: timespec
|
||||||
|
#include <time.h> // Required for: clock_gettime()
|
||||||
|
|
||||||
|
#include <math.h> // Required for: sqrtf(), atan2f()
|
||||||
|
#endif
|
||||||
|
#if defined(__APPLE__) // macOS also defines __MACH__
|
||||||
|
#include <mach/clock.h> // Required for: clock_get_time()
|
||||||
|
#include <mach/mach.h> // Required for: mach_timespec_t
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Defines and Macros
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
#define FORCE_TO_SWIPE 0.2f // Swipe force, measured in normalized screen units/time
|
||||||
|
#define MINIMUM_DRAG 0.015f // Drag minimum force, measured in normalized screen units (0.0f to 1.0f)
|
||||||
|
#define DRAG_TIMEOUT 0.3f // Drag minimum time for web, measured in seconds
|
||||||
|
#define MINIMUM_PINCH 0.005f // Pinch minimum force, measured in normalized screen units (0.0f to 1.0f)
|
||||||
|
#define TAP_TIMEOUT 0.3f // Tap minimum time, measured in seconds
|
||||||
|
#define PINCH_TIMEOUT 0.3f // Pinch minimum time, measured in seconds
|
||||||
|
#define DOUBLETAP_RANGE 0.03f // DoubleTap range, measured in normalized screen units (0.0f to 1.0f)
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Gestures module state context [136 bytes]
|
||||||
|
typedef struct {
|
||||||
|
unsigned int current; // Current detected gesture
|
||||||
|
unsigned int enabledFlags; // Enabled gestures flags
|
||||||
|
struct {
|
||||||
|
int firstId; // Touch id for first touch point
|
||||||
|
int pointCount; // Touch points counter
|
||||||
|
double eventTime; // Time stamp when an event happened
|
||||||
|
Vector2 upPosition; // Touch up position
|
||||||
|
Vector2 downPositionA; // First touch down position
|
||||||
|
Vector2 downPositionB; // Second touch down position
|
||||||
|
Vector2 downDragPosition; // Touch drag position
|
||||||
|
Vector2 moveDownPositionA; // First touch down position on move
|
||||||
|
Vector2 moveDownPositionB; // Second touch down position on move
|
||||||
|
Vector2 previousPositionA; // Previous position A to compare for pinch gestures
|
||||||
|
Vector2 previousPositionB; // Previous position B to compare for pinch gestures
|
||||||
|
int tapCounter; // TAP counter (one tap implies TOUCH_ACTION_DOWN and TOUCH_ACTION_UP actions)
|
||||||
|
} Touch;
|
||||||
|
struct {
|
||||||
|
bool resetRequired; // HOLD reset to get first touch point again
|
||||||
|
double timeDuration; // HOLD duration in seconds
|
||||||
|
} Hold;
|
||||||
|
struct {
|
||||||
|
Vector2 vector; // DRAG vector (between initial and current position)
|
||||||
|
float angle; // DRAG angle (relative to x-axis)
|
||||||
|
float distance; // DRAG distance (from initial touch point to final) (normalized [0..1])
|
||||||
|
float intensity; // DRAG intensity, how far why did the DRAG (pixels per frame)
|
||||||
|
} Drag;
|
||||||
|
struct {
|
||||||
|
double startTime; // SWIPE start time to calculate drag intensity
|
||||||
|
} Swipe;
|
||||||
|
struct {
|
||||||
|
Vector2 vector; // PINCH vector (between first and second touch points)
|
||||||
|
float angle; // PINCH angle (relative to x-axis)
|
||||||
|
float distance; // PINCH displacement distance (normalized [0..1])
|
||||||
|
} Pinch;
|
||||||
|
} GesturesData;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Global Variables Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
static GesturesData GESTURES = {
|
||||||
|
.Touch.firstId = -1,
|
||||||
|
.current = GESTURE_NONE, // No current gesture detected
|
||||||
|
.enabledFlags = 0b0000001111111111 // All gestures supported by default
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module specific Functions Declaration
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
static float rgVector2Angle(Vector2 initialPosition, Vector2 finalPosition);
|
||||||
|
static float rgVector2Distance(Vector2 v1, Vector2 v2);
|
||||||
|
static double rgGetCurrentTime(void);
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Enable only desired gestures to be detected
|
||||||
|
void SetGesturesEnabled(unsigned int flags)
|
||||||
|
{
|
||||||
|
GESTURES.enabledFlags = flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if a gesture have been detected
|
||||||
|
bool IsGestureDetected(unsigned int gesture)
|
||||||
|
{
|
||||||
|
if ((GESTURES.enabledFlags & GESTURES.current) == gesture) return true;
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process gesture event and translate it into gestures
|
||||||
|
void ProcessGestureEvent(GestureEvent event)
|
||||||
|
{
|
||||||
|
// Reset required variables
|
||||||
|
GESTURES.Touch.pointCount = event.pointCount; // Required on UpdateGestures()
|
||||||
|
|
||||||
|
if (GESTURES.Touch.pointCount == 1) // One touch point
|
||||||
|
{
|
||||||
|
if (event.touchAction == TOUCH_ACTION_DOWN)
|
||||||
|
{
|
||||||
|
GESTURES.Touch.tapCounter++; // Tap counter
|
||||||
|
|
||||||
|
// Detect GESTURE_DOUBLE_TAP
|
||||||
|
if ((GESTURES.current == GESTURE_NONE) && (GESTURES.Touch.tapCounter >= 2) && ((rgGetCurrentTime() - GESTURES.Touch.eventTime) < TAP_TIMEOUT) && (rgVector2Distance(GESTURES.Touch.downPositionA, event.position[0]) < DOUBLETAP_RANGE))
|
||||||
|
{
|
||||||
|
GESTURES.current = GESTURE_DOUBLETAP;
|
||||||
|
GESTURES.Touch.tapCounter = 0;
|
||||||
|
}
|
||||||
|
else // Detect GESTURE_TAP
|
||||||
|
{
|
||||||
|
GESTURES.Touch.tapCounter = 1;
|
||||||
|
GESTURES.current = GESTURE_TAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
GESTURES.Touch.downPositionA = event.position[0];
|
||||||
|
GESTURES.Touch.downDragPosition = event.position[0];
|
||||||
|
|
||||||
|
GESTURES.Touch.upPosition = GESTURES.Touch.downPositionA;
|
||||||
|
GESTURES.Touch.eventTime = rgGetCurrentTime();
|
||||||
|
|
||||||
|
GESTURES.Swipe.startTime = rgGetCurrentTime();
|
||||||
|
|
||||||
|
GESTURES.Drag.vector = (Vector2){ 0.0f, 0.0f };
|
||||||
|
}
|
||||||
|
else if (event.touchAction == TOUCH_ACTION_UP)
|
||||||
|
{
|
||||||
|
// A swipe can happen while the current gesture is drag, but (specially for web) also hold, so set upPosition for both cases
|
||||||
|
if (GESTURES.current == GESTURE_DRAG || GESTURES.current == GESTURE_HOLD) GESTURES.Touch.upPosition = event.position[0];
|
||||||
|
|
||||||
|
// NOTE: GESTURES.Drag.intensity dependent on the resolution of the screen
|
||||||
|
GESTURES.Drag.distance = rgVector2Distance(GESTURES.Touch.downPositionA, GESTURES.Touch.upPosition);
|
||||||
|
GESTURES.Drag.intensity = GESTURES.Drag.distance/(float)((rgGetCurrentTime() - GESTURES.Swipe.startTime));
|
||||||
|
|
||||||
|
// Detect GESTURE_SWIPE
|
||||||
|
if ((GESTURES.Drag.intensity > FORCE_TO_SWIPE) && (GESTURES.current != GESTURE_DRAG))
|
||||||
|
{
|
||||||
|
// NOTE: Angle should be inverted in Y
|
||||||
|
GESTURES.Drag.angle = 360.0f - rgVector2Angle(GESTURES.Touch.downPositionA, GESTURES.Touch.upPosition);
|
||||||
|
|
||||||
|
if ((GESTURES.Drag.angle < 30) || (GESTURES.Drag.angle > 330)) GESTURES.current = GESTURE_SWIPE_RIGHT; // Right
|
||||||
|
else if ((GESTURES.Drag.angle >= 30) && (GESTURES.Drag.angle <= 150)) GESTURES.current = GESTURE_SWIPE_UP; // Up
|
||||||
|
else if ((GESTURES.Drag.angle > 150) && (GESTURES.Drag.angle < 210)) GESTURES.current = GESTURE_SWIPE_LEFT; // Left
|
||||||
|
else if ((GESTURES.Drag.angle >= 210) && (GESTURES.Drag.angle <= 330)) GESTURES.current = GESTURE_SWIPE_DOWN; // Down
|
||||||
|
else GESTURES.current = GESTURE_NONE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GESTURES.Drag.distance = 0.0f;
|
||||||
|
GESTURES.Drag.intensity = 0.0f;
|
||||||
|
GESTURES.Drag.angle = 0.0f;
|
||||||
|
|
||||||
|
GESTURES.current = GESTURE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GESTURES.Touch.downDragPosition = (Vector2){ 0.0f, 0.0f };
|
||||||
|
GESTURES.Touch.pointCount = 0;
|
||||||
|
}
|
||||||
|
else if (event.touchAction == TOUCH_ACTION_MOVE)
|
||||||
|
{
|
||||||
|
GESTURES.Touch.moveDownPositionA = event.position[0];
|
||||||
|
|
||||||
|
if (GESTURES.current == GESTURE_HOLD)
|
||||||
|
{
|
||||||
|
if (GESTURES.Hold.resetRequired) GESTURES.Touch.downPositionA = event.position[0];
|
||||||
|
|
||||||
|
GESTURES.Hold.resetRequired = false;
|
||||||
|
|
||||||
|
// Detect GESTURE_DRAG
|
||||||
|
if ((rgGetCurrentTime() - GESTURES.Touch.eventTime) > DRAG_TIMEOUT)
|
||||||
|
{
|
||||||
|
GESTURES.Touch.eventTime = rgGetCurrentTime();
|
||||||
|
GESTURES.current = GESTURE_DRAG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GESTURES.Drag.vector.x = GESTURES.Touch.moveDownPositionA.x - GESTURES.Touch.downDragPosition.x;
|
||||||
|
GESTURES.Drag.vector.y = GESTURES.Touch.moveDownPositionA.y - GESTURES.Touch.downDragPosition.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (GESTURES.Touch.pointCount == 2) // Two touch points
|
||||||
|
{
|
||||||
|
if (event.touchAction == TOUCH_ACTION_DOWN)
|
||||||
|
{
|
||||||
|
GESTURES.Touch.downPositionA = event.position[0];
|
||||||
|
GESTURES.Touch.downPositionB = event.position[1];
|
||||||
|
|
||||||
|
GESTURES.Touch.previousPositionA = GESTURES.Touch.downPositionA;
|
||||||
|
GESTURES.Touch.previousPositionB = GESTURES.Touch.downPositionB;
|
||||||
|
|
||||||
|
//GESTURES.Pinch.distance = rgVector2Distance(GESTURES.Touch.downPositionA, GESTURES.Touch.downPositionB);
|
||||||
|
|
||||||
|
GESTURES.Pinch.vector.x = GESTURES.Touch.downPositionB.x - GESTURES.Touch.downPositionA.x;
|
||||||
|
GESTURES.Pinch.vector.y = GESTURES.Touch.downPositionB.y - GESTURES.Touch.downPositionA.y;
|
||||||
|
|
||||||
|
GESTURES.current = GESTURE_HOLD;
|
||||||
|
GESTURES.Hold.timeDuration = rgGetCurrentTime();
|
||||||
|
}
|
||||||
|
else if (event.touchAction == TOUCH_ACTION_MOVE)
|
||||||
|
{
|
||||||
|
GESTURES.Pinch.distance = rgVector2Distance(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB);
|
||||||
|
|
||||||
|
GESTURES.Touch.moveDownPositionA = event.position[0];
|
||||||
|
GESTURES.Touch.moveDownPositionB = event.position[1];
|
||||||
|
|
||||||
|
GESTURES.Pinch.vector.x = GESTURES.Touch.moveDownPositionB.x - GESTURES.Touch.moveDownPositionA.x;
|
||||||
|
GESTURES.Pinch.vector.y = GESTURES.Touch.moveDownPositionB.y - GESTURES.Touch.moveDownPositionA.y;
|
||||||
|
|
||||||
|
if ((rgVector2Distance(GESTURES.Touch.previousPositionA, GESTURES.Touch.moveDownPositionA) >= MINIMUM_PINCH) || (rgVector2Distance(GESTURES.Touch.previousPositionB, GESTURES.Touch.moveDownPositionB) >= MINIMUM_PINCH))
|
||||||
|
{
|
||||||
|
if ( rgVector2Distance(GESTURES.Touch.previousPositionA, GESTURES.Touch.previousPositionB) > rgVector2Distance(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB) ) GESTURES.current = GESTURE_PINCH_IN;
|
||||||
|
else GESTURES.current = GESTURE_PINCH_OUT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GESTURES.current = GESTURE_HOLD;
|
||||||
|
GESTURES.Hold.timeDuration = rgGetCurrentTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: Angle should be inverted in Y
|
||||||
|
GESTURES.Pinch.angle = 360.0f - rgVector2Angle(GESTURES.Touch.moveDownPositionA, GESTURES.Touch.moveDownPositionB);
|
||||||
|
}
|
||||||
|
else if (event.touchAction == TOUCH_ACTION_UP)
|
||||||
|
{
|
||||||
|
GESTURES.Pinch.distance = 0.0f;
|
||||||
|
GESTURES.Pinch.angle = 0.0f;
|
||||||
|
GESTURES.Pinch.vector = (Vector2){ 0.0f, 0.0f };
|
||||||
|
GESTURES.Touch.pointCount = 0;
|
||||||
|
|
||||||
|
GESTURES.current = GESTURE_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (GESTURES.Touch.pointCount > 2) // More than two touch points
|
||||||
|
{
|
||||||
|
// TODO: Process gesture events for more than two points
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update gestures detected (must be called every frame)
|
||||||
|
void UpdateGestures(void)
|
||||||
|
{
|
||||||
|
// NOTE: Gestures are processed through system callbacks on touch events
|
||||||
|
|
||||||
|
// Detect GESTURE_HOLD
|
||||||
|
if (((GESTURES.current == GESTURE_TAP) || (GESTURES.current == GESTURE_DOUBLETAP)) && (GESTURES.Touch.pointCount < 2))
|
||||||
|
{
|
||||||
|
GESTURES.current = GESTURE_HOLD;
|
||||||
|
GESTURES.Hold.timeDuration = rgGetCurrentTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect GESTURE_NONE
|
||||||
|
if ((GESTURES.current == GESTURE_SWIPE_RIGHT) || (GESTURES.current == GESTURE_SWIPE_UP) || (GESTURES.current == GESTURE_SWIPE_LEFT) || (GESTURES.current == GESTURE_SWIPE_DOWN))
|
||||||
|
{
|
||||||
|
GESTURES.current = GESTURE_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get latest detected gesture
|
||||||
|
int GetGestureDetected(void)
|
||||||
|
{
|
||||||
|
// Get current gesture only if enabled
|
||||||
|
return (GESTURES.enabledFlags & GESTURES.current);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hold time measured in ms
|
||||||
|
float GetGestureHoldDuration(void)
|
||||||
|
{
|
||||||
|
// NOTE: time is calculated on current gesture HOLD
|
||||||
|
|
||||||
|
double time = 0.0;
|
||||||
|
|
||||||
|
if (GESTURES.current == GESTURE_HOLD) time = rgGetCurrentTime() - GESTURES.Hold.timeDuration;
|
||||||
|
|
||||||
|
return (float)time;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get drag vector (between initial touch point to current)
|
||||||
|
Vector2 GetGestureDragVector(void)
|
||||||
|
{
|
||||||
|
// NOTE: drag vector is calculated on one touch points TOUCH_ACTION_MOVE
|
||||||
|
|
||||||
|
return GESTURES.Drag.vector;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get drag angle
|
||||||
|
// NOTE: Angle in degrees, horizontal-right is 0, counterclockwise
|
||||||
|
float GetGestureDragAngle(void)
|
||||||
|
{
|
||||||
|
// NOTE: drag angle is calculated on one touch points TOUCH_ACTION_UP
|
||||||
|
|
||||||
|
return GESTURES.Drag.angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get distance between two pinch points
|
||||||
|
Vector2 GetGesturePinchVector(void)
|
||||||
|
{
|
||||||
|
// NOTE: Pinch distance is calculated on two touch points TOUCH_ACTION_MOVE
|
||||||
|
|
||||||
|
return GESTURES.Pinch.vector;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get angle between two pinch points
|
||||||
|
// NOTE: Angle in degrees, horizontal-right is 0, counterclockwise
|
||||||
|
float GetGesturePinchAngle(void)
|
||||||
|
{
|
||||||
|
// NOTE: pinch angle is calculated on two touch points TOUCH_ACTION_MOVE
|
||||||
|
|
||||||
|
return GESTURES.Pinch.angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module specific Functions Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Get angle from two-points vector with X-axis
|
||||||
|
static float rgVector2Angle(Vector2 v1, Vector2 v2)
|
||||||
|
{
|
||||||
|
float angle = atan2f(v2.y - v1.y, v2.x - v1.x)*(180.0f/PI);
|
||||||
|
|
||||||
|
if (angle < 0) angle += 360.0f;
|
||||||
|
|
||||||
|
return angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate distance between two Vector2
|
||||||
|
static float rgVector2Distance(Vector2 v1, Vector2 v2)
|
||||||
|
{
|
||||||
|
float result;
|
||||||
|
|
||||||
|
float dx = v2.x - v1.x;
|
||||||
|
float dy = v2.y - v1.y;
|
||||||
|
|
||||||
|
result = (float)sqrt(dx*dx + dy*dy);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Time measure returned are seconds
|
||||||
|
static double rgGetCurrentTime(void)
|
||||||
|
{
|
||||||
|
double time = 0;
|
||||||
|
|
||||||
|
#if !defined(RGESTURES_STANDALONE)
|
||||||
|
time = GetTime();
|
||||||
|
#else
|
||||||
|
#if defined(_WIN32)
|
||||||
|
unsigned long long int clockFrequency, currentTime;
|
||||||
|
|
||||||
|
QueryPerformanceFrequency(&clockFrequency); // BE CAREFUL: Costly operation!
|
||||||
|
QueryPerformanceCounter(¤tTime);
|
||||||
|
|
||||||
|
time = (double)currentTime/clockFrequency; // Time in seconds
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__linux__)
|
||||||
|
// NOTE: Only for Linux-based systems
|
||||||
|
struct timespec now;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
||||||
|
unsigned long long int nowTime = (unsigned long long int)now.tv_sec*1000000000LLU + (unsigned long long int)now.tv_nsec; // Time in nanoseconds
|
||||||
|
|
||||||
|
time = ((double)nowTime*1e-9); // Time in seconds
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
//#define CLOCK_REALTIME CALENDAR_CLOCK // returns UTC time since 1970-01-01
|
||||||
|
//#define CLOCK_MONOTONIC SYSTEM_CLOCK // returns the time since boot time
|
||||||
|
|
||||||
|
clock_serv_t cclock;
|
||||||
|
mach_timespec_t now;
|
||||||
|
host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock);
|
||||||
|
|
||||||
|
// NOTE: OS X does not have clock_gettime(), using clock_get_time()
|
||||||
|
clock_get_time(cclock, &now);
|
||||||
|
mach_port_deallocate(mach_task_self(), cclock);
|
||||||
|
unsigned long long int nowTime = (unsigned long long int)now.tv_sec*1000000000LLU + (unsigned long long int)now.tv_nsec; // Time in nanoseconds
|
||||||
|
|
||||||
|
time = ((double)nowTime*1e-9); // Time in seconds
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RGESTURES_IMPLEMENTATION
|
4834
project/auxillary/vis_ast/dependencies/raylib/include/rlgl.h
Normal file
4834
project/auxillary/vis_ast/dependencies/raylib/include/rlgl.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,81 @@
|
|||||||
|
/**********************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib.utils - Some common utility functions
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* LICENSE: zlib/libpng
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2023 Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* This software is provided "as-is", without any express or implied warranty. In no event
|
||||||
|
* will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose, including commercial
|
||||||
|
* applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not claim that you
|
||||||
|
* wrote the original software. If you use this software in a product, an acknowledgment
|
||||||
|
* in the product documentation would be appreciated but is not required.
|
||||||
|
*
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
||||||
|
* as being the original software.
|
||||||
|
*
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
**********************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef UTILS_H
|
||||||
|
#define UTILS_H
|
||||||
|
|
||||||
|
#if defined(PLATFORM_ANDROID)
|
||||||
|
#include <stdio.h> // Required for: FILE
|
||||||
|
#include <android/asset_manager.h> // Required for: AAssetManager
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SUPPORT_TRACELOG)
|
||||||
|
#define TRACELOG(level, ...) TraceLog(level, __VA_ARGS__)
|
||||||
|
|
||||||
|
#if defined(SUPPORT_TRACELOG_DEBUG)
|
||||||
|
#define TRACELOGD(...) TraceLog(LOG_DEBUG, __VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define TRACELOGD(...) (void)0
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define TRACELOG(level, ...) (void)0
|
||||||
|
#define TRACELOGD(...) (void)0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Some basic Defines
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
#if defined(PLATFORM_ANDROID)
|
||||||
|
#define fopen(name, mode) android_fopen(name, mode)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
//...
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Global Variables Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Nop...
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" { // Prevents name mangling of functions
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PLATFORM_ANDROID)
|
||||||
|
void InitAssetManager(AAssetManager *manager, const char *dataPath); // Initialize asset manager from android app
|
||||||
|
FILE *android_fopen(const char *fileName, const char *mode); // Replacement for fopen() -> Read-only!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // UTILS_H
|
8
project/auxillary/vis_ast/dependencies/raylib/raylib.c
Normal file
8
project/auxillary/vis_ast/dependencies/raylib/raylib.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include "raudio.c"
|
||||||
|
#include "rcore.c"
|
||||||
|
#include "rglfw.c"
|
||||||
|
#include "rmodels.c"
|
||||||
|
#include "rshapes.c"
|
||||||
|
#include "rtext.c"
|
||||||
|
#include "rtextures.c"
|
||||||
|
#include "rutils.c"
|
@ -1,28 +1,127 @@
|
|||||||
|
Clear-Host
|
||||||
|
|
||||||
$path_root = git rev-parse --show-toplevel
|
$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_project = Join-Path $path_root 'project'
|
||||||
$path_aux = Join-Path $path_project 'auxillary'
|
$path_aux = Join-Path $path_project 'auxillary'
|
||||||
$path_vis_root = Join-Path $path_aux 'vis_ast'
|
$path_vis_root = Join-Path $path_aux 'vis_ast'
|
||||||
$path_binaries = Join-Path $path_vis_root 'binaries'
|
$path_binaries = Join-Path $path_vis_root 'binaries'
|
||||||
$path_build = Join-Path $path_vis_root 'build'
|
|
||||||
$path_code = Join-Path $path_vis_root 'code'
|
|
||||||
$path_win32 = Join-Path $path_code 'win32'
|
|
||||||
|
|
||||||
$path_deps = Join-Path $path_vis_root 'dependencies'
|
$path_deps = Join-Path $path_vis_root 'dependencies'
|
||||||
$path_temp = Join-Path $path_deps 'temp'
|
$path_temp = Join-Path $path_deps 'temp'
|
||||||
|
|
||||||
# Clear out the current content first
|
Import-Module $target_arch
|
||||||
if (Test-Path $path_deps) {
|
Import-Module $format_cpp
|
||||||
Remove-Item $path_deps -Recurse -Force
|
|
||||||
New-Item -ItemType Directory -Path $path_deps
|
#region Arguments
|
||||||
|
$vendor = $null
|
||||||
|
$optimize = $null
|
||||||
|
$debug = $null
|
||||||
|
$analysis = $false
|
||||||
|
$dev = $false
|
||||||
|
$verbose = $null
|
||||||
|
|
||||||
|
[array] $vendors = @( "clang", "msvc" )
|
||||||
|
|
||||||
|
# This is a really lazy way of parsing the args, could use actual params down the line...
|
||||||
|
|
||||||
|
if ( $args ) { $args | ForEach-Object {
|
||||||
|
switch ($_){
|
||||||
|
{ $_ -in $vendors } { $vendor = $_; break }
|
||||||
|
"optimize" { $optimize = $true }
|
||||||
|
"debug" { $debug = $true }
|
||||||
|
"analysis" { $analysis = $true }
|
||||||
|
"dev" { $dev = $true }
|
||||||
|
"verbose" { $verbose = $true }
|
||||||
}
|
}
|
||||||
|
}}
|
||||||
|
#endregion Argument
|
||||||
|
|
||||||
|
# Load up toolchain configuraion
|
||||||
|
. $vendor_toolchain
|
||||||
|
. $incremental_checks
|
||||||
|
|
||||||
|
# Clear out the current content first
|
||||||
|
remove-item $path_temp -Recurse
|
||||||
New-Item -ItemType Directory -Path $path_temp
|
New-Item -ItemType Directory -Path $path_temp
|
||||||
|
|
||||||
if ( -not (Test-Path $path_binaries) ) {
|
if ( -not (Test-Path $path_binaries) ) {
|
||||||
New-Item -ItemType Directory -Path $path_binaries
|
New-Item -ItemType Directory -Path $path_binaries
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setup-raylib {
|
||||||
|
$path_raylib = join-path $path_deps 'raylib'
|
||||||
|
$path_raylib_inc = join-path $path_raylib 'include'
|
||||||
|
$path_raylib_lib = join-path $path_raylib 'lib'
|
||||||
|
if ( test-path $path_raylib_inc ) {
|
||||||
|
remove-item $path_raylib_inc -recurse
|
||||||
|
remove-item $path_raylib_lib -recurse
|
||||||
|
}
|
||||||
|
new-item -path $path_raylib_inc -ItemType Directory
|
||||||
|
new-item -path $path_raylib_lib -ItemType Directory
|
||||||
|
|
||||||
$url_raylib_zip = 'https://github.com/raysan5/raylib/archive/refs/heads/master.zip'
|
$url_raylib_zip = 'https://github.com/raysan5/raylib/archive/refs/heads/master.zip'
|
||||||
$path_raylib_zip = join-path $path_temp 'raylib.zip'
|
$path_raylib_zip = join-path $path_temp 'raylib.zip'
|
||||||
|
|
||||||
invoke-webrequest -uri $url_raylib_zip -outfile $path_raylib_zip
|
invoke-webrequest -uri $url_raylib_zip -outfile $path_raylib_zip
|
||||||
|
expand-archive -path $path_raylib_zip -destinationpath $path_temp
|
||||||
|
|
||||||
|
$path_raylib_master = join-path $path_temp 'raylib-master'
|
||||||
|
$path_raylib_src = join-path $path_raylib_master 'src'
|
||||||
|
$path_raylib_glfw_inc = join-path $path_raylib_src 'external/glfw/include'
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
# 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')
|
||||||
|
)
|
||||||
|
$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
|
||||||
|
|
||||||
|
$raylib_modules = get-childitem -path $path_raylib_src -filter "*.c" -file
|
||||||
|
$build_result = build $path_build $includes $compiler_args $linker_args $raylib_modules $dll
|
||||||
|
|
||||||
|
$raylib_headers = Get-ChildItem -Path $path_raylib_src -Filter "*.h" -File
|
||||||
|
foreach ($header in $raylib_headers) {
|
||||||
|
Copy-Item -Path $header -Destination (join-path $path_raylib_inc (split-path $header -Leaf))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setup-raylib
|
||||||
|
@ -161,22 +161,99 @@ if ( $vendor -match "clang" )
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function build
|
||||||
|
{
|
||||||
|
param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [array]$units, [string]$binary )
|
||||||
|
$result = $false
|
||||||
|
#Write-Host "build: clang"
|
||||||
|
|
||||||
|
$map = $binary -replace '\.(exe|dll)$', '.map'
|
||||||
|
$map = join-path $path_output (split-path $map -Leaf)
|
||||||
|
|
||||||
|
# This allows dll reloads at runtime to work (jankily, use below if not interested)
|
||||||
|
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||||
|
# $pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||||
|
|
||||||
|
$compiler_args += @(
|
||||||
|
$flag_no_color_diagnostics,
|
||||||
|
$flag_exceptions_disabled,
|
||||||
|
$flag_target_arch, $target_arch,
|
||||||
|
$flag_wall,
|
||||||
|
$flag_preprocess_non_intergrated
|
||||||
|
# $flag_section_data,
|
||||||
|
# $flag_section_functions,
|
||||||
|
)
|
||||||
|
if ( $verbose ) {
|
||||||
|
# $compiler_args += $flag_verbose
|
||||||
|
# $compiler_args += $flag_time_trace
|
||||||
|
}
|
||||||
|
if ( $optimize ) {
|
||||||
|
$compiler_args += $flag_optimize_fast
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$compiler_args += $flag_no_optimization
|
||||||
|
}
|
||||||
|
if ( $debug ) {
|
||||||
|
$compiler_args += ( $flag_define + 'Build_Debug=1' )
|
||||||
|
$compiler_args += $flag_debug, $flag_debug_codeview, $flag_profiling_debug
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$compiler_args += ( $flag_define + 'Build_Debug=0' )
|
||||||
|
}
|
||||||
|
|
||||||
|
$warning_ignores | ForEach-Object {
|
||||||
|
$compiler_args += $flag_warning + $_
|
||||||
|
}
|
||||||
|
$compiler_args += $includes | ForEach-Object { $flag_include + $_ }
|
||||||
|
|
||||||
|
$objects = @()
|
||||||
|
foreach ( $unit in $units )
|
||||||
|
{
|
||||||
|
$object = $unit -replace '\.(cpp|c)$', '.obj'
|
||||||
|
$object = join-path $path_output (split-path $object -Leaf)
|
||||||
|
$objects += $object
|
||||||
|
|
||||||
|
$unit_compiler_args = $compiler_args
|
||||||
|
$unit_compiler_args += ( $flag_path_output + $object )
|
||||||
|
|
||||||
|
$unit_compiler_args += $flag_compile, $unit
|
||||||
|
run-compiler $compiler $unit $unit_compiler_args
|
||||||
|
}
|
||||||
|
|
||||||
|
$linker_args += @(
|
||||||
|
$flag_link_win_machine_64,
|
||||||
|
$( $flag_link_win_path_output + $binary )
|
||||||
|
)
|
||||||
|
if ( $debug ) {
|
||||||
|
$linker_args += $flag_link_win_debug
|
||||||
|
$linker_args += $flag_link_win_pdb + $pdb
|
||||||
|
$linker_args += $flag_link_mapfile + $map
|
||||||
|
}
|
||||||
|
|
||||||
|
$libraries | ForEach-Object {
|
||||||
|
$linker_args += $_ + '.lib'
|
||||||
|
}
|
||||||
|
|
||||||
|
$linker_args += $objects
|
||||||
|
return run-linker $linker $binary $linker_args
|
||||||
|
}
|
||||||
|
|
||||||
function build-simple
|
function build-simple
|
||||||
{
|
{
|
||||||
param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [string]$unit, [string]$binary )
|
param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [string]$unit, [string]$binary )
|
||||||
$result = $false
|
$result = $false
|
||||||
#Write-Host "build-simple: clang"
|
#Write-Host "build-simple: clang"
|
||||||
|
|
||||||
$object = $unit -replace '\.cpp', '.obj'
|
$object = $unit -replace '\.(cpp|c)$', '.obj'
|
||||||
$map = $unit -replace '\.cpp', '.map'
|
$map = $unit -replace '\.(cpp|c)$', '.map'
|
||||||
$object = join-path $path_output (split-path $object -Leaf)
|
$object = join-path $path_output (split-path $object -Leaf)
|
||||||
$map = join-path $path_output (split-path $map -Leaf)
|
$map = join-path $path_output (split-path $map -Leaf)
|
||||||
|
|
||||||
# The PDB file has to also be time-stamped so that we can reload the DLL at runtime
|
# This allows dll reloads at runtime to work (jankily, use below if not interested)
|
||||||
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||||
|
# $pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||||
|
|
||||||
$compiler_args += @(
|
$compiler_args += @(
|
||||||
( $flag_define + 'INTELLISENSE_DIRECTIVES=0' ),
|
|
||||||
$flag_no_color_diagnostics,
|
$flag_no_color_diagnostics,
|
||||||
$flag_exceptions_disabled,
|
$flag_exceptions_disabled,
|
||||||
$flag_target_arch, $target_arch,
|
$flag_target_arch, $target_arch,
|
||||||
@ -282,24 +359,107 @@ if ( $vendor -match "msvc" )
|
|||||||
$flag_wall = '/Wall'
|
$flag_wall = '/Wall'
|
||||||
$flag_warnings_as_errors = '/WX'
|
$flag_warnings_as_errors = '/WX'
|
||||||
|
|
||||||
# This works because this project uses a single unit to build
|
function build
|
||||||
|
{
|
||||||
|
param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [array]$units, [string]$binary )
|
||||||
|
$result = $false
|
||||||
|
#Write-Host "build-simple: msvc"
|
||||||
|
|
||||||
|
$map = $binary -replace '\.(exe|dll)$', '.map'
|
||||||
|
$map = join-path $path_output (split-path $map -Leaf)
|
||||||
|
|
||||||
|
# This allows dll reloads at runtime to work (jankily, use below if not interested)
|
||||||
|
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||||
|
# $pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||||
|
|
||||||
|
$compiler_args += @(
|
||||||
|
$flag_nologo,
|
||||||
|
# $flag_all_cpp,
|
||||||
|
$flag_exceptions_disabled,
|
||||||
|
( $flag_define + '_HAS_EXCEPTIONS=0' ),
|
||||||
|
$flag_RTTI_disabled,
|
||||||
|
$flag_preprocess_conform,
|
||||||
|
$flag_full_src_path,
|
||||||
|
( $flag_path_interm + $path_output + '\' ),
|
||||||
|
( $flag_path_output + $path_output + '\' )
|
||||||
|
)
|
||||||
|
|
||||||
|
if ( $verbose ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $optimize ) {
|
||||||
|
$compiler_args += $flag_optimize_fast
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$compiler_args += $flag_no_optimization
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $debug )
|
||||||
|
{
|
||||||
|
$compiler_args += $flag_debug
|
||||||
|
$compiler_args += ( $flag_define + 'Build_Debug=1' )
|
||||||
|
$compiler_args += ( $flag_path_debug + $path_output + '\' )
|
||||||
|
$compiler_args += $flag_link_win_rt_static_debug
|
||||||
|
|
||||||
|
if ( $optimize ) {
|
||||||
|
$compiler_args += $flag_optimized_debug
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$compiler_args += ( $flag_define + 'Build_Debug=0' )
|
||||||
|
$compiler_args += $flag_link_win_rt_static
|
||||||
|
}
|
||||||
|
$compiler_args += $includes | ForEach-Object { $flag_include + $_ }
|
||||||
|
|
||||||
|
$objects = @()
|
||||||
|
foreach ( $unit in $units )
|
||||||
|
{
|
||||||
|
$object = $unit -replace '\.(cpp|c)$', '.obj'
|
||||||
|
$object = join-path $path_output (split-path $object -Leaf)
|
||||||
|
$objects += $object
|
||||||
|
|
||||||
|
$unit_compiler_args = $compiler_args
|
||||||
|
# $unit_compiler_args += ( $flag_path_output + $object )
|
||||||
|
|
||||||
|
$unit_compiler_args += $flag_compile, $unit
|
||||||
|
run-compiler $compiler $unit $unit_compiler_args
|
||||||
|
}
|
||||||
|
|
||||||
|
$linker_args += @(
|
||||||
|
$flag_nologo,
|
||||||
|
$flag_link_win_machine_64,
|
||||||
|
$flag_link_no_incremental,
|
||||||
|
( $flag_link_win_path_output + $binary )
|
||||||
|
)
|
||||||
|
if ( $debug ) {
|
||||||
|
$linker_args += $flag_link_win_debug
|
||||||
|
$linker_args += $flag_link_win_pdb + $pdb
|
||||||
|
$linker_args += $flag_link_mapfile + $map
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
}
|
||||||
|
|
||||||
|
$linker_args += $objects
|
||||||
|
return run-linker $linker $binary $linker_args
|
||||||
|
}
|
||||||
|
|
||||||
function build-simple
|
function build-simple
|
||||||
{
|
{
|
||||||
param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [string]$unit, [string]$binary )
|
param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [string]$unit, [string]$binary )
|
||||||
$result = $false
|
$result = $false
|
||||||
#Write-Host "build-simple: msvc"
|
#Write-Host "build-simple: msvc"
|
||||||
|
|
||||||
$object = $unit -replace '\.(cpp)$', '.obj'
|
$object = $unit -replace '\.(cpp|c)$', '.obj'
|
||||||
$map = $unit -replace '\.(cpp)$', '.map'
|
$map = $unit -replace '\.(cpp|c)$', '.map'
|
||||||
$object = join-path $path_output (split-path $object -Leaf)
|
$object = join-path $path_output (split-path $object -Leaf)
|
||||||
$map = join-path $path_output (split-path $map -Leaf)
|
$map = join-path $path_output (split-path $map -Leaf)
|
||||||
|
|
||||||
# The PDB file has to also be time-stamped so that we can reload the DLL at runtime
|
# This allows dll reloads at runtime to work (jankily, use below if not interested)
|
||||||
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
$pdb = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
|
||||||
|
# $pdb = $binary -replace '\.(exe|dll)$', ".pdb"
|
||||||
|
|
||||||
$compiler_args += @(
|
$compiler_args += @(
|
||||||
$flag_nologo,
|
$flag_nologo,
|
||||||
( $flag_define + 'INTELLISENSE_DIRECTIVES=0'),
|
|
||||||
# $flag_all_cpp,
|
# $flag_all_cpp,
|
||||||
$flag_exceptions_disabled,
|
$flag_exceptions_disabled,
|
||||||
( $flag_define + '_HAS_EXCEPTIONS=0' ),
|
( $flag_define + '_HAS_EXCEPTIONS=0' ),
|
||||||
|
Loading…
Reference in New Issue
Block a user