init commit

This commit is contained in:
Alex Lardner
2026-07-04 19:08:19 -07:00
parent 40dc51d21a
commit d7890c9808
106 changed files with 13653 additions and 0 deletions
+19
View File
@@ -0,0 +1,19 @@
cmake_minimum_required(VERSION 3.20)
project(polypartiCL LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_package(IntelSYCL REQUIRED)
file(GLOB_RECURSE PROJECT_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_LIST_DIR}/*.cpp")
set(PROJECT_INCLUDE "${CMAKE_CURRENT_LIST_DIR/include/}")
add_executable(${PROJECT_NAME})
target_sources(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_INCLUDE})
add_sycl_to_target(TARGET ${PROJECT_NAME} SOURCES polypartiCL.hpp)
target_link_libraries(${PROJECT_NAME} PRIVATE raylib)
+379
View File
@@ -0,0 +1,379 @@
# This is the CMakeCache file.
# For build in directory: /home/alardner/cl_polyparti/build
# It was generated by CMake: /usr/bin/cmake
# You can edit this file to change values found and used by cmake.
# If you do not want to change any of the values, simply exit the editor.
# If you do want to change a value, simply edit, save, and exit the editor.
# The syntax for the file is as follows:
# KEY:TYPE=VALUE
# KEY is the name of a variable in the cache.
# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!.
# VALUE is the current value for the KEY.
########################
# EXTERNAL cache entries
########################
//Path to a program.
CMAKE_ADDR2LINE:FILEPATH=/usr/bin/llvm-addr2line
//Path to a program.
CMAKE_AR:FILEPATH=/usr/bin/llvm-ar
//Choose the type of build, options are: None Debug Release RelWithDebInfo
// MinSizeRel ...
CMAKE_BUILD_TYPE:STRING=
//Enable/Disable color output during build.
CMAKE_COLOR_MAKEFILE:BOOL=ON
//CXX compiler
CMAKE_CXX_COMPILER:STRING=/opt/intel/oneapi/compiler/2026.0/bin/icpx
//LLVM archiver
CMAKE_CXX_COMPILER_AR:FILEPATH=/opt/intel/oneapi/compiler/2026.0/bin/compiler/llvm-ar
//Generate index for LLVM archive
CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/opt/intel/oneapi/compiler/2026.0/bin/compiler/llvm-ranlib
//Flags used by the CXX compiler during all build types.
CMAKE_CXX_FLAGS:STRING=
//Flags used by the CXX compiler during DEBUG builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=-g -Rno-debug-disables-optimization
//Flags used by the CXX compiler during MINSIZEREL builds.
CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
//Flags used by the CXX compiler during RELEASE builds.
CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
//Flags used by the CXX compiler during RELWITHDEBINFO builds.
CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
//Path to a program.
CMAKE_DLLTOOL:FILEPATH=/usr/bin/llvm-dlltool
//Flags used by the linker during all build types.
CMAKE_EXE_LINKER_FLAGS:STRING=
//Flags used by the linker during DEBUG builds.
CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the linker during MINSIZEREL builds.
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the linker during RELEASE builds.
CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the linker during RELWITHDEBINFO builds.
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//Enable/Disable output of compile commands during generation.
CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=
//Value Computed by CMake.
CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/home/alardner/cl_polyparti/build/CMakeFiles/pkgRedirects
//Install path prefix, prepended onto install directories.
CMAKE_INSTALL_PREFIX:PATH=/usr/local
//Path to a program.
CMAKE_LINKER:FILEPATH=/usr/bin/ld.lld
//Path to a program.
CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/gmake
//Flags used by the linker during the creation of modules during
// all build types.
CMAKE_MODULE_LINKER_FLAGS:STRING=
//Flags used by the linker during the creation of modules during
// DEBUG builds.
CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the linker during the creation of modules during
// MINSIZEREL builds.
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the linker during the creation of modules during
// RELEASE builds.
CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the linker during the creation of modules during
// RELWITHDEBINFO builds.
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//Path to a program.
CMAKE_NM:FILEPATH=/usr/bin/llvm-nm
//Path to a program.
CMAKE_OBJCOPY:FILEPATH=/usr/bin/llvm-objcopy
//Path to a program.
CMAKE_OBJDUMP:FILEPATH=/usr/bin/llvm-objdump
//Value Computed by CMake
CMAKE_PROJECT_COMPAT_VERSION:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_DESCRIPTION:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_HOMEPAGE_URL:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_NAME:STATIC=cl_polyparti
//Value Computed by CMake
CMAKE_PROJECT_SPDX_LICENSE:STATIC=
//Path to a program.
CMAKE_RANLIB:FILEPATH=/usr/bin/llvm-ranlib
//Path to a program.
CMAKE_READELF:FILEPATH=/usr/bin/llvm-readelf
//Flags used by the linker during the creation of shared libraries
// during all build types.
CMAKE_SHARED_LINKER_FLAGS:STRING=
//Flags used by the linker during the creation of shared libraries
// during DEBUG builds.
CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the linker during the creation of shared libraries
// during MINSIZEREL builds.
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the linker during the creation of shared libraries
// during RELEASE builds.
CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the linker during the creation of shared libraries
// during RELWITHDEBINFO builds.
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//If set, runtime paths are not added when installing shared libraries,
// but are added when building.
CMAKE_SKIP_INSTALL_RPATH:BOOL=NO
//If set, runtime paths are not added when using shared libraries.
CMAKE_SKIP_RPATH:BOOL=NO
//Flags used by the archiver during the creation of static libraries
// during all build types.
CMAKE_STATIC_LINKER_FLAGS:STRING=
//Flags used by the archiver during the creation of static libraries
// during DEBUG builds.
CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the archiver during the creation of static libraries
// during MINSIZEREL builds.
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the archiver during the creation of static libraries
// during RELEASE builds.
CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the archiver during the creation of static libraries
// during RELWITHDEBINFO builds.
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//Path to a program.
CMAKE_STRIP:FILEPATH=/usr/bin/llvm-strip
//Path to a program.
CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND
//If this value is on, makefiles will be generated without the
// .SILENT directive, and all commands will be echoed to the console
// during the make. This is useful for debugging only. With Visual
// Studio IDE projects all commands are done without /nologo.
CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE
//The directory containing a CMake configuration file for IntelSYCL.
IntelSYCL_DIR:PATH=/opt/intel/oneapi/compiler/2026.0/lib/cmake/IntelSYCL
//Arguments to supply to pkg-config
PKG_CONFIG_ARGN:STRING=
//pkg-config executable
PKG_CONFIG_EXECUTABLE:FILEPATH=/usr/bin/pkg-config
//SYCL Compiler
SYCL_COMPILER:STRING=/opt/intel/oneapi/compiler/2026.0/bin/icpx
//SYCL Compiler version
SYCL_COMPILER_VERSION:STRING=20260000
//Path to a file.
SYCL_INCLUDE_DIR:FILEPATH=/opt/intel/oneapi/compiler/2026.0/include
//Path to a file.
SYCL_INCLUDE_SYCL_DIR:FILEPATH=/opt/intel/oneapi/compiler/2026.0/include/sycl
//SYCL Language version
SYCL_LANGUAGE_VERSION:STRING=202012
//Path to a library.
SYCL_LIBRARY:FILEPATH=/opt/intel/oneapi/compiler/2026.0/lib/libsycl.so
//Path to a file.
SYCL_LIBRARY_DIR:FILEPATH=/opt/intel/oneapi/compiler/2026.0/lib
SYCL_PACKAGE_DIR:STRING=/opt/intel/oneapi/compiler/2026.0
//Value Computed by CMake
cl_polyparti_BINARY_DIR:STATIC=/home/alardner/cl_polyparti/build
//Value Computed by CMake
cl_polyparti_IS_TOP_LEVEL:STATIC=ON
//Value Computed by CMake
cl_polyparti_SOURCE_DIR:STATIC=/home/alardner/cl_polyparti
########################
# INTERNAL cache entries
########################
//ADVANCED property for variable: CMAKE_ADDR2LINE
CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_AR
CMAKE_AR-ADVANCED:INTERNAL=1
//This is the directory where this CMakeCache.txt was created
CMAKE_CACHEFILE_DIR:INTERNAL=/home/alardner/cl_polyparti/build
//Major version of cmake used to create the current loaded cache
CMAKE_CACHE_MAJOR_VERSION:INTERNAL=4
//Minor version of cmake used to create the current loaded cache
CMAKE_CACHE_MINOR_VERSION:INTERNAL=3
//Patch version of cmake used to create the current loaded cache
CMAKE_CACHE_PATCH_VERSION:INTERNAL=3
//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE
CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1
//Path to CMake executable.
CMAKE_COMMAND:INTERNAL=/usr/bin/cmake
//Path to cpack program executable.
CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack
//Path to ctest program executable.
CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest
//ADVANCED property for variable: CMAKE_CXX_COMPILER
CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR
CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB
CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_DLLTOOL
CMAKE_DLLTOOL-ADVANCED:INTERNAL=1
//Executable file format
CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG
CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE
CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS
CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1
//Name of external makefile project generator.
CMAKE_EXTRA_GENERATOR:INTERNAL=
//Name of generator.
CMAKE_GENERATOR:INTERNAL=Unix Makefiles
//Generator instance identifier.
CMAKE_GENERATOR_INSTANCE:INTERNAL=
//Name of generator platform.
CMAKE_GENERATOR_PLATFORM:INTERNAL=
//Name of generator toolset.
CMAKE_GENERATOR_TOOLSET:INTERNAL=
//Source directory with the top level CMakeLists.txt file for this
// project
CMAKE_HOME_DIRECTORY:INTERNAL=/home/alardner/cl_polyparti
//Install .so files without execute permission.
CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1
//ADVANCED property for variable: CMAKE_LINKER
CMAKE_LINKER-ADVANCED:INTERNAL=1
//Name of CMakeLists files to read
CMAKE_LIST_FILE_NAME:INTERNAL=CMakeLists.txt
//ADVANCED property for variable: CMAKE_MAKE_PROGRAM
CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG
CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE
CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_NM
CMAKE_NM-ADVANCED:INTERNAL=1
//number of local generators
CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1
//ADVANCED property for variable: CMAKE_OBJCOPY
CMAKE_OBJCOPY-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_OBJDUMP
CMAKE_OBJDUMP-ADVANCED:INTERNAL=1
//Platform information initialized
CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RANLIB
CMAKE_RANLIB-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_READELF
CMAKE_READELF-ADVANCED:INTERNAL=1
//Path to CMake installation.
CMAKE_ROOT:INTERNAL=/usr/share/cmake-4.3
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG
CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE
CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH
CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SKIP_RPATH
CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG
CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE
CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STRIP
CMAKE_STRIP-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_TAPI
CMAKE_TAPI-ADVANCED:INTERNAL=1
//uname command
CMAKE_UNAME:INTERNAL=/usr/bin/uname
//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE
CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1
//Details about finding IntelSYCL
FIND_PACKAGE_MESSAGE_DETAILS_IntelSYCL:INTERNAL=[/opt/intel/oneapi/compiler/2026.0/include][/opt/intel/oneapi/compiler/2026.0/lib][-fsycl][20260000][/opt/intel/oneapi/compiler/2026.0/bin/icpx][/opt/intel/oneapi/compiler/2026.0/lib/libsycl.so][v202012()]
//ADVANCED property for variable: PKG_CONFIG_ARGN
PKG_CONFIG_ARGN-ADVANCED:INTERNAL=1
//ADVANCED property for variable: PKG_CONFIG_EXECUTABLE
PKG_CONFIG_EXECUTABLE-ADVANCED:INTERNAL=1
@@ -0,0 +1,102 @@
set(CMAKE_CXX_COMPILER "/opt/intel/oneapi/compiler/2026.0/bin/icpx")
set(CMAKE_CXX_COMPILER_ARG1 "")
set(CMAKE_CXX_COMPILER_ID "IntelLLVM")
set(CMAKE_CXX_COMPILER_VERSION "2026.0.0")
set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "")
set(CMAKE_CXX_COMPILER_WRAPPER "")
set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17")
set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON")
set(CMAKE_CXX_STANDARD_LATEST "26")
set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26")
set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters")
set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates")
set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates")
set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17")
set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20")
set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23")
set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26")
set(CMAKE_CXX_PLATFORM_ID "Linux")
set(CMAKE_CXX_SIMULATE_ID "GNU")
set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU")
set(CMAKE_CXX_COMPILER_APPLE_SYSROOT "")
set(CMAKE_CXX_SIMULATE_VERSION "4.2.1")
set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x86_64")
set(CMAKE_AR "/usr/bin/llvm-ar")
set(CMAKE_CXX_COMPILER_AR "/opt/intel/oneapi/compiler/2026.0/bin/compiler/llvm-ar")
set(CMAKE_RANLIB "/usr/bin/llvm-ranlib")
set(CMAKE_CXX_COMPILER_RANLIB "/opt/intel/oneapi/compiler/2026.0/bin/compiler/llvm-ranlib")
set(CMAKE_LINKER "/usr/bin/ld.lld")
set(CMAKE_LINKER_LINK "")
set(CMAKE_LINKER_LLD "")
set(CMAKE_CXX_COMPILER_LINKER "/usr/bin/ld")
set(CMAKE_CXX_COMPILER_LINKER_ID "GNU")
set(CMAKE_CXX_COMPILER_LINKER_VERSION 2.46.50.20260608)
set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU)
set(CMAKE_MT "")
set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND")
set(CMAKE_COMPILER_IS_GNUCXX )
set(CMAKE_CXX_COMPILER_LOADED 1)
set(CMAKE_CXX_COMPILER_WORKS TRUE)
set(CMAKE_CXX_ABI_COMPILED TRUE)
set(CMAKE_CXX_COMPILER_ENV_VAR "CXX")
set(CMAKE_CXX_COMPILER_ID_RUN 1)
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m)
set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC)
foreach (lang IN ITEMS C OBJC OBJCXX)
if (CMAKE_${lang}_COMPILER_ID_RUN)
foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS)
list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension})
endforeach()
endif()
endforeach()
set(CMAKE_CXX_LINKER_PREFERENCE 30)
set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1)
set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED TRUE)
set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED TRUE)
set(CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED TRUE)
# Save compiler ABI information.
set(CMAKE_CXX_SIZEOF_DATA_PTR "8")
set(CMAKE_CXX_COMPILER_ABI "ELF")
set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN")
set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu")
if(CMAKE_CXX_SIZEOF_DATA_PTR)
set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}")
endif()
if(CMAKE_CXX_COMPILER_ABI)
set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}")
endif()
if(CMAKE_CXX_LIBRARY_ARCHITECTURE)
set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu")
endif()
set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "")
if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX)
set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}")
endif()
set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/opt/intel/oneapi/dev-utilities/2026.0/include;/opt/intel/oneapi/umf/1.1/include;/opt/intel/oneapi/tbb/2023.0/include;/opt/intel/oneapi/compiler/2026.0/opt/compiler/include;/usr/include/c++/15;/usr/include/x86_64-linux-gnu/c++/15;/usr/include/c++/15/backward;/opt/intel/oneapi/compiler/2026.0/lib/clang/22/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include")
set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "svml;irng;stdc++;imf;m;gcc_s;gcc;irc;dl;gcc_s;gcc;c;gcc_s;gcc;irc_s")
set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/opt/intel/oneapi/compiler/2026.0/lib;/opt/intel/oneapi/compiler/2026.0/lib/clang/22/lib/x86_64-unknown-linux-gnu;/usr/lib/gcc/x86_64-linux-gnu/15;/usr/lib64;/lib/x86_64-linux-gnu;/lib64;/usr/lib/x86_64-linux-gnu;/opt/intel/oneapi/compiler/2026.0/opt/compiler/lib;/lib;/usr/lib;/opt/intel/oneapi/tcm/1.5/lib;/opt/intel/oneapi/umf/1.1/lib;/opt/intel/oneapi/tbb/2023.0/lib/intel64/gcc4.8")
set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")
set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "")
set(CMAKE_CXX_COMPILER_IMPORT_STD "")
set(CMAKE_CXX_COMPILER_IMPORT_STD_ERROR_MESSAGE "Unsupported generator: Unix Makefiles")
set(CMAKE_CXX_STDLIB_MODULES_JSON "")
Binary file not shown.
+15
View File
@@ -0,0 +1,15 @@
set(CMAKE_HOST_SYSTEM "Linux-7.0.12+deb14.1-amd64")
set(CMAKE_HOST_SYSTEM_NAME "Linux")
set(CMAKE_HOST_SYSTEM_VERSION "7.0.12+deb14.1-amd64")
set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64")
set(CMAKE_SYSTEM "Linux-7.0.12+deb14.1-amd64")
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_VERSION "7.0.12+deb14.1-amd64")
set(CMAKE_SYSTEM_PROCESSOR "x86_64")
set(CMAKE_CROSSCOMPILING "FALSE")
set(CMAKE_SYSTEM_LOADED 1)
@@ -0,0 +1,949 @@
/* This source file must have a .cpp extension so that all C++ compilers
recognize the extension without flags. Borland does not know .cxx for
example. */
#ifndef __cplusplus
# error "A C compiler has been selected for C++."
#endif
#if !defined(__has_include)
/* If the compiler does not have __has_include, pretend the answer is
always no. */
# define __has_include(x) 0
#endif
/* Version number components: V=Version, R=Revision, P=Patch
Version date components: YYYY=Year, MM=Month, DD=Day */
#if defined(__INTEL_COMPILER) || defined(__ICC)
# define COMPILER_ID "Intel"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# if defined(__GNUC__)
# define SIMULATE_ID "GNU"
# endif
/* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later,
except that a few beta releases use the old format with V=2021. */
# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
# if defined(__INTEL_COMPILER_UPDATE)
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
# else
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
# endif
# else
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER)
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE)
/* The third version component from --version is an update index,
but no macro is provided for it. */
# define COMPILER_VERSION_PATCH DEC(0)
# endif
# if defined(__INTEL_COMPILER_BUILD_DATE)
/* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
# endif
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# if defined(__GNUC__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
# elif defined(__GNUG__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
# endif
# if defined(__GNUC_MINOR__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER)
# define COMPILER_ID "IntelLLVM"
#if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
#endif
#if defined(__GNUC__)
# define SIMULATE_ID "GNU"
#endif
/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and
* later. Look for 6 digit vs. 8 digit version number to decide encoding.
* VVVV is no smaller than the current year when a version is released.
*/
#if __INTEL_LLVM_COMPILER < 1000000L
# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100)
# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10)
#else
# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000)
# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100)
# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100)
#endif
#if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
#endif
#if defined(__GNUC__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
#elif defined(__GNUG__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
#endif
#if defined(__GNUC_MINOR__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
#endif
#if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
#endif
#elif defined(__PATHCC__)
# define COMPILER_ID "PathScale"
# define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
# if defined(__PATHCC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
# endif
#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
# define COMPILER_ID "Embarcadero"
# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
#elif defined(__BORLANDC__)
# define COMPILER_ID "Borland"
/* __BORLANDC__ = 0xVRR */
# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
# define COMPILER_ID "Watcom"
/* __WATCOMC__ = VVRR */
# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__WATCOMC__)
# define COMPILER_ID "OpenWatcom"
/* __WATCOMC__ = VVRP + 1100 */
# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__SUNPRO_CC)
# define COMPILER_ID "SunPro"
# if __SUNPRO_CC >= 0x5100
/* __SUNPRO_CC = 0xVRRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
# else
/* __SUNPRO_CC = 0xVRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
# endif
#elif defined(__HP_aCC)
# define COMPILER_ID "HP"
/* __HP_aCC = VVRRPP */
# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
#elif defined(__DECCXX)
# define COMPILER_ID "Compaq"
/* __DECCXX_VER = VVRRTPPPP */
# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
#elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
# define COMPILER_ID "zOS"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__open_xl__) && defined(__clang__)
# define COMPILER_ID "IBMClang"
# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__)
# define COMPILER_VERSION_MINOR DEC(__open_xl_release__)
# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__)
# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__)
# define COMPILER_VERSION_INTERNAL_STR __clang_version__
#elif defined(__ibmxl__) && defined(__clang__)
# define COMPILER_ID "XLClang"
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800
# define COMPILER_ID "XL"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
# define COMPILER_ID "VisualAge"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__NVCOMPILER)
# define COMPILER_ID "NVHPC"
# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__)
# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__)
# if defined(__NVCOMPILER_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__)
# endif
#elif defined(__PGI)
# define COMPILER_ID "PGI"
# define COMPILER_VERSION_MAJOR DEC(__PGIC__)
# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
# if defined(__PGIC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
# endif
#elif defined(__clang__) && defined(__cray__)
# define COMPILER_ID "CrayClang"
# define COMPILER_VERSION_MAJOR DEC(__cray_major__)
# define COMPILER_VERSION_MINOR DEC(__cray_minor__)
# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__)
# define COMPILER_VERSION_INTERNAL_STR __clang_version__
#elif defined(_CRAYC)
# define COMPILER_ID "Cray"
# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
#elif defined(__TI_COMPILER_VERSION__)
# define COMPILER_ID "TI"
/* __TI_COMPILER_VERSION__ = VVVRRRPPP */
# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
#elif defined(__CLANG_FUJITSU)
# define COMPILER_ID "FujitsuClang"
# define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
# define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
# define COMPILER_VERSION_INTERNAL_STR __clang_version__
#elif defined(__FUJITSU)
# define COMPILER_ID "Fujitsu"
# if defined(__FCC_version__)
# define COMPILER_VERSION __FCC_version__
# elif defined(__FCC_major__)
# define COMPILER_VERSION_MAJOR DEC(__FCC_major__)
# define COMPILER_VERSION_MINOR DEC(__FCC_minor__)
# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__)
# endif
# if defined(__fcc_version)
# define COMPILER_VERSION_INTERNAL DEC(__fcc_version)
# elif defined(__FCC_VERSION)
# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION)
# endif
#elif defined(__ghs__)
# define COMPILER_ID "GHS"
/* __GHS_VERSION_NUMBER = VVVVRP */
# ifdef __GHS_VERSION_NUMBER
# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
# endif
#elif defined(__TASKING__)
# define COMPILER_ID "Tasking"
# define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000)
# define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100)
# define COMPILER_VERSION_INTERNAL DEC(__VERSION__)
#elif defined(__ORANGEC__)
# define COMPILER_ID "OrangeC"
# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__)
# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__)
# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__)
#elif defined(__RENESAS__)
# define COMPILER_ID "Renesas"
/* __RENESAS_VERSION__ = 0xVVRRPP00 */
# define COMPILER_VERSION_MAJOR HEX(__RENESAS_VERSION__ >> 24 & 0xFF)
# define COMPILER_VERSION_MINOR HEX(__RENESAS_VERSION__ >> 16 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__RENESAS_VERSION__ >> 8 & 0xFF)
#elif defined(__SCO_VERSION__)
# define COMPILER_ID "SCO"
#elif defined(__ARMCC_VERSION) && !defined(__clang__)
# define COMPILER_ID "ARMCC"
#if __ARMCC_VERSION >= 1000000
/* __ARMCC_VERSION = VRRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#else
/* __ARMCC_VERSION = VRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#endif
#elif defined(__clang__) && defined(__apple_build_version__)
# define COMPILER_ID "AppleClang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION)
# define COMPILER_ID "ARMClang"
# define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100)
# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION)
#elif defined(__clang__) && defined(__ti__)
# define COMPILER_ID "TIClang"
# define COMPILER_VERSION_MAJOR DEC(__ti_major__)
# define COMPILER_VERSION_MINOR DEC(__ti_minor__)
# define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__)
# define COMPILER_VERSION_INTERNAL DEC(__ti_version__)
#elif defined(__clang__)
# define COMPILER_ID "Clang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__))
# define COMPILER_ID "LCC"
# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100)
# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100)
# if defined(__LCC_MINOR__)
# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__)
# endif
# if defined(__GNUC__) && defined(__GNUC_MINOR__)
# define SIMULATE_ID "GNU"
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
# if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
# endif
#elif defined(__GNUC__) || defined(__GNUG__)
# define COMPILER_ID "GNU"
# if defined(__GNUC__)
# define COMPILER_VERSION_MAJOR DEC(__GNUC__)
# else
# define COMPILER_VERSION_MAJOR DEC(__GNUG__)
# endif
# if defined(__GNUC_MINOR__)
# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif defined(_MSC_VER)
# define COMPILER_ID "MSVC"
/* _MSC_VER = VVRR */
# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
# if defined(_MSC_FULL_VER)
# if _MSC_VER >= 1400
/* _MSC_FULL_VER = VVRRPPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
# else
/* _MSC_FULL_VER = VVRRPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
# endif
# endif
# if defined(_MSC_BUILD)
# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
# endif
#elif defined(_ADI_COMPILER)
# define COMPILER_ID "ADSP"
#if defined(__VERSIONNUM__)
/* __VERSIONNUM__ = 0xVVRRPPTT */
# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF)
# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF)
# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF)
# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF)
#endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# define COMPILER_ID "IAR"
# if defined(__VER__) && defined(__ICCARM__)
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__))
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# endif
#elif defined(__DCC__) && defined(_DIAB_TOOL)
# define COMPILER_ID "Diab"
# define COMPILER_VERSION_MAJOR DEC(__VERSION_MAJOR_NUMBER__)
# define COMPILER_VERSION_MINOR DEC(__VERSION_MINOR_NUMBER__)
# define COMPILER_VERSION_PATCH DEC(__VERSION_ARCH_FEATURE_NUMBER__)
# define COMPILER_VERSION_TWEAK DEC(__VERSION_BUG_FIX_NUMBER__)
/* These compilers are either not known or too old to define an
identification macro. Try to identify the platform and guess that
it is the native compiler. */
#elif defined(__hpux) || defined(__hpua)
# define COMPILER_ID "HP"
#else /* unknown compiler */
# define COMPILER_ID ""
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
#ifdef SIMULATE_ID
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
#endif
#ifdef __QNXNTO__
char const* qnxnto = "INFO" ":" "qnxnto[]";
#endif
#if defined(__CRAYXT_COMPUTE_LINUX_TARGET)
char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
#endif
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
/* Identify known platforms by name. */
#if defined(__linux) || defined(__linux__) || defined(linux)
# define PLATFORM_ID "Linux"
#elif defined(__MSYS__)
# define PLATFORM_ID "MSYS"
#elif defined(__CYGWIN__)
# define PLATFORM_ID "Cygwin"
#elif defined(__MINGW32__)
# define PLATFORM_ID "MinGW"
#elif defined(__APPLE__)
# define PLATFORM_ID "Darwin"
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
# define PLATFORM_ID "Windows"
#elif defined(__FreeBSD__) || defined(__FreeBSD)
# define PLATFORM_ID "FreeBSD"
#elif defined(__NetBSD__) || defined(__NetBSD)
# define PLATFORM_ID "NetBSD"
#elif defined(__OpenBSD__) || defined(__OPENBSD)
# define PLATFORM_ID "OpenBSD"
#elif defined(__sun) || defined(sun)
# define PLATFORM_ID "SunOS"
#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
# define PLATFORM_ID "AIX"
#elif defined(__hpux) || defined(__hpux__)
# define PLATFORM_ID "HP-UX"
#elif defined(__HAIKU__)
# define PLATFORM_ID "Haiku"
#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
# define PLATFORM_ID "BeOS"
#elif defined(__QNX__) || defined(__QNXNTO__)
# define PLATFORM_ID "QNX"
#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
# define PLATFORM_ID "Tru64"
#elif defined(__riscos) || defined(__riscos__)
# define PLATFORM_ID "RISCos"
#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
# define PLATFORM_ID "SINIX"
#elif defined(__UNIX_SV__)
# define PLATFORM_ID "UNIX_SV"
#elif defined(__bsdos__)
# define PLATFORM_ID "BSDOS"
#elif defined(_MPRAS) || defined(MPRAS)
# define PLATFORM_ID "MP-RAS"
#elif defined(__osf) || defined(__osf__)
# define PLATFORM_ID "OSF1"
#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
# define PLATFORM_ID "SCO_SV"
#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
# define PLATFORM_ID "ULTRIX"
#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
# define PLATFORM_ID "Xenix"
#elif defined(__WATCOMC__)
# if defined(__LINUX__)
# define PLATFORM_ID "Linux"
# elif defined(__DOS__)
# define PLATFORM_ID "DOS"
# elif defined(__OS2__)
# define PLATFORM_ID "OS2"
# elif defined(__WINDOWS__)
# define PLATFORM_ID "Windows3x"
# elif defined(__VXWORKS__)
# define PLATFORM_ID "VxWorks"
# else /* unknown platform */
# define PLATFORM_ID
# endif
#elif defined(__INTEGRITY)
# if defined(INT_178B)
# define PLATFORM_ID "Integrity178"
# else /* regular Integrity */
# define PLATFORM_ID "Integrity"
# endif
# elif defined(_ADI_COMPILER)
# define PLATFORM_ID "ADSP"
#else /* unknown platform */
# define PLATFORM_ID
#endif
/* For windows compilers MSVC and Intel we can determine
the architecture of the compiler being used. This is because
the compilers do not have flags that can change the architecture,
but rather depend on which compiler is being used
*/
#if defined(_WIN32) && defined(_MSC_VER)
# if defined(_M_IA64)
# define ARCHITECTURE_ID "IA64"
# elif defined(_M_ARM64EC)
# define ARCHITECTURE_ID "ARM64EC"
# elif defined(_M_X64) || defined(_M_AMD64)
# define ARCHITECTURE_ID "x64"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# elif defined(_M_ARM64)
# define ARCHITECTURE_ID "ARM64"
# elif defined(_M_ARM)
# if _M_ARM == 4
# define ARCHITECTURE_ID "ARMV4I"
# elif _M_ARM == 5
# define ARCHITECTURE_ID "ARMV5I"
# else
# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
# endif
# elif defined(_M_MIPS)
# define ARCHITECTURE_ID "MIPS"
# elif defined(_M_SH)
# define ARCHITECTURE_ID "SHx"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__WATCOMC__)
# if defined(_M_I86)
# define ARCHITECTURE_ID "I86"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# if defined(__ICCARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__ICCRX__)
# define ARCHITECTURE_ID "RX"
# elif defined(__ICCRH850__)
# define ARCHITECTURE_ID "RH850"
# elif defined(__ICCRL78__)
# define ARCHITECTURE_ID "RL78"
# elif defined(__ICCRISCV__)
# define ARCHITECTURE_ID "RISCV"
# elif defined(__ICCAVR__)
# define ARCHITECTURE_ID "AVR"
# elif defined(__ICC430__)
# define ARCHITECTURE_ID "MSP430"
# elif defined(__ICCV850__)
# define ARCHITECTURE_ID "V850"
# elif defined(__ICC8051__)
# define ARCHITECTURE_ID "8051"
# elif defined(__ICCSTM8__)
# define ARCHITECTURE_ID "STM8"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__ghs__)
# if defined(__PPC64__)
# define ARCHITECTURE_ID "PPC64"
# elif defined(__ppc__)
# define ARCHITECTURE_ID "PPC"
# elif defined(__ARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__x86_64__)
# define ARCHITECTURE_ID "x64"
# elif defined(__i386__)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__clang__) && defined(__ti__)
# if defined(__ARM_ARCH)
# define ARCHITECTURE_ID "ARM"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__TI_COMPILER_VERSION__)
# if defined(__TI_ARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__MSP430__)
# define ARCHITECTURE_ID "MSP430"
# elif defined(__TMS320C28XX__)
# define ARCHITECTURE_ID "TMS320C28x"
# elif defined(__TMS320C6X__) || defined(_TMS320C6X)
# define ARCHITECTURE_ID "TMS320C6x"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
# elif defined(__ADSPSHARC__)
# define ARCHITECTURE_ID "SHARC"
# elif defined(__ADSPBLACKFIN__)
# define ARCHITECTURE_ID "Blackfin"
#elif defined(__TASKING__)
# if defined(__CTC__) || defined(__CPTC__)
# define ARCHITECTURE_ID "TriCore"
# elif defined(__CMCS__)
# define ARCHITECTURE_ID "MCS"
# elif defined(__CARM__) || defined(__CPARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__CARC__)
# define ARCHITECTURE_ID "ARC"
# elif defined(__C51__)
# define ARCHITECTURE_ID "8051"
# elif defined(__CPCP__)
# define ARCHITECTURE_ID "PCP"
# else
# define ARCHITECTURE_ID ""
# endif
#elif defined(__RENESAS__)
# if defined(__CCRX__)
# define ARCHITECTURE_ID "RX"
# elif defined(__CCRL__)
# define ARCHITECTURE_ID "RL78"
# elif defined(__CCRH__)
# define ARCHITECTURE_ID "RH850"
# else
# define ARCHITECTURE_ID ""
# endif
#else
# define ARCHITECTURE_ID
#endif
/* Convert integer to decimal digit literals. */
#define DEC(n) \
('0' + (((n) / 10000000)%10)), \
('0' + (((n) / 1000000)%10)), \
('0' + (((n) / 100000)%10)), \
('0' + (((n) / 10000)%10)), \
('0' + (((n) / 1000)%10)), \
('0' + (((n) / 100)%10)), \
('0' + (((n) / 10)%10)), \
('0' + ((n) % 10))
/* Convert integer to hex digit literals. */
#define HEX(n) \
('0' + ((n)>>28 & 0xF)), \
('0' + ((n)>>24 & 0xF)), \
('0' + ((n)>>20 & 0xF)), \
('0' + ((n)>>16 & 0xF)), \
('0' + ((n)>>12 & 0xF)), \
('0' + ((n)>>8 & 0xF)), \
('0' + ((n)>>4 & 0xF)), \
('0' + ((n) & 0xF))
/* Construct a string literal encoding the version number. */
#ifdef COMPILER_VERSION
char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]";
/* Construct a string literal encoding the version number components. */
#elif defined(COMPILER_VERSION_MAJOR)
char const info_version[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
COMPILER_VERSION_MAJOR,
# ifdef COMPILER_VERSION_MINOR
'.', COMPILER_VERSION_MINOR,
# ifdef COMPILER_VERSION_PATCH
'.', COMPILER_VERSION_PATCH,
# ifdef COMPILER_VERSION_TWEAK
'.', COMPILER_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct a string literal encoding the internal version number. */
#ifdef COMPILER_VERSION_INTERNAL
char const info_version_internal[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
'i','n','t','e','r','n','a','l','[',
COMPILER_VERSION_INTERNAL,']','\0'};
#elif defined(COMPILER_VERSION_INTERNAL_STR)
char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]";
#endif
/* Construct a string literal encoding the version number components. */
#ifdef SIMULATE_VERSION_MAJOR
char const info_simulate_version[] = {
'I', 'N', 'F', 'O', ':',
's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
SIMULATE_VERSION_MAJOR,
# ifdef SIMULATE_VERSION_MINOR
'.', SIMULATE_VERSION_MINOR,
# ifdef SIMULATE_VERSION_PATCH
'.', SIMULATE_VERSION_PATCH,
# ifdef SIMULATE_VERSION_TWEAK
'.', SIMULATE_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
#define CXX_STD_98 199711L
#define CXX_STD_11 201103L
#define CXX_STD_14 201402L
#define CXX_STD_17 201703L
#define CXX_STD_20 202002L
#define CXX_STD_23 202302L
#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG)
# if _MSVC_LANG > CXX_STD_17
# define CXX_STD _MSVC_LANG
# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init)
# define CXX_STD CXX_STD_20
# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17
# define CXX_STD CXX_STD_20
# elif _MSVC_LANG > CXX_STD_14
# define CXX_STD CXX_STD_17
# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi)
# define CXX_STD CXX_STD_14
# elif defined(__INTEL_CXX11_MODE__)
# define CXX_STD CXX_STD_11
# else
# define CXX_STD CXX_STD_98
# endif
#elif defined(_MSC_VER) && defined(_MSVC_LANG)
# if _MSVC_LANG > __cplusplus
# define CXX_STD _MSVC_LANG
# else
# define CXX_STD __cplusplus
# endif
#elif defined(__NVCOMPILER)
# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init)
# define CXX_STD CXX_STD_20
# else
# define CXX_STD __cplusplus
# endif
#elif defined(__INTEL_COMPILER) || defined(__PGI)
# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes)
# define CXX_STD CXX_STD_17
# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi)
# define CXX_STD CXX_STD_14
# else
# define CXX_STD __cplusplus
# endif
#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__)
# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi)
# define CXX_STD CXX_STD_14
# else
# define CXX_STD __cplusplus
# endif
#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__)
# define CXX_STD CXX_STD_11
#else
# define CXX_STD __cplusplus
#endif
const char* info_language_standard_default = "INFO" ":" "standard_default["
#if CXX_STD > CXX_STD_23
"26"
#elif CXX_STD > CXX_STD_20
"23"
#elif CXX_STD > CXX_STD_17
"20"
#elif CXX_STD > CXX_STD_14
"17"
#elif CXX_STD > CXX_STD_11
"14"
#elif CXX_STD >= CXX_STD_11
"11"
#else
"98"
#endif
"]";
const char* info_language_extensions_default = "INFO" ":" "extensions_default["
#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \
defined(__TI_COMPILER_VERSION__) || defined(__RENESAS__)) && \
!defined(__STRICT_ANSI__)
"ON"
#else
"OFF"
#endif
"]";
/*--------------------------------------------------------------------------*/
int main(int argc, char* argv[])
{
int require = 0;
require += info_compiler[argc];
require += info_platform[argc];
require += info_arch[argc];
#ifdef COMPILER_VERSION_MAJOR
require += info_version[argc];
#endif
#if defined(COMPILER_VERSION_INTERNAL) || defined(COMPILER_VERSION_INTERNAL_STR)
require += info_version_internal[argc];
#endif
#ifdef SIMULATE_ID
require += info_simulate[argc];
#endif
#ifdef SIMULATE_VERSION_MAJOR
require += info_simulate_version[argc];
#endif
#if defined(__CRAYXT_COMPUTE_LINUX_TARGET)
require += info_cray[argc];
#endif
require += info_language_standard_default[argc];
require += info_language_extensions_default[argc];
(void)argv;
return require;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,16 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Relative path conversion top directories.
set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/alardner/cl_polyparti")
set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/alardner/cl_polyparti/build")
# Force unix paths in dependencies.
set(CMAKE_FORCE_UNIX_PATHS 1)
# The C and CXX include file regular expressions for this directory.
set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$")
set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$")
set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN})
set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN})
+7
View File
@@ -0,0 +1,7 @@
{
"InstallScripts" :
[
"/home/alardner/cl_polyparti/build/cmake_install.cmake"
],
"Parallel" : false
}
+125
View File
@@ -0,0 +1,125 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# The generator used is:
set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles")
# The top level Makefile was generated from the following files:
set(CMAKE_MAKEFILE_DEPENDS
"CMakeCache.txt"
"/home/alardner/cl_polyparti/CMakeLists.txt"
"CMakeFiles/4.3.3/CMakeCXXCompiler.cmake"
"CMakeFiles/4.3.3/CMakeSystem.cmake"
"CMakeFiles/VerifyGlobs.cmake"
"CMakeFiles/cmake.verify_globs"
"/opt/intel/oneapi/compiler/2026.0/lib/cmake/IntelSYCL/IntelSYCLConfig.cmake"
"/opt/intel/oneapi/compiler/2026.0/lib/cmake/IntelSYCL/IntelSYCLConfigVersion.cmake"
"/usr/share/cmake-4.3/Modules/CMakeCXXCompiler.cmake.in"
"/usr/share/cmake-4.3/Modules/CMakeCXXCompilerABI.cpp"
"/usr/share/cmake-4.3/Modules/CMakeCXXInformation.cmake"
"/usr/share/cmake-4.3/Modules/CMakeCommonLanguageInclude.cmake"
"/usr/share/cmake-4.3/Modules/CMakeCompilerIdDetection.cmake"
"/usr/share/cmake-4.3/Modules/CMakeDetermineCXXCompiler.cmake"
"/usr/share/cmake-4.3/Modules/CMakeDetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/CMakeDetermineCompilerABI.cmake"
"/usr/share/cmake-4.3/Modules/CMakeDetermineCompilerId.cmake"
"/usr/share/cmake-4.3/Modules/CMakeDetermineCompilerSupport.cmake"
"/usr/share/cmake-4.3/Modules/CMakeDetermineSystem.cmake"
"/usr/share/cmake-4.3/Modules/CMakeFindBinUtils.cmake"
"/usr/share/cmake-4.3/Modules/CMakeGenericSystem.cmake"
"/usr/share/cmake-4.3/Modules/CMakeInitializeConfigs.cmake"
"/usr/share/cmake-4.3/Modules/CMakeLanguageInformation.cmake"
"/usr/share/cmake-4.3/Modules/CMakeParseImplicitIncludeInfo.cmake"
"/usr/share/cmake-4.3/Modules/CMakeParseImplicitLinkInfo.cmake"
"/usr/share/cmake-4.3/Modules/CMakeParseLibraryArchitecture.cmake"
"/usr/share/cmake-4.3/Modules/CMakeSystem.cmake.in"
"/usr/share/cmake-4.3/Modules/CMakeSystemSpecificInformation.cmake"
"/usr/share/cmake-4.3/Modules/CMakeSystemSpecificInitialize.cmake"
"/usr/share/cmake-4.3/Modules/CMakeTestCXXCompiler.cmake"
"/usr/share/cmake-4.3/Modules/CMakeTestCompilerCommon.cmake"
"/usr/share/cmake-4.3/Modules/CMakeUnixFindMake.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/ADSP-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/ARMCC-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/ARMClang-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/AppleClang-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Borland-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/CMakeCommonCompilerMacros.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Clang-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Clang-DetermineCompilerInternal.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Cray-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/CrayClang-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Diab-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Embarcadero-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Fujitsu-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/GHS-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/HP-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/IAR-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Intel-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/IntelLLVM-CXX.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/IntelLLVM-FindBinUtils.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/IntelLLVM.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/MSVC-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/NVHPC-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/NVIDIA-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/OrangeC-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/PGI-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/PathScale-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Renesas-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/SCO-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/TI-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/TIClang-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Tasking-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/Watcom-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/XL-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-4.3/Modules/FindPackageHandleStandardArgs.cmake"
"/usr/share/cmake-4.3/Modules/FindPackageMessage.cmake"
"/usr/share/cmake-4.3/Modules/FindPkgConfig.cmake"
"/usr/share/cmake-4.3/Modules/Internal/CMakeCXXLinkerInformation.cmake"
"/usr/share/cmake-4.3/Modules/Internal/CMakeCommonLinkerInformation.cmake"
"/usr/share/cmake-4.3/Modules/Internal/CMakeDetermineLinkerId.cmake"
"/usr/share/cmake-4.3/Modules/Internal/CMakeInspectCXXLinker.cmake"
"/usr/share/cmake-4.3/Modules/Internal/FeatureTesting.cmake"
"/usr/share/cmake-4.3/Modules/Linker/GNU-CXX.cmake"
"/usr/share/cmake-4.3/Modules/Linker/GNU.cmake"
"/usr/share/cmake-4.3/Modules/Platform/Linker/GNU.cmake"
"/usr/share/cmake-4.3/Modules/Platform/Linker/Linux-GNU-CXX.cmake"
"/usr/share/cmake-4.3/Modules/Platform/Linker/Linux-GNU.cmake"
"/usr/share/cmake-4.3/Modules/Platform/Linux-Determine-CXX.cmake"
"/usr/share/cmake-4.3/Modules/Platform/Linux-Initialize.cmake"
"/usr/share/cmake-4.3/Modules/Platform/Linux-IntelLLVM-CXX.cmake"
"/usr/share/cmake-4.3/Modules/Platform/Linux-IntelLLVM.cmake"
"/usr/share/cmake-4.3/Modules/Platform/Linux.cmake"
"/usr/share/cmake-4.3/Modules/Platform/UnixPaths.cmake"
)
# The corresponding makefile is:
set(CMAKE_MAKEFILE_OUTPUTS
"Makefile"
"CMakeFiles/cmake.check_cache"
)
# Byproducts of CMake generate step:
set(CMAKE_MAKEFILE_PRODUCTS
"CMakeFiles/4.3.3/CMakeSystem.cmake"
"CMakeFiles/4.3.3/CMakeCXXCompiler.cmake"
"CMakeFiles/4.3.3/CMakeCXXCompiler.cmake"
"CMakeFiles/4.3.3/CMakeCXXCompiler.cmake"
"CMakeFiles/CMakeDirectoryInformation.cmake"
)
# Dependency information for all targets:
set(CMAKE_DEPEND_INFO_FILES
"CMakeFiles/cl_polyparti.dir/DependInfo.cmake"
)
+123
View File
@@ -0,0 +1,123 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/alardner/cl_polyparti
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/alardner/cl_polyparti/build
#=============================================================================
# Directory level rules for the build root directory
# The main recursive "all" target.
all: CMakeFiles/cl_polyparti.dir/all
.PHONY : all
# The main recursive "codegen" target.
codegen: CMakeFiles/cl_polyparti.dir/codegen
.PHONY : codegen
# The main recursive "preinstall" target.
preinstall:
.PHONY : preinstall
# The main recursive "clean" target.
clean: CMakeFiles/cl_polyparti.dir/clean
.PHONY : clean
#=============================================================================
# Target rules for target CMakeFiles/cl_polyparti.dir
# All Build rule for target.
CMakeFiles/cl_polyparti.dir/all:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/depend
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/alardner/cl_polyparti/build/CMakeFiles --progress-num=1,2,3 "Built target cl_polyparti"
.PHONY : CMakeFiles/cl_polyparti.dir/all
# Build rule for subdir invocation for target.
CMakeFiles/cl_polyparti.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/alardner/cl_polyparti/build/CMakeFiles 3
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/cl_polyparti.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/alardner/cl_polyparti/build/CMakeFiles 0
.PHONY : CMakeFiles/cl_polyparti.dir/rule
# Convenience name for target.
cl_polyparti: CMakeFiles/cl_polyparti.dir/rule
.PHONY : cl_polyparti
# codegen rule for target.
CMakeFiles/cl_polyparti.dir/codegen:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/codegen
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/alardner/cl_polyparti/build/CMakeFiles --progress-num=1,2,3 "Finished codegen for target cl_polyparti"
.PHONY : CMakeFiles/cl_polyparti.dir/codegen
# clean rule for target.
CMakeFiles/cl_polyparti.dir/clean:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/clean
.PHONY : CMakeFiles/cl_polyparti.dir/clean
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
$(CMAKE_COMMAND) -P /home/alardner/cl_polyparti/build/CMakeFiles/VerifyGlobs.cmake
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system
@@ -0,0 +1,7 @@
#include <iostream>
using namespace std;
int main(){
#if defined(SYCL_LANGUAGE_VERSION)
cout << "SYCL_LANGUAGE_VERSION="<<SYCL_LANGUAGE_VERSION<<endl;
#endif
return 0;}
+3
View File
@@ -0,0 +1,3 @@
/home/alardner/cl_polyparti/build/CMakeFiles/cl_polyparti.dir
/home/alardner/cl_polyparti/build/CMakeFiles/edit_cache.dir
/home/alardner/cl_polyparti/build/CMakeFiles/rebuild_cache.dir
+29
View File
@@ -0,0 +1,29 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by CMake Version 4.3
# PROJECT_SOURCES at CMakeLists.txt:10 (file)
file(GLOB_RECURSE NEW_GLOB LIST_DIRECTORIES false "/home/alardner/cl_polyparti/*.cpp")
set(OLD_GLOB
"/home/alardner/cl_polyparti/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp"
"/home/alardner/cl_polyparti/build/CMakeFiles/TESTSYCL/sycl_features.cpp"
)
if(NOT "${NEW_GLOB}" STREQUAL "${OLD_GLOB}")
message("-- GLOB mismatch!")
set(NEW_ONLY ${NEW_GLOB})
set(OLD_ONLY ${OLD_GLOB})
list(REMOVE_ITEM NEW_ONLY ${OLD_GLOB})
list(REMOVE_ITEM OLD_ONLY ${NEW_GLOB})
if(NEW_ONLY)
message("The following files were added:")
foreach(VAR_FILE IN LISTS NEW_ONLY)
message(" +${VAR_FILE}")
endforeach()
endif()
if(OLD_ONLY)
message("The following files were removed:")
foreach(VAR_FILE IN LISTS OLD_ONLY)
message(" -${VAR_FILE}")
endforeach()
endif()
file(TOUCH_NOCREATE "/home/alardner/cl_polyparti/build/CMakeFiles/cmake.verify_globs")
endif()
@@ -0,0 +1,25 @@
# Consider dependencies only in project.
set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF)
# The set of languages for which implicit dependencies are needed:
set(CMAKE_DEPENDS_LANGUAGES
)
# The set of dependency files which are needed:
set(CMAKE_DEPENDS_DEPENDENCY_FILES
"/home/alardner/cl_polyparti/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp" "CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o" "gcc" "CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o.d"
"/home/alardner/cl_polyparti/build/CMakeFiles/TESTSYCL/sycl_features.cpp" "CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o" "gcc" "CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o.d"
"" "cl_polyparti" "gcc" "CMakeFiles/cl_polyparti.dir/link.d"
)
# Targets to which this target links which contain Fortran sources.
set(CMAKE_Fortran_TARGET_LINKED_INFO_FILES
)
# Targets to which this target links which contain Fortran sources.
set(CMAKE_Fortran_TARGET_FORWARD_LINKED_INFO_FILES
)
# Fortran module output directory.
set(CMAKE_Fortran_TARGET_MODULE_DIR "")
@@ -0,0 +1,130 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/alardner/cl_polyparti
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/alardner/cl_polyparti/build
# Include any dependencies generated for this target.
include CMakeFiles/cl_polyparti.dir/depend.make
# Include any dependencies generated by the compiler for this target.
include CMakeFiles/cl_polyparti.dir/compiler_depend.make
# Include the progress variables for this target.
include CMakeFiles/cl_polyparti.dir/progress.make
# Include the compile flags for this target's objects.
include CMakeFiles/cl_polyparti.dir/flags.make
CMakeFiles/cl_polyparti.dir/codegen:
.PHONY : CMakeFiles/cl_polyparti.dir/codegen
CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o: CMakeFiles/cl_polyparti.dir/flags.make
CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o: CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp
CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o: CMakeFiles/cl_polyparti.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/alardner/cl_polyparti/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o"
/opt/intel/oneapi/compiler/2026.0/bin/icpx $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o -MF CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o.d -o CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o -c /home/alardner/cl_polyparti/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp
CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.i"
/opt/intel/oneapi/compiler/2026.0/bin/icpx $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alardner/cl_polyparti/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp > CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.i
CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.s"
/opt/intel/oneapi/compiler/2026.0/bin/icpx $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alardner/cl_polyparti/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp -o CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.s
CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o: CMakeFiles/cl_polyparti.dir/flags.make
CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o: CMakeFiles/TESTSYCL/sycl_features.cpp
CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o: CMakeFiles/cl_polyparti.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/alardner/cl_polyparti/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o"
/opt/intel/oneapi/compiler/2026.0/bin/icpx $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o -MF CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o.d -o CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o -c /home/alardner/cl_polyparti/build/CMakeFiles/TESTSYCL/sycl_features.cpp
CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.i"
/opt/intel/oneapi/compiler/2026.0/bin/icpx $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alardner/cl_polyparti/build/CMakeFiles/TESTSYCL/sycl_features.cpp > CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.i
CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.s"
/opt/intel/oneapi/compiler/2026.0/bin/icpx $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alardner/cl_polyparti/build/CMakeFiles/TESTSYCL/sycl_features.cpp -o CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.s
# Object files for target cl_polyparti
cl_polyparti_OBJECTS = \
"CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o" \
"CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o"
# External object files for target cl_polyparti
cl_polyparti_EXTERNAL_OBJECTS =
cl_polyparti: CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o
cl_polyparti: CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o
cl_polyparti: CMakeFiles/cl_polyparti.dir/build.make
cl_polyparti: CMakeFiles/cl_polyparti.dir/compiler_depend.ts
cl_polyparti: CMakeFiles/cl_polyparti.dir/link.txt
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/alardner/cl_polyparti/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Linking CXX executable cl_polyparti"
$(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/cl_polyparti.dir/link.txt --verbose=$(VERBOSE)
# Rule to build all files generated by this target.
CMakeFiles/cl_polyparti.dir/build: cl_polyparti
.PHONY : CMakeFiles/cl_polyparti.dir/build
CMakeFiles/cl_polyparti.dir/clean:
$(CMAKE_COMMAND) -P CMakeFiles/cl_polyparti.dir/cmake_clean.cmake
.PHONY : CMakeFiles/cl_polyparti.dir/clean
CMakeFiles/cl_polyparti.dir/depend:
cd /home/alardner/cl_polyparti/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/alardner/cl_polyparti /home/alardner/cl_polyparti /home/alardner/cl_polyparti/build /home/alardner/cl_polyparti/build /home/alardner/cl_polyparti/build/CMakeFiles/cl_polyparti.dir/DependInfo.cmake "--color=$(COLOR)" cl_polyparti
.PHONY : CMakeFiles/cl_polyparti.dir/depend
@@ -0,0 +1,14 @@
file(REMOVE_RECURSE
"CMakeFiles/cl_polyparti.dir/link.d"
"CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o"
"CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o.d"
"CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o"
"CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o.d"
"cl_polyparti"
"cl_polyparti.pdb"
)
# Per-language clean rules from dependency scanning.
foreach(lang CXX)
include(CMakeFiles/cl_polyparti.dir/cmake_clean_${lang}.cmake OPTIONAL)
endforeach()
@@ -0,0 +1,2 @@
# Empty compiler generated dependencies file for cl_polyparti.
# This may be replaced when dependencies are built.
@@ -0,0 +1,2 @@
# CMAKE generated file: DO NOT EDIT!
# Timestamp file for compiler generated dependencies management for cl_polyparti.
@@ -0,0 +1,2 @@
# Empty dependencies file for cl_polyparti.
# This may be replaced when dependencies are built.
@@ -0,0 +1,10 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# compile CXX with /opt/intel/oneapi/compiler/2026.0/bin/icpx
CXX_DEFINES =
CXX_INCLUDES =
CXX_FLAGS = -std=gnu++17
@@ -0,0 +1 @@
/opt/intel/oneapi/compiler/2026.0/bin/icpx -fsycl -Wl,--dependency-file=CMakeFiles/cl_polyparti.dir/link.d CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o -o cl_polyparti
@@ -0,0 +1,4 @@
CMAKE_PROGRESS_1 = 1
CMAKE_PROGRESS_2 = 2
CMAKE_PROGRESS_3 = 3
+1
View File
@@ -0,0 +1 @@
# This file is generated by cmake for dependency checking of the CMakeCache.txt file
+1
View File
@@ -0,0 +1 @@
# This file is generated by CMake for checking of the VerifyGlobs.cmake file
+1
View File
@@ -0,0 +1 @@
3
+210
View File
@@ -0,0 +1,210 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 4.3
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/alardner/cl_polyparti
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/alardner/cl_polyparti/build
#=============================================================================
# Targets provided globally by CMake.
# Special rule for the target edit_cache
edit_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..."
/usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available.
.PHONY : edit_cache
# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast
# Special rule for the target rebuild_cache
rebuild_cache:
@$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..."
/usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache
# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast
# The main all target
all: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/alardner/cl_polyparti/build/CMakeFiles /home/alardner/cl_polyparti/build//CMakeFiles/progress.marks
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all
$(CMAKE_COMMAND) -E cmake_progress_start /home/alardner/cl_polyparti/build/CMakeFiles 0
.PHONY : all
# The main clean target
clean:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean
.PHONY : clean
# The main clean target
clean/fast: clean
.PHONY : clean/fast
# Prepare targets for installation.
preinstall: all
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall
# Prepare targets for installation.
preinstall/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall/fast
# clear depends
depend:
$(CMAKE_COMMAND) -P /home/alardner/cl_polyparti/build/CMakeFiles/VerifyGlobs.cmake
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend
#=============================================================================
# Target rules for targets named cl_polyparti
# Build rule for target.
cl_polyparti: cmake_check_build_system
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 cl_polyparti
.PHONY : cl_polyparti
# fast build rule for target.
cl_polyparti/fast:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/build
.PHONY : cl_polyparti/fast
CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.o: CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o
.PHONY : CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.o
# target to build an object file
CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o
.PHONY : CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o
CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.i: CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.i
.PHONY : CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.i
# target to preprocess a source file
CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.i
.PHONY : CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.i
CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.s: CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.s
.PHONY : CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.s
# target to generate assembly for a file
CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.s
.PHONY : CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.s
CMakeFiles/TESTSYCL/sycl_features.o: CMakeFiles/TESTSYCL/sycl_features.cpp.o
.PHONY : CMakeFiles/TESTSYCL/sycl_features.o
# target to build an object file
CMakeFiles/TESTSYCL/sycl_features.cpp.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o
.PHONY : CMakeFiles/TESTSYCL/sycl_features.cpp.o
CMakeFiles/TESTSYCL/sycl_features.i: CMakeFiles/TESTSYCL/sycl_features.cpp.i
.PHONY : CMakeFiles/TESTSYCL/sycl_features.i
# target to preprocess a source file
CMakeFiles/TESTSYCL/sycl_features.cpp.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.i
.PHONY : CMakeFiles/TESTSYCL/sycl_features.cpp.i
CMakeFiles/TESTSYCL/sycl_features.s: CMakeFiles/TESTSYCL/sycl_features.cpp.s
.PHONY : CMakeFiles/TESTSYCL/sycl_features.s
# target to generate assembly for a file
CMakeFiles/TESTSYCL/sycl_features.cpp.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/cl_polyparti.dir/build.make CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.s
.PHONY : CMakeFiles/TESTSYCL/sycl_features.cpp.s
# Help Target
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... clean"
@echo "... depend"
@echo "... edit_cache"
@echo "... rebuild_cache"
@echo "... cl_polyparti"
@echo "... CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.o"
@echo "... CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.i"
@echo "... CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.s"
@echo "... CMakeFiles/TESTSYCL/sycl_features.o"
@echo "... CMakeFiles/TESTSYCL/sycl_features.i"
@echo "... CMakeFiles/TESTSYCL/sycl_features.s"
.PHONY : help
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
$(CMAKE_COMMAND) -P /home/alardner/cl_polyparti/build/CMakeFiles/VerifyGlobs.cmake
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system
+66
View File
@@ -0,0 +1,66 @@
# Install script for directory: /home/alardner/cl_polyparti
# Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "/usr/local")
endif()
string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
# Set the install configuration name.
if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
if(BUILD_TYPE)
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
else()
set(CMAKE_INSTALL_CONFIG_NAME "")
endif()
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
endif()
# Set the component getting installed.
if(NOT CMAKE_INSTALL_COMPONENT)
if(COMPONENT)
message(STATUS "Install component: \"${COMPONENT}\"")
set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
else()
set(CMAKE_INSTALL_COMPONENT)
endif()
endif()
# Install shared libraries without execute permission?
if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
set(CMAKE_INSTALL_SO_NO_EXE "1")
endif()
# Is this installation the result of a crosscompile?
if(NOT DEFINED CMAKE_CROSSCOMPILING)
set(CMAKE_CROSSCOMPILING "FALSE")
endif()
# Set path to fallback-tool for dependency-resolution.
if(NOT DEFINED CMAKE_OBJDUMP)
set(CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
endif()
string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
"${CMAKE_INSTALL_MANIFEST_FILES}")
if(CMAKE_INSTALL_LOCAL_ONLY)
file(WRITE "/home/alardner/cl_polyparti/build/install_local_manifest.txt"
"${CMAKE_INSTALL_MANIFEST_CONTENT}")
endif()
if(CMAKE_INSTALL_COMPONENT)
if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$")
set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
else()
string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}")
set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt")
unset(CMAKE_INST_COMP_HASH)
endif()
else()
set(CMAKE_INSTALL_MANIFEST "install_manifest.txt")
endif()
if(NOT CMAKE_INSTALL_LOCAL_ONLY)
file(WRITE "/home/alardner/cl_polyparti/build/${CMAKE_INSTALL_MANIFEST}"
"${CMAKE_INSTALL_MANIFEST_CONTENT}")
endif()
+14
View File
@@ -0,0 +1,14 @@
[
{
"directory": "/home/alardner/cl_polyparti/build",
"command": "/opt/intel/oneapi/compiler/2026.0/bin/icpx -std=gnu++17 -o CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o -c /home/alardner/cl_polyparti/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp",
"file": "/home/alardner/cl_polyparti/build/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp",
"output": "CMakeFiles/cl_polyparti.dir/CMakeFiles/4.3.3/CompilerIdCXX/CMakeCXXCompilerId.cpp.o"
},
{
"directory": "/home/alardner/cl_polyparti/build",
"command": "/opt/intel/oneapi/compiler/2026.0/bin/icpx -std=gnu++17 -o CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o -c /home/alardner/cl_polyparti/build/CMakeFiles/TESTSYCL/sycl_features.cpp",
"file": "/home/alardner/cl_polyparti/build/CMakeFiles/TESTSYCL/sycl_features.cpp",
"output": "CMakeFiles/cl_polyparti.dir/CMakeFiles/TESTSYCL/sycl_features.cpp.o"
}
]
+71
View File
@@ -0,0 +1,71 @@
#ifndef RAYLIB_CPP_INCLUDE_AUDIODEVICE_HPP_
#define RAYLIB_CPP_INCLUDE_AUDIODEVICE_HPP_
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Audio device management functions.
*/
class AudioDevice {
public:
/**
* Initialize audio device and context.
*
* @param lateInit Whether or not to post-pone initializing the context.
*
* @throws raylib::RaylibException Throws if the AudioDevice failed to initialize.
*/
explicit AudioDevice(bool lateInit = false) {
if (!lateInit) {
Init();
}
}
AudioDevice(const AudioDevice&) = delete;
AudioDevice& operator=(const AudioDevice&) = delete;
/**
* Close the audio device and context.
*/
~AudioDevice() { Close(); }
/**
* Initialize audio device and context.
*
* @throws raylib::RaylibException Throws if the AudioDevice failed to initialize.
*/
static void Init() {
::InitAudioDevice();
if (!IsReady()) {
throw RaylibException("Failed to initialize AudioDevice");
}
}
/**
* Close the audio device and context.
*/
static void Close() { ::CloseAudioDevice(); }
/**
* Check if audio device has been initialized successfully.
*/
static bool IsReady() { return ::IsAudioDeviceReady(); }
/**
* Set master volume (listener).
*
* @param volume The desired volume to set.
*/
AudioDevice& SetVolume(float volume) {
::SetMasterVolume(volume);
return *this;
}
};
} // namespace raylib
using RAudioDevice = raylib::AudioDevice;
#endif // RAYLIB_CPP_INCLUDE_AUDIODEVICE_HPP_
+55
View File
@@ -0,0 +1,55 @@
#ifndef RAYLIB_CPP_INCLUDE_AUDIOSTREAM_HPP_
#define RAYLIB_CPP_INCLUDE_AUDIOSTREAM_HPP_
#include "./AudioStreamUnmanaged.hpp"
namespace raylib {
/**
* AudioStream management functions.
*
* The audio stream will be unloaded on object destruction. Use raylib::AudioStreamUnmanaged if you're looking to not unload.
*
* @see raylib::AudioStreamUnmanaged
*/
class AudioStream : public AudioStreamUnmanaged {
public:
using AudioStreamUnmanaged::AudioStreamUnmanaged;
AudioStream(const AudioStream&) = delete;
AudioStream& operator=(const AudioStream&) = delete;
AudioStream(AudioStream&& other) noexcept {
set(other);
other.buffer = nullptr;
other.processor = nullptr;
other.sampleRate = 0;
other.sampleSize = 0;
other.channels = 0;
}
AudioStream& operator=(AudioStream&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.buffer = nullptr;
other.processor = nullptr;
other.sampleRate = 0;
other.sampleSize = 0;
other.channels = 0;
return *this;
}
~AudioStream() { Unload(); }
void Load(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels = 2) {
Unload();
AudioStreamUnmanaged::Load(sampleRate, sampleSize, channels);
}
};
} // namespace raylib
using RAudioStream = raylib::AudioStream;
#endif // RAYLIB_CPP_INCLUDE_AUDIOSTREAM_HPP_
+200
View File
@@ -0,0 +1,200 @@
#ifndef RAYLIB_CPP_INCLUDE_AUDIOSTREAMUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_AUDIOSTREAMUNMANAGED_HPP_
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* An AudioStream that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::AudioStream.
*
* @see raylib::AudioStream
*/
class AudioStreamUnmanaged : public ::AudioStream {
public:
/**
* Creates an AudioStreamUnmanaged from an existing AudioStream struct.
*/
AudioStreamUnmanaged(const ::AudioStream& stream) : ::AudioStream(stream) {}
/**
* Creates an AudioStreamUnmanaged from its components.
*/
AudioStreamUnmanaged(
rAudioBuffer* buffer = nullptr,
rAudioProcessor* processor = nullptr,
unsigned int sampleRate = 0,
unsigned int sampleSize = 0,
unsigned int channels = 0)
: ::AudioStream{buffer, processor, sampleRate, sampleSize, channels} {}
/**
* Init audio stream (to stream raw audio PCM data).
*
* @throws raylib::RaylibException Throws if the AudioStream failed to load.
*/
AudioStreamUnmanaged(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels = 2) {
Load(sampleRate, sampleSize, channels);
}
GETTER(rAudioBuffer*, Buffer, buffer)
GETTER(rAudioProcessor*, Processor, processor)
GETTER(unsigned int, SampleRate, sampleRate)
GETTER(unsigned int, SampleSize, sampleSize)
GETTER(unsigned int, Channels, channels)
AudioStreamUnmanaged& operator=(const ::AudioStream& stream) {
set(stream);
return *this;
}
/**
* Load audio stream (to stream raw audio PCM data).
*
* Does NOT call Unload() first — that is the responsibility of the managed class.
*
* @throws raylib::RaylibException Throws if the AudioStream failed to load.
*/
void Load(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels = 2) {
set(::LoadAudioStream(sampleRate, sampleSize, channels));
if (!IsValid()) {
throw RaylibException("Failed to load audio stream");
}
}
/**
* Unload audio stream and free memory.
*/
void Unload() {
// Protect against calling UnloadAudioStream() twice.
if (buffer != nullptr) {
::UnloadAudioStream(*this);
buffer = nullptr;
}
}
/**
* Update audio stream buffers with data.
*/
AudioStreamUnmanaged& Update(const void* data, int samplesCount) {
::UpdateAudioStream(*this, data, samplesCount);
return *this;
}
/**
* Check if any audio stream buffers require refill.
*/
RLCPP_NODISCARD bool IsProcessed() const { return ::IsAudioStreamProcessed(*this); }
/**
* Play audio stream.
*/
AudioStreamUnmanaged& Play() {
::PlayAudioStream(*this);
return *this;
}
/**
* Pause audio stream.
*/
AudioStreamUnmanaged& Pause() {
::PauseAudioStream(*this);
return *this;
}
/**
* Resume audio stream.
*/
AudioStreamUnmanaged& Resume() {
::ResumeAudioStream(*this);
return *this;
}
/**
* Check if audio stream is playing.
*/
RLCPP_NODISCARD bool IsPlaying() const { return ::IsAudioStreamPlaying(*this); }
/**
* Stop audio stream.
*/
AudioStreamUnmanaged& Stop() {
::StopAudioStream(*this);
return *this;
}
/**
* Set volume for audio stream (1.0 is max level).
*/
AudioStreamUnmanaged& SetVolume(float volume = 1.0f) {
::SetAudioStreamVolume(*this, volume);
return *this;
}
/**
* Set pitch for audio stream (1.0 is base level).
*/
AudioStreamUnmanaged& SetPitch(float pitch) {
::SetAudioStreamPitch(*this, pitch);
return *this;
}
/**
* Set pan for audio stream (0.5 is centered).
*/
AudioStreamUnmanaged& SetPan(float pan = 0.5f) {
::SetAudioStreamPan(*this, pan);
return *this;
}
/**
* Default size for new audio streams.
*/
static void SetBufferSizeDefault(int size) { ::SetAudioStreamBufferSizeDefault(size); }
/**
* Audio thread callback to request new data.
*/
AudioStreamUnmanaged& SetCallback(::AudioCallback callback) {
::SetAudioStreamCallback(*this, callback);
return *this;
}
/**
* Attach audio stream processor to stream.
*/
AudioStreamUnmanaged& AttachProcessor(::AudioCallback processor) {
::AttachAudioStreamProcessor(*this, processor);
return *this;
}
/**
* Detach audio stream processor from stream.
*/
AudioStreamUnmanaged& DetachProcessor(::AudioCallback processor) {
::DetachAudioStreamProcessor(*this, processor);
return *this;
}
/**
* Retrieve whether or not the audio stream is ready.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsAudioStreamValid(*this); }
protected:
void set(const ::AudioStream& stream) {
buffer = stream.buffer;
processor = stream.processor;
sampleRate = stream.sampleRate;
sampleSize = stream.sampleSize;
channels = stream.channels;
}
};
} // namespace raylib
using RAudioStreamUnmanaged = raylib::AudioStreamUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_AUDIOSTREAMUNMANAGED_HPP_
+142
View File
@@ -0,0 +1,142 @@
#ifndef RAYLIB_CPP_INCLUDE_AUTOMATIONEVENTLIST_HPP_
#define RAYLIB_CPP_INCLUDE_AUTOMATIONEVENTLIST_HPP_
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* AutomationEventList management functions
*/
class AutomationEventList : public ::AutomationEventList {
public:
AutomationEventList(const ::AutomationEventList& automationEventList)
: ::AutomationEventList(automationEventList) {
// Nothing.
}
/**
* Load an empty automation events list.
*/
AutomationEventList() { set(::LoadAutomationEventList(0)); }
/**
* Load automation events list from file.
*
* @param fileName The file path to load the automation events list from.
*/
AutomationEventList(const char* fileName) { Load(fileName); }
AutomationEventList(const AutomationEventList&) = delete;
AutomationEventList(AutomationEventList&& other) noexcept {
set(other);
other.capacity = 0;
other.count = 0;
other.events = nullptr;
}
~AutomationEventList() { Unload(); }
GETTER(unsigned int, Capacity, capacity)
GETTER(unsigned int, Count, count)
GETTER(AutomationEvent*, Events, events)
AutomationEventList& operator=(const ::AutomationEventList& other) {
set(other);
return *this;
}
AutomationEventList& operator=(const AutomationEventList&) = delete;
AutomationEventList& operator=(AutomationEventList&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.capacity = 0;
other.count = 0;
other.events = nullptr;
return *this;
}
/**
* Load audio stream (to stream raw audio pcm data)
*
* @throws raylib::RaylibException Throws if the AutomationEventList failed to load.
*/
void Load(const char* fileName) {
Unload();
set(::LoadAutomationEventList(fileName));
if (!IsValid()) {
throw RaylibException("Failed to load automation event list");
}
}
/**
* Update audio stream buffers with data
*/
void Unload() {
if (!IsValid()) {
return;
}
// The function signature of UnloadAutomationEventList() changes from raylib 5.0.
#if RAYLIB_VERSION_MAJOR == 5
#if RAYLIB_VERSION_MINOR == 0
::UnloadAutomationEventList(this);
#elif RAYLIB_VERSION_MINOR >= 1
::UnloadAutomationEventList(*this);
#endif
#else
::UnloadAutomationEventList(*this);
#endif
}
bool IsValid() { return events != nullptr; }
bool Export(const char* fileName) { return ::ExportAutomationEventList(*this, fileName); }
void Set() { ::SetAutomationEventList(this); }
void SetBaseFrame(int frame) {
Set();
::SetAutomationEventBaseFrame(frame);
}
void StartRecording() {
Set();
::StartAutomationEventRecording();
}
void StopRecording() {
Set();
::StopAutomationEventRecording();
}
void Play(int index) {
if (index < 0 || static_cast<unsigned int>(index) >= this->count) {
return;
}
Set();
::PlayAutomationEvent(this->events[index]);
}
protected:
void set(const ::AutomationEventList& other) {
capacity = other.capacity;
count = other.count;
events = other.events;
}
};
} // namespace raylib
using RAutomationEventList = raylib::AutomationEventList;
#endif // RAYLIB_CPP_INCLUDE_AUTOMATIONEVENTLIST_HPP_
+83
View File
@@ -0,0 +1,83 @@
#ifndef RAYLIB_CPP_INCLUDE_BOUNDINGBOX_HPP_
#define RAYLIB_CPP_INCLUDE_BOUNDINGBOX_HPP_
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Bounding box type
*/
class BoundingBox : public ::BoundingBox {
public:
/*
* Copy a bounding box from another bounding box.
*/
constexpr BoundingBox(const ::BoundingBox& box) : ::BoundingBox{box.min, box.max} {
// Nothing.
}
/**
* Compute mesh bounding box limits
*/
BoundingBox(const ::Mesh& mesh) { set(::GetMeshBoundingBox(mesh)); }
constexpr BoundingBox(::Vector3 minMax = ::Vector3{0.0f, 0.0f, 0.0f}) : ::BoundingBox{minMax, minMax} {}
constexpr BoundingBox(::Vector3 min, ::Vector3 max) : ::BoundingBox{min, max} {}
GETTERSETTER(::Vector3, Min, min)
GETTERSETTER(::Vector3, Max, max)
BoundingBox& operator=(const ::BoundingBox& box) {
set(box);
return *this;
}
[[nodiscard]] std::string ToString() const {
return TextFormat(
"BoundingBox(min=(%f, %f, %f), max=(%f, %f, %f))",
min.x, min.y, min.z, max.x, max.y, max.z
);
}
operator std::string() const { return ToString(); }
/**
* Draw a bounding box with wires
*/
void Draw(::Color color = {255, 255, 255, 255}) const { ::DrawBoundingBox(*this, color); }
/**
* Detect collision between two boxes
*/
RLCPP_NODISCARD bool CheckCollision(const ::BoundingBox& box2) const { return CheckCollisionBoxes(*this, box2); }
/**
* Detect collision between box and sphere
*/
RLCPP_NODISCARD bool CheckCollision(::Vector3 center, float radius) const { return CheckCollisionBoxSphere(*this, center, radius); }
/**
* Detect collision between ray and bounding box
*/
RLCPP_NODISCARD bool CheckCollision(const ::Ray& ray) const { return GetRayCollisionBox(ray, *this).hit; }
/**
* Get collision information between ray and bounding box
*/
RayCollision GetCollision(const ::Ray& ray) const { return GetRayCollisionBox(ray, *this); }
protected:
void set(const ::BoundingBox& box) {
min = box.min;
max = box.max;
}
void set(const ::Vector3& _min, const ::Vector3& _max) {
min = _min;
max = _max;
}
};
} // namespace raylib
using RBoundingBox = raylib::BoundingBox;
#endif // RAYLIB_CPP_INCLUDE_BOUNDINGBOX_HPP_
+67
View File
@@ -0,0 +1,67 @@
add_library(raylib_cpp INTERFACE)
set(RAYLIB_CPP_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/AudioDevice.hpp
${CMAKE_CURRENT_SOURCE_DIR}/AudioStream.hpp
${CMAKE_CURRENT_SOURCE_DIR}/AutomationEventList.hpp
${CMAKE_CURRENT_SOURCE_DIR}/BoundingBox.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Camera2D.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Camera3D.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Color.hpp
${CMAKE_CURRENT_SOURCE_DIR}/FileData.hpp
${CMAKE_CURRENT_SOURCE_DIR}/FileText.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Font.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Functions.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Gamepad.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Image.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Keyboard.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Material.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Matrix.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Mesh.hpp
${CMAKE_CURRENT_SOURCE_DIR}/MeshUnmanaged.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Model.hpp
${CMAKE_CURRENT_SOURCE_DIR}/ModelAnimation.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Mouse.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Music.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Quaternion.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Ray.hpp
${CMAKE_CURRENT_SOURCE_DIR}/RayCollision.hpp
${CMAKE_CURRENT_SOURCE_DIR}/RaylibException.hpp
${CMAKE_CURRENT_SOURCE_DIR}/raylib-cpp-utils.hpp
${CMAKE_CURRENT_SOURCE_DIR}/raylib-cpp.hpp
${CMAKE_CURRENT_SOURCE_DIR}/raylib.hpp
${CMAKE_CURRENT_SOURCE_DIR}/raymath.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Rectangle.hpp
${CMAKE_CURRENT_SOURCE_DIR}/RenderTexture.hpp
${CMAKE_CURRENT_SOURCE_DIR}/ShaderUnmanaged.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Shader.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Sound.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Text.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Texture.hpp
${CMAKE_CURRENT_SOURCE_DIR}/TextureUnmanaged.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Touch.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Vector2.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Vector3.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Vector4.hpp
${CMAKE_CURRENT_SOURCE_DIR}/VrStereoConfig.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Wave.hpp
${CMAKE_CURRENT_SOURCE_DIR}/Window.hpp
)
# Include Directory
target_include_directories(raylib_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/)
# Set the header files as install files.
install(FILES
${RAYLIB_CPP_HEADERS}
DESTINATION include
)
if (RAYLIB_CPP_IS_MAIN)
# @TODO: add examples files
add_custom_target(format
COMMAND clang-format
-i
${RAYLIB_CPP_HEADERS}
)
endif()
+68
View File
@@ -0,0 +1,68 @@
#ifndef RAYLIB_CPP_INCLUDE_CAMERA2D_HPP_
#define RAYLIB_CPP_INCLUDE_CAMERA2D_HPP_
#include "./Vector2.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Camera2D type, defines a 2d camera
*/
class Camera2D : public ::Camera2D {
public:
Camera2D(const ::Camera2D& camera)
: ::Camera2D(camera) {
// Nothing.
}
Camera2D(::Vector2 offset = {}, ::Vector2 target = {}, float rotation = 0.0f, float zoom = 1.0f)
: ::Camera2D{offset, target, rotation, zoom} {}
Camera2D& BeginMode() {
::BeginMode2D(*this);
return *this;
}
Camera2D& EndMode() {
::EndMode2D();
return *this;
}
GETTERSETTER(::Vector2, Offset, offset)
GETTERSETTER(::Vector2, Target, target)
GETTERSETTER(float, Rotation, rotation)
GETTERSETTER(float, Zoom, zoom)
Camera2D& operator=(const ::Camera2D& camera) {
set(camera);
return *this;
}
/**
* Returns camera 2d transform matrix
*/
RLCPP_NODISCARD Matrix GetMatrix() const { return ::GetCameraMatrix2D(*this); }
/**
* Returns the world space position for a 2d camera screen space position
*/
RLCPP_NODISCARD Vector2 GetScreenToWorld(::Vector2 position) const { return ::GetScreenToWorld2D(position, *this); }
/**
* Returns the screen space position for a 2d world space position
*/
RLCPP_NODISCARD Vector2 GetWorldToScreen(::Vector2 position) const { return ::GetWorldToScreen2D(position, *this); }
protected:
void set(const ::Camera2D& camera) {
offset = camera.offset;
target = camera.target;
rotation = camera.rotation;
zoom = camera.zoom;
}
};
} // namespace raylib
using RCamera2D = raylib::Camera2D;
#endif // RAYLIB_CPP_INCLUDE_CAMERA2D_HPP_
+146
View File
@@ -0,0 +1,146 @@
#ifndef RAYLIB_CPP_INCLUDE_CAMERA3D_HPP_
#define RAYLIB_CPP_INCLUDE_CAMERA3D_HPP_
#include "./Vector3.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Camera type, defines a camera position/orientation in 3d space
*/
class Camera3D : public ::Camera3D {
public:
Camera3D(const ::Camera3D& camera) : ::Camera3D(camera) { }
/**
* Create a new Camera3D.
*
* @param position Camera position
* @param target Camera target it looks-at
* @param up Camera up vector (rotation over its axis)
* @param fovy Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in
* orthographic
* @param projection Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC
*/
Camera3D(
::Vector3 position = ::Vector3{0.0f, 0.0f, 0.0f},
::Vector3 target = ::Vector3{0.0f, 0.0f, -1.0f},
::Vector3 up = ::Vector3{0.0f, 1.0f, 0.0f},
float fovy = 45.0f,
int projection = CAMERA_PERSPECTIVE)
: ::Camera3D{position, target, up, fovy, projection} {}
GETTERSETTER(::Vector3, Position, position)
GETTERSETTER(::Vector3, Target, target)
GETTERSETTER(::Vector3, Up, up)
GETTERSETTER(float, Fovy, fovy)
GETTERSETTER(int, Projection, projection)
Camera3D& operator=(const ::Camera3D& camera) {
set(camera);
return *this;
}
[[nodiscard]] std::string ToString() const {
return TextFormat(
"Camera3D(position=(%f, %f, %f), target=(%f, %f, %f), fovy=%f)",
position.x, position.y, position.z,
target.x, target.y, target.z,
fovy
);
}
operator std::string() const { return ToString(); }
/**
* Initializes 3D mode with custom camera (3D)
*/
Camera3D& BeginMode() {
::BeginMode3D(*this);
return *this;
}
/**
* Ends 3D mode and returns to default 2D orthographic mode
*/
Camera3D& EndMode() {
::EndMode3D();
return *this;
}
/**
* Get camera transform matrix (view matrix)
*/
Matrix GetMatrix() const { return ::GetCameraMatrix(*this); }
/**
* Update camera position for selected mode
*/
Camera3D& Update(int mode) {
::UpdateCamera(this, mode);
return *this;
}
/**
* Update camera movement/rotation
*/
Camera3D& Update(::Vector3 movement, ::Vector3 rotation, float zoom = 1.0f) {
::UpdateCameraPro(this, movement, rotation, zoom);
return *this;
}
/**
* Returns a ray trace from mouse position
*/
Ray GetMouseRay(::Vector2 mousePosition) const { return ::GetMouseRay(mousePosition, *this); }
/**
* Returns the screen space position for a 3d world space position
*/
Vector2 GetWorldToScreen(::Vector3 position) const { return ::GetWorldToScreen(position, *this); }
/**
* Get a ray trace from screen position (i.e mouse) in a viewport
*/
Ray GetScreenToWorldRay(::Vector2 position, int width, int height) {
return ::GetScreenToWorldRayEx(position, *this, width, height);
}
/**
* Draw a billboard texture.
*/
void
DrawBillboard(const ::Texture2D& texture, ::Vector3 center, float size, ::Color tint = {255, 255, 255, 255}) const {
::DrawBillboard(*this, texture, center, size, tint);
}
/**
* Draw a billboard texture defined by source.
*/
void DrawBillboard(
const ::Texture2D& texture,
::Rectangle sourceRec,
::Vector3 center,
::Vector2 size,
::Color tint = {255, 255, 255, 255}) const {
::DrawBillboardRec(*this, texture, sourceRec, center, size, tint);
}
protected:
void set(const ::Camera3D& camera) {
position = camera.position;
target = camera.target;
up = camera.up;
fovy = camera.fovy;
projection = camera.projection;
}
};
using Camera = Camera3D;
} // namespace raylib
using RCamera = raylib::Camera;
using RCamera3D = raylib::Camera3D;
#endif // RAYLIB_CPP_INCLUDE_CAMERA3D_HPP_
+259
View File
@@ -0,0 +1,259 @@
#ifndef RAYLIB_CPP_INCLUDE_COLOR_HPP_
#define RAYLIB_CPP_INCLUDE_COLOR_HPP_
#include <string>
#include "./Vector4.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Color type, RGBA (32bit)
*/
class Color : public ::Color {
public:
constexpr Color(const ::Color& color) : ::Color{color.r, color.g, color.b, color.a} {}
constexpr Color(unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha = 255)
: ::Color{red, green, blue, alpha} {};
/**
* Black.
*/
constexpr Color() : ::Color{0, 0, 0, 255} {};
/**
* Returns a Color from HSV values
*/
Color(::Vector3 hsv) { set(::ColorFromHSV(hsv.x, hsv.y, hsv.z)); }
/**
* Returns a Color from HSV values
*/
static ::Color FromHSV(float hue, float saturation, float value) { return ::ColorFromHSV(hue, saturation, value); }
/**
* Get Color structure from hexadecimal value
*/
explicit Color(unsigned int hexValue) : ::Color(::GetColor(hexValue)) { }
Color(void* srcPtr, int format) : ::Color(::GetPixelColor(srcPtr, format)) { }
/**
* Returns hexadecimal value for a Color
*/
RLCPP_NODISCARD int ToInt() const { return ::ColorToInt(*this); }
/**
* Returns hexadecimal value for a Color
*/
explicit operator int() const { return ::ColorToInt(*this); }
RLCPP_NODISCARD std::string ToString() const { return TextFormat("Color(%d, %d, %d, %d)", r, g, b, a); }
explicit operator std::string() const { return ToString(); }
/**
* Returns color with alpha applied, alpha goes from 0.0f to 1.0f
*/
RLCPP_NODISCARD Color Fade(float alpha) const { return ::Fade(*this, alpha); }
/**
* Returns Color normalized as float [0..1]
*/
RLCPP_NODISCARD Vector4 Normalize() const { return ::ColorNormalize(*this); }
/**
* Returns Color from normalized values [0..1]
*/
explicit Color(::Vector4 normalized) : Color(::ColorFromNormalized(normalized)) { }
/**
* Returns HSV values for a Color
*/
RLCPP_NODISCARD Vector3 ToHSV() const { return ::ColorToHSV(*this); }
GETTERSETTER(unsigned char, R, r)
GETTERSETTER(unsigned char, G, g)
GETTERSETTER(unsigned char, B, b)
GETTERSETTER(unsigned char, A, a)
Color& operator=(const ::Color& color) {
set(color);
return *this;
}
/**
* Set background color (framebuffer clear color)
*/
Color& ClearBackground() {
::ClearBackground(*this);
return *this;
}
void DrawPixel(int x, int y) const { ::DrawPixel(x, y, *this); }
/**
* Draw a pixel
*/
void DrawPixel(::Vector2 pos) const { ::DrawPixelV(pos, *this); }
/**
* Draw a line
*/
void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY) const {
::DrawLine(startPosX, startPosY, endPosX, endPosY, *this);
}
/**
* Draw a line using Vector points
*/
void DrawLine(::Vector2 startPos, ::Vector2 endPos) const { ::DrawLineV(startPos, endPos, *this); }
/**
* Draw a line using Vector points, with a given thickness
*/
void DrawLine(::Vector2 startPos, ::Vector2 endPos, float thick) const {
::DrawLineEx(startPos, endPos, thick, *this);
}
void DrawLineBezier(::Vector2 startPos, ::Vector2 endPos, float thick = 1.0f) const {
::DrawLineBezier(startPos, endPos, thick, *this);
}
void DrawLineStrip(::Vector2* points, int numPoints) const { ::DrawLineStrip(points, numPoints, *this); }
void DrawText(const char* text, int posX = 0, int posY = 0, int fontSize = 10.0f) const {
::DrawText(text, posX, posY, fontSize, *this);
}
void DrawText(const std::string& text, int posX = 0, int posY = 0, int fontSize = 10.0f) const {
::DrawText(text.c_str(), posX, posY, fontSize, *this);
}
void DrawText(const ::Font& font, const char* text, ::Vector2 position, float fontSize, float spacing) const {
::DrawTextEx(font, text, position, fontSize, spacing, *this);
}
void
DrawText(const ::Font& font, const std::string& text, ::Vector2 position, float fontSize, float spacing) const {
::DrawTextEx(font, text.c_str(), position, fontSize, spacing, *this);
}
void DrawText(
const ::Font& font,
const char* text,
::Vector2 position,
::Vector2 origin,
float rotation,
float fontSize,
float spacing) const {
::DrawTextPro(font, text, position, origin, rotation, fontSize, spacing, *this);
}
void DrawText(
const ::Font& font,
const std::string& text,
::Vector2 position,
::Vector2 origin,
float rotation,
float fontSize,
float spacing) const {
::DrawTextPro(font, text.c_str(), position, origin, rotation, fontSize, spacing, *this);
}
void DrawRectangle(int posX, int posY, int width, int height) const {
::DrawRectangle(posX, posY, width, height, *this);
}
void DrawRectangle(::Vector2 position, ::Vector2 size) const { ::DrawRectangleV(position, size, *this); }
void DrawRectangle(::Rectangle rec) const { ::DrawRectangleRec(rec, *this); }
void DrawRectangle(::Rectangle rec, ::Vector2 origin, float rotation) const {
::DrawRectanglePro(rec, origin, rotation, *this);
}
void DrawRectangleLines(int posX, int posY, int width, int height) const {
::DrawRectangleLines(posX, posY, width, height, *this);
}
void DrawRectangleLines(::Rectangle rec, float lineThick) const { ::DrawRectangleLinesEx(rec, lineThick, *this); }
bool IsEqual(::Color color) {
return ::ColorIsEqual(*this, color);
}
bool operator==(const ::Color& other) const { return ::ColorIsEqual(*this, other); }
bool operator!=(const ::Color& other) const { return !::ColorIsEqual(*this, other); }
/**
* Get color multiplied with another color
*/
Color Tint(::Color tint) { return ::ColorTint(*this, tint); }
/**
* Get color with brightness correction, brightness factor goes from -1.0f to 1.0f
*/
Color Brightness(float factor) { return ::ColorBrightness(*this, factor); }
/**
* Get color with contrast correction, contrast values between -1.0f and 1.0f
*/
Color Contrast(float contrast) { return ::ColorContrast(*this, contrast); }
/**
* Returns color with alpha applied, alpha goes from 0.0f to 1.0f
*/
RLCPP_NODISCARD Color Alpha(float alpha) const { return ::ColorAlpha(*this, alpha); }
Color Lerp(::Color color2, float factor) {
return ::ColorLerp(*this, color2, factor);
}
/**
* Returns src alpha-blended into dst color with tint
*/
RLCPP_NODISCARD Color AlphaBlend(::Color dst, ::Color tint) const { return ::ColorAlphaBlend(dst, *this, tint); }
static Color LightGray() { return LIGHTGRAY; }
static Color Gray() { return GRAY; }
static Color DarkGray() { return DARKGRAY; }
static Color Yellow() { return YELLOW; }
static Color Gold() { return GOLD; }
static Color Orange() { return ORANGE; }
static Color Pink() { return PINK; }
static Color Red() { return RED; }
static Color Maroon() { return MAROON; }
static Color Green() { return GREEN; }
static Color Lime() { return LIME; }
static Color DarkGreen() { return DARKGREEN; }
static Color SkyBlue() { return SKYBLUE; }
static Color Blue() { return BLUE; }
static Color DarkBlue() { return DARKBLUE; }
static Color Purple() { return PURPLE; }
static Color Violet() { return VIOLET; }
static Color DarkPurple() { return DARKPURPLE; }
static Color Beige() { return BEIGE; }
static Color Brown() { return BROWN; }
static Color DarkBrown() { return DARKBROWN; }
static Color White() { return WHITE; }
static Color Black() { return BLACK; }
static Color Blank() { return BLANK; }
static Color Magenta() { return MAGENTA; }
static Color RayWhite() { return RAYWHITE; }
protected:
void set(const ::Color& color) {
r = color.r;
g = color.g;
b = color.b;
a = color.a;
}
};
} // namespace raylib
using RColor = raylib::Color;
#endif // RAYLIB_CPP_INCLUDE_COLOR_HPP_
+55
View File
@@ -0,0 +1,55 @@
#ifndef RAYLIB_CPP_INCLUDE_FILEDATA_HPP_
#define RAYLIB_CPP_INCLUDE_FILEDATA_HPP_
#include <string>
#include <utility>
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
class FileData {
public:
FileData() = default;
FileData(const FileData&) = delete;
FileData(FileData&& other) noexcept : data(other.data), bytesRead(other.bytesRead) {
other.data = nullptr;
other.bytesRead = 0;
}
FileData& operator=(const FileData&) = delete;
FileData& operator=(FileData&& other) noexcept {
std::swap(data, other.data);
std::swap(bytesRead, other.bytesRead);
return *this;
}
~FileData() { Unload(); }
explicit FileData(const std::string& fileName) { Load(fileName); }
GETTER(const unsigned char*, Data, data)
GETTER(int, BytesRead, bytesRead)
void Load(const std::string& fileName) { Load(fileName.c_str()); }
void Load(const char* fileName) {
Unload();
data = ::LoadFileData(fileName, &bytesRead);
}
void Unload() {
if (data != nullptr) {
::UnloadFileData(data);
data = nullptr;
bytesRead = 0;
}
}
private:
unsigned char* data{nullptr};
int bytesRead{0};
};
} // namespace raylib
using RFileData = raylib::FileData;
#endif // RAYLIB_CPP_INCLUDE_FILEDATA_HPP_
+60
View File
@@ -0,0 +1,60 @@
#ifndef RAYLIB_CPP_INCLUDE_FILETEXT_HPP_
#define RAYLIB_CPP_INCLUDE_FILETEXT_HPP_
#include <string>
#include <utility>
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
class FileText {
public:
FileText() = default;
FileText(const FileText&) = delete;
FileText(FileText&& other) noexcept : data(other.data), length(other.length) {
other.data = nullptr;
other.length = 0;
}
FileText& operator=(const FileText&) = delete;
FileText& operator=(FileText&& other) noexcept {
std::swap(data, other.data);
std::swap(length, other.length);
return *this;
}
~FileText() { Unload(); }
explicit FileText(const std::string& fileName) { Load(fileName); }
GETTER(const char*, Data, data)
GETTER(unsigned int, Length, length)
RLCPP_NODISCARD const char* c_str() const { return data; }
RLCPP_NODISCARD std::string ToString() const { return data; }
explicit operator std::string() const { return data; }
void Load(const std::string& fileName) { Load(fileName.c_str()); }
void Load(const char* fileName) {
data = ::LoadFileText(fileName);
length = ::TextLength(data);
}
void Unload() {
if (data != nullptr) {
::UnloadFileText(data);
data = nullptr;
length = 0;
}
}
private:
char* data{nullptr};
unsigned int length{0};
};
} // namespace raylib
using RFileText = raylib::FileText;
#endif // RAYLIB_CPP_INCLUDE_FILETEXT_HPP_
+84
View File
@@ -0,0 +1,84 @@
#ifndef RAYLIB_CPP_INCLUDE_FONT_HPP_
#define RAYLIB_CPP_INCLUDE_FONT_HPP_
#include "./FontUnmanaged.hpp"
namespace raylib {
/**
* Font type, includes texture and charSet array data.
*
* The font will be unloaded on object destruction. Use raylib::FontUnmanaged if you're looking to not unload.
*
* @see raylib::FontUnmanaged
*/
class Font : public FontUnmanaged {
public:
using FontUnmanaged::FontUnmanaged;
Font(const Font&) = delete;
Font& operator=(const Font&) = delete;
Font(Font&& other) noexcept {
set(other);
other.baseSize = 0;
other.glyphCount = 0;
other.glyphPadding = 0;
other.texture = {};
other.recs = nullptr;
other.glyphs = nullptr;
}
Font& operator=(Font&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.baseSize = 0;
other.glyphCount = 0;
other.glyphPadding = 0;
other.texture = {};
other.recs = nullptr;
other.glyphs = nullptr;
return *this;
}
Font& operator=(const ::Font& font) {
Unload();
set(font);
return *this;
}
~Font() { Unload(); }
void Load(const std::string& fileName) {
Unload();
FontUnmanaged::Load(fileName);
}
void Load(const std::string& fileName, int fontSize, const int* codepoints = nullptr, int codepointCount = 0) {
Unload();
FontUnmanaged::Load(fileName, fontSize, codepoints, codepointCount);
}
void Load(const ::Image& image, ::Color key, int firstChar) {
Unload();
FontUnmanaged::Load(image, key, firstChar);
}
void Load(
const std::string& fileType,
const unsigned char* fileData,
int dataSize,
int fontSize,
const int* codepoints,
int codepointCount) {
Unload();
FontUnmanaged::Load(fileType, fileData, dataSize, fontSize, codepoints, codepointCount);
}
};
} // namespace raylib
using RFont = raylib::Font;
#endif // RAYLIB_CPP_INCLUDE_FONT_HPP_
+312
View File
@@ -0,0 +1,312 @@
#ifndef RAYLIB_CPP_INCLUDE_FONTUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_FONTUNMANAGED_HPP_
#include <string>
#include "./RaylibException.hpp"
#include "./TextureUnmanaged.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* A Font that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::Font.
*
* @see raylib::Font
*/
class FontUnmanaged : public ::Font {
public:
FontUnmanaged(
int baseSize,
int glyphCount,
int glyphPadding,
::Texture2D texture,
::Rectangle* recs = nullptr,
::GlyphInfo* glyphs = nullptr)
: ::Font{baseSize, glyphCount, glyphPadding, texture, recs, glyphs} {
// Nothing.
}
/**
* Retrieves the default Font.
*/
FontUnmanaged() : ::Font(::GetFontDefault()) {}
/**
* Creates a FontUnmanaged from an existing Font struct.
*/
FontUnmanaged(const ::Font& font) : ::Font(font) {}
/**
* Loads a Font from the given file.
*
* @throws raylib::RaylibException Throws if the given font failed to initialize.
*/
FontUnmanaged(const std::string& fileName) { Load(fileName); }
/**
* Loads a Font from the given file, with generation parameters.
*
* @throws raylib::RaylibException Throws if the given font failed to initialize.
*/
FontUnmanaged(const std::string& fileName, int fontSize, const int* codepoints = nullptr, int codepointCount = 0) {
Load(fileName, fontSize, codepoints, codepointCount);
}
/**
* Loads a Font from the given image with a color key.
*
* @throws raylib::RaylibException Throws if the given font failed to initialize.
*/
FontUnmanaged(const ::Image& image, ::Color key, int firstChar) { Load(image, key, firstChar); }
/**
* Loads a font from memory, based on the given file type and file data.
*
* @throws raylib::RaylibException Throws if the given font failed to initialize.
*/
FontUnmanaged(
const std::string& fileType,
const unsigned char* fileData,
int dataSize,
int fontSize,
const int* codepoints,
int codepointCount) {
Load(fileType, fileData, dataSize, fontSize, codepoints, codepointCount);
}
GETTER(int, BaseSize, baseSize)
GETTER(int, GlyphCount, glyphCount)
GETTER(int, GlyphPadding, glyphPadding)
GETTER(::Rectangle*, Recs, recs)
GETTER(::GlyphInfo*, Glyphs, glyphs)
/**
* Get the texture atlas containing the glyphs.
*/
TextureUnmanaged GetTexture() { return texture; }
RLCPP_NODISCARD TextureUnmanaged GetTexture() const { return texture; }
/**
* Set the texture atlas containing the glyphs.
*/
void SetTexture(const ::Texture& newTexture) { texture = newTexture; }
FontUnmanaged& operator=(const ::Font& font) {
set(font);
return *this;
}
/**
* Loads a font from a given file.
*
* @throws raylib::RaylibException Throws if the given font failed to initialize.
*/
void Load(const std::string& fileName) {
set(::LoadFont(fileName.c_str()));
if (!IsValid()) {
throw RaylibException("Failed to load Font with from file: " + fileName);
}
}
/**
* Loads a font from a given file with generation parameters.
*
* @throws raylib::RaylibException Throws if the given font failed to initialize.
*/
void Load(const std::string& fileName, int fontSize, const int* codepoints = nullptr, int codepointCount = 0) {
set(::LoadFontEx(fileName.c_str(), fontSize, codepoints, codepointCount));
if (!IsValid()) {
throw RaylibException("Failed to load Font with from file with font size: " + fileName);
}
}
/**
* Loads a font from an image with a color key.
*
* @throws raylib::RaylibException Throws if the given font failed to initialize.
*/
void Load(const ::Image& image, ::Color key, int firstChar) {
set(::LoadFontFromImage(image, key, firstChar));
if (!IsValid()) {
throw RaylibException("Failed to load Font with from image");
}
}
/**
* Loads a font from memory.
*
* @throws raylib::RaylibException Throws if the given font failed to initialize.
*/
void Load(
const std::string& fileType,
const unsigned char* fileData,
int dataSize,
int fontSize,
const int* codepoints,
int codepointCount) {
set(::LoadFontFromMemory(fileType.c_str(), fileData, dataSize, fontSize, codepoints, codepointCount));
if (!IsValid()) {
throw RaylibException("Failed to load Font " + fileType + " with from file data");
}
}
/**
* Unload font from memory.
*/
void Unload() {
// Protect against calling UnloadFont() twice.
if (baseSize != 0) {
::UnloadFont(*this);
baseSize = 0;
}
}
/**
* Returns if the font is ready to be used.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsFontValid(*this); }
/**
* Draw text using font and additional parameters.
*/
void DrawText(const char* text, ::Vector2 position, float fontSize, float spacing, ::Color tint = WHITE) const {
::DrawTextEx(*this, text, position, fontSize, spacing, tint);
}
/**
* Draw text using font and additional parameters.
*/
void DrawText(
const std::string& text,
::Vector2 position,
float fontSize,
float spacing,
::Color tint = WHITE) const {
::DrawTextEx(*this, text.c_str(), position, fontSize, spacing, tint);
}
/**
* Draw text using font and additional parameters.
*/
void DrawText(const char* text, int posX, int posY, float fontSize, float spacing, ::Color tint = WHITE) const {
::DrawTextEx(*this, text, {static_cast<float>(posX), static_cast<float>(posY)}, fontSize, spacing, tint);
}
/**
* Draw text using font and additional parameters.
*/
void DrawText(
const std::string& text,
int posX,
int posY,
float fontSize,
float spacing,
::Color tint = WHITE) const {
::DrawTextEx(
*this,
text.c_str(),
{static_cast<float>(posX), static_cast<float>(posY)},
fontSize,
spacing,
tint);
}
/**
* Draw text using font with pro parameters (rotation).
*/
void DrawText(
const char* text,
::Vector2 position,
::Vector2 origin,
float rotation,
float fontSize,
float spacing,
::Color tint = WHITE) const {
::DrawTextPro(*this, text, position, origin, rotation, fontSize, spacing, tint);
}
/**
* Draw text using font with pro parameters (rotation).
*/
void DrawText(
const std::string& text,
::Vector2 position,
::Vector2 origin,
float rotation,
float fontSize,
float spacing,
::Color tint = WHITE) const {
::DrawTextPro(*this, text.c_str(), position, origin, rotation, fontSize, spacing, tint);
}
/**
* Draw one character (codepoint).
*/
void DrawText(int codepoint, ::Vector2 position, float fontSize, ::Color tint = {255, 255, 255, 255}) const {
::DrawTextCodepoint(*this, codepoint, position, fontSize, tint);
}
/**
* Draw multiple characters (codepoints).
*/
void DrawText(
const int* codepoints,
int count,
::Vector2 position,
float fontSize,
float spacing,
::Color tint = {255, 255, 255, 255}) const {
::DrawTextCodepoints(*this, codepoints, count, position, fontSize, spacing, tint);
}
/**
* Measure string size for Font.
*/
RLCPP_NODISCARD Vector2 MeasureText(const char* text, float fontSize, float spacing) const {
return ::MeasureTextEx(*this, text, fontSize, spacing);
}
/**
* Measure string size for Font.
*/
RLCPP_NODISCARD Vector2 MeasureText(const std::string& text, float fontSize, float spacing) const {
return ::MeasureTextEx(*this, text.c_str(), fontSize, spacing);
}
/**
* Get index position for a unicode character on font.
*/
RLCPP_NODISCARD int GetGlyphIndex(int character) const { return ::GetGlyphIndex(*this, character); }
/**
* Create an image from text (custom sprite font).
*/
RLCPP_NODISCARD ::Image ImageText(const char* text, float fontSize, float spacing, ::Color tint) const {
return ::ImageTextEx(*this, text, fontSize, spacing, tint);
}
/**
* Create an image from text (custom sprite font).
*/
RLCPP_NODISCARD ::Image ImageText(const std::string& text, float fontSize, float spacing, ::Color tint) const {
return ::ImageTextEx(*this, text.c_str(), fontSize, spacing, tint);
}
protected:
void set(const ::Font& font) {
baseSize = font.baseSize;
glyphCount = font.glyphCount;
glyphPadding = font.glyphPadding;
texture = font.texture;
recs = font.recs;
glyphs = font.glyphs;
}
};
} // namespace raylib
using RFontUnmanaged = raylib::FontUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_FONTUNMANAGED_HPP_
+464
View File
@@ -0,0 +1,464 @@
/**
* C++ wrapper functions for raylib.
*/
#ifndef RAYLIB_CPP_INCLUDE_FUNCTIONS_HPP_
#define RAYLIB_CPP_INCLUDE_FUNCTIONS_HPP_
#include <string>
#include <vector>
#include "./raylib.hpp"
/**
* Allow changing the declare type for all raylib-cpp global functions. Defaults to static.
*/
#ifndef RLCPPAPI
#define RLCPPAPI static
#endif
namespace raylib {
/**
* Initialize window and OpenGL context
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void InitWindow(int width, int height, const std::string& title = "raylib") {
::InitWindow(width, height, title.c_str());
}
/**
* Set title for window
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetWindowTitle(const std::string& title) {
::SetWindowTitle(title.c_str());
}
/**
* Get the human-readable, UTF-8 encoded name of the primary monitor
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string GetMonitorName(int monitor = 0) {
return ::GetMonitorName(monitor);
}
/**
* Set clipboard text content
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetClipboardText(const std::string& text) {
::SetClipboardText(text.c_str());
}
/**
* Get clipboard text content
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string GetClipboardText() {
return ::GetClipboardText();
}
/**
* Takes a screenshot of current screen (saved a .png)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void TakeScreenshot(const std::string& fileName) {
::TakeScreenshot(fileName.c_str());
}
/**
* Get gamepad internal name id
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string GetGamepadName(int gamepad) {
return ::GetGamepadName(gamepad);
}
/**
* Load text data from file (read)
*/
RLCPP_MAYBEUNUSED RLCPPAPI std::string LoadFileText(const std::string& fileName) {
char* text = ::LoadFileText(fileName.c_str());
std::string output(text);
::UnloadFileText(text);
return output;
}
/**
* Save text data to file (write)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool SaveFileText(const std::string& fileName, const std::string& text) {
return ::SaveFileText(fileName.c_str(), text.c_str());
}
/**
* Check if file exists
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool FileExists(const std::string& fileName) {
return ::FileExists(fileName.c_str());
}
/**
* Check if directory path exists
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool DirectoryExists(const std::string& dirPath) {
return ::DirectoryExists(dirPath.c_str());
}
/**
* Check file extension (including point: .png, .wav)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsFileExtension(const std::string& fileName, const std::string& ext) {
return ::IsFileExtension(fileName.c_str(), ext.c_str());
}
/**
* Get pointer to extension for a filename string (including point: ".png")
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string GetFileExtension(const std::string& fileName) {
return ::GetFileExtension(fileName.c_str());
}
/**
* Get pointer to filename for a path string
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string GetFileName(const std::string& filePath) {
return ::GetFileName(filePath.c_str());
}
/**
* Get filename string without extension
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string GetFileNameWithoutExt(const std::string& filePath) {
return ::GetFileNameWithoutExt(filePath.c_str());
}
/**
* Get full path for a given fileName with path
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string GetDirectoryPath(const std::string& filePath) {
return ::GetDirectoryPath(filePath.c_str());
}
/**
* Get previous directory path for a given path
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string GetPrevDirectoryPath(const std::string& dirPath) {
return ::GetPrevDirectoryPath(dirPath.c_str());
}
/**
* Get current working directory
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string GetWorkingDirectory() {
return ::GetWorkingDirectory();
}
/**
* Get filenames in a directory path
*/
RLCPP_MAYBEUNUSED RLCPPAPI std::vector<std::string> LoadDirectoryFiles(const std::string& dirPath) {
FilePathList files = ::LoadDirectoryFiles(dirPath.c_str());
std::vector<std::string> output(files.paths, files.paths + files.count);
::UnloadDirectoryFiles(files);
return output;
}
/**
* Load directory filepaths with extension filtering and optional subdirectory scanning
*/
RLCPP_MAYBEUNUSED RLCPPAPI std::vector<std::string>
LoadDirectoryFilesEx(const std::string& basePath, const std::string& filter, bool scanSubdirs = false) {
FilePathList files = ::LoadDirectoryFilesEx(basePath.c_str(), filter.c_str(), scanSubdirs);
std::vector<std::string> output(files.paths, files.paths + files.count);
::UnloadDirectoryFiles(files);
return output;
}
/**
* Change working directory, return true on success
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool ChangeDirectory(const std::string& dir) {
return ::ChangeDirectory(dir.c_str());
}
/**
* Get dropped files names
*/
RLCPP_MAYBEUNUSED RLCPPAPI std::vector<std::string> LoadDroppedFiles() {
if (!::IsFileDropped()) {
return std::vector<std::string>();
}
FilePathList files = ::LoadDroppedFiles();
std::vector<std::string> output(files.paths, files.paths + files.count);
::UnloadDroppedFiles(files);
return output;
}
/**
* Get file modification time (last write time)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline long GetFileModTime(const std::string& fileName) { // NOLINT
return ::GetFileModTime(fileName.c_str());
}
/**
* Open URL with default system browser (if available)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void OpenURL(const std::string& url) {
return ::OpenURL(url.c_str());
}
/**
* Load an image.
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline ::Image LoadImage(const std::string& fileName) {
return ::LoadImage(fileName.c_str());
}
/**
* Load an image from RAW file data
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline ::Image
LoadImageRaw(const std::string& fileName, int width, int height, int format, int headerSize) {
return ::LoadImageRaw(fileName.c_str(), width, height, format, headerSize);
}
/**
* Load animated image data
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline ::Image LoadImageAnim(const std::string& fileName, int* frames) {
return ::LoadImageAnim(fileName.c_str(), frames);
}
/**
* Load image from memory buffer, fileType refers to extension like "png"
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline ::Image
LoadImageFromMemory(const std::string& fileType, const unsigned char* fileData, int dataSize) {
return ::LoadImageFromMemory(fileType.c_str(), fileData, dataSize);
}
/**
* Export image data to file
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool ExportImage(const Image& image, const std::string& fileName) {
return ::ExportImage(image, fileName.c_str());
}
/**
* Export image as code file (.h) defining an array of bytes
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool ExportImageAsCode(const Image& image, const std::string& fileName) {
return ::ExportImageAsCode(image, fileName.c_str());
}
/**
* Draw text (using default font)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void DrawText(const char* text, int posX, int posY, int fontSize, ::Color color) {
::DrawText(text, posX, posY, fontSize, color);
}
/**
* Draw text (using default font)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void
DrawText(const std::string& text, int posX, int posY, int fontSize, ::Color color) {
::DrawText(text.c_str(), posX, posY, fontSize, color);
}
/**
* Draw text using font and additional parameters
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void
DrawTextEx(const Font& font, const char* text, Vector2 position, float fontSize, float spacing, ::Color tint) {
::DrawTextEx(font, text, position, fontSize, spacing, tint);
}
/**
* Draw text using font and additional parameters
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void
DrawTextEx(const Font& font, const std::string& text, Vector2 position, float fontSize, float spacing, ::Color tint) {
::DrawTextEx(font, text.c_str(), position, fontSize, spacing, tint);
}
/**
* Draw text using Font and pro parameters (rotation)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void DrawTextPro(
const Font& font,
const char* text,
Vector2 position,
Vector2 origin,
float rotation,
float fontSize,
float spacing,
::Color tint) {
::DrawTextPro(font, text, position, origin, rotation, fontSize, spacing, tint);
}
/**
* Draw text using Font and pro parameters (rotation)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void DrawTextPro(
const Font& font,
const std::string& text,
Vector2 position,
Vector2 origin,
float rotation,
float fontSize,
float spacing,
::Color tint) {
::DrawTextPro(font, text.c_str(), position, origin, rotation, fontSize, spacing, tint);
}
/**
* Load font from file (filename must include file extension)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline ::Font LoadFont(const std::string& fileName) {
return ::LoadFont(fileName.c_str());
}
/**
* Load font from file (filename must include file extension)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline ::Font
LoadFontEx(const std::string& fileName, int fontSize, const int* codepoints = nullptr, int codepointCount = 0) {
return ::LoadFontEx(fileName.c_str(), fontSize, codepoints, codepointCount);
}
/**
* Measure string width for default font
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int MeasureText(const char* text, int fontSize) {
return ::MeasureText(text, fontSize);
}
/**
* Measure string width for default font
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int MeasureText(const std::string& text, int fontSize) {
return ::MeasureText(text.c_str(), fontSize);
}
/**
* Check if two text string are equal
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool TextIsEqual(const char* text1, const char* text2) {
return ::TextIsEqual(text1, text2);
}
/**
* Check if two text string are equal
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool TextIsEqual(const std::string& text1, const std::string& text2) {
return ::TextIsEqual(text1.c_str(), text2.c_str());
}
/**
* Get text length, checks for '\0' ending
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline unsigned int TextLength(const char* text) {
return ::TextLength(text);
}
/**
* Get text length, checks for '\0' ending
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline unsigned int TextLength(const std::string& text) {
return ::TextLength(text.c_str());
}
/**
* Get a piece of a text string
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string TextSubtext(const std::string& text, int position, int length) {
return ::TextSubtext(text.c_str(), position, length);
}
/**
* Replace text string
*/
RLCPP_MAYBEUNUSED RLCPPAPI std::string
TextReplace(const std::string& text, const std::string& replace, const std::string& by) {
const char* output = ::TextReplace(text.c_str(), replace.c_str(), by.c_str());
if (output != NULL) {
return std::string(output);
}
return "";
}
/**
* Insert text in a position
*/
RLCPP_MAYBEUNUSED RLCPPAPI std::string TextInsert(const std::string& text, const std::string& insert, int position) {
const char* output = ::TextInsert(text.c_str(), insert.c_str(), position);
if (output != NULL) {
return std::string(output);
}
return "";
}
/**
* Split text into multiple strings
*/
RLCPP_MAYBEUNUSED RLCPPAPI std::vector<std::string> TextSplit(const std::string& text, char delimiter) {
int count;
const char* const* split = ::TextSplit(text.c_str(), delimiter, &count);
return std::vector<std::string>(split, split + count);
}
/**
* Find first text occurrence within a string
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int TextFindIndex(const std::string& text, const std::string& find) {
return ::TextFindIndex(text.c_str(), find.c_str());
}
/**
* Get upper case version of provided string
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string TextToUpper(const std::string& text) {
return ::TextToUpper(text.c_str());
}
/**
* Get lower case version of provided string
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string TextToLower(const std::string& text) {
return ::TextToLower(text.c_str());
}
/**
* Get Pascal case notation version of provided string
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string TextToPascal(const std::string& text) {
return ::TextToPascal(text.c_str());
}
/**
* Get Snake case notation version of provided string
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string TextToSnake(const std::string& text) {
return ::TextToSnake(text.c_str());
}
/**
* Get Camel case notation version of provided string
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline std::string TextToCamel(const std::string& text) {
return ::TextToCamel(text.c_str());
}
/**
* Get integer value from text (negative values not supported)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int TextToInteger(const std::string& text) {
return ::TextToInteger(text.c_str());
}
/**
* Get float value from text
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline float TextToFloat(const std::string& text) {
return ::TextToFloat(text.c_str());
}
} // namespace raylib
#endif // RAYLIB_CPP_INCLUDE_FUNCTIONS_HPP_
+106
View File
@@ -0,0 +1,106 @@
#ifndef RAYLIB_CPP_INCLUDE_GAMEPAD_HPP_
#define RAYLIB_CPP_INCLUDE_GAMEPAD_HPP_
#include <string>
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Input-related functions: gamepads
*/
class Gamepad {
public:
Gamepad(int gamepadNumber = 0) : number(gamepadNumber) {};
int number;
GETTERSETTER(int, Number, number)
Gamepad& operator=(const Gamepad& gamepad) {
if (this != &gamepad) {
set(static_cast<int>(gamepad));
}
return *this;
}
Gamepad& operator=(int gamepadNumber) {
if (this->number != gamepadNumber) {
set(gamepadNumber);
}
return *this;
}
explicit operator int() const { return number; }
/**
* Detect if a gamepad is available
*/
RLCPP_NODISCARD bool IsAvailable() const { return ::IsGamepadAvailable(number); }
/**
* Detect if a gamepad is available
*/
static bool IsAvailable(int number) { return ::IsGamepadAvailable(number); }
/**
* Return gamepad internal name id
*/
RLCPP_NODISCARD std::string GetName() const { return ::GetGamepadName(number); }
/**
* Return gamepad internal name id
*/
explicit operator std::string() const { return GetName(); }
/**
* Detect if a gamepad button has been pressed once
*/
RLCPP_NODISCARD bool IsButtonPressed(int button) const { return ::IsGamepadButtonPressed(number, button); }
/**
* Detect if a gamepad button is being pressed
*/
RLCPP_NODISCARD bool IsButtonDown(int button) const { return ::IsGamepadButtonDown(number, button); }
/**
* Detect if a gamepad button has been released once
*/
RLCPP_NODISCARD bool IsButtonReleased(int button) const { return ::IsGamepadButtonReleased(number, button); }
/**
* Detect if a gamepad button is NOT being pressed
*/
RLCPP_NODISCARD bool IsButtonUp(int button) const { return ::IsGamepadButtonUp(number, button); }
/**
* Get the last gamepad button pressed
*/
static int GetButtonPressed() { return ::GetGamepadButtonPressed(); }
/**
* Return gamepad axis count for a gamepad
*/
RLCPP_NODISCARD int GetAxisCount() const { return ::GetGamepadAxisCount(number); }
/**
* Return axis movement value for a gamepad axis
*/
RLCPP_NODISCARD float GetAxisMovement(int axis) const { return ::GetGamepadAxisMovement(number, axis); }
static int SetMappings(const std::string& mappings) { return SetGamepadMappings(mappings.c_str()); }
/**
* Set gamepad vibration for both motors (duration in seconds)
*/
void SetVibration(float leftMotor, float rightMotor, float duration) const {
::SetGamepadVibration(number, leftMotor, rightMotor, duration);
}
protected:
void set(int gamepadNumber) { number = gamepadNumber; }
};
} // namespace raylib
using RGamepad = raylib::Gamepad;
#endif // RAYLIB_CPP_INCLUDE_GAMEPAD_HPP_
+775
View File
@@ -0,0 +1,775 @@
#ifndef RAYLIB_CPP_INCLUDE_IMAGE_HPP_
#define RAYLIB_CPP_INCLUDE_IMAGE_HPP_
#include <string>
#include "./Color.hpp"
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Image type, bpp always RGBA (32bit)
*
* Data stored in CPU memory (RAM)
*/
class Image : public ::Image {
public:
Image(
void* data = nullptr,
int width = 0,
int height = 0,
int mipmaps = 1,
int format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8)
: ::Image{data, width, height, mipmaps, format} {
// Nothing.
}
Image(const ::Image& image) : ::Image(image) { }
/**
* Load an image from the given file.
*
* @throws raylib::RaylibException Thrown if the image failed to load from the file.
*
* @see Load()
*/
Image(const std::string& fileName) { Load(fileName); }
/**
* Load a raw image from the given file, with the provided width, height, and formats.
*
* @throws raylib::RaylibException Thrown if the image failed to load from the file.
*
* @see LoadRaw()
*/
Image(const std::string& fileName, int width, int height, int format, int headerSize = 0) {
Load(fileName, width, height, format, headerSize);
}
/**
* Load an animation image from the given file.
*
* @throws raylib::RaylibException Thrown if the image failed to load from the file.
*
* @see LoadAnim()
*/
Image(const std::string& fileName, int* frames) { Load(fileName, frames); }
/**
* Load an image from the given file.
*
* @throws raylib::RaylibException Thrown if the image failed to load from the file.
*/
Image(const std::string& fileType, const unsigned char* fileData, int dataSize) {
Load(fileType, fileData, dataSize);
}
/**
* Load an image from the given file.
*
* @throws raylib::RaylibException Thrown if the image failed to load from the file.
*/
Image(const ::Texture2D& texture) { Load(texture); }
Image(int width, int height, ::Color color = {255, 255, 255, 255}) { set(::GenImageColor(width, height, color)); }
Image(const std::string& text, int fontSize, ::Color color = {255, 255, 255, 255}) {
set(::ImageText(text.c_str(), fontSize, color));
}
Image(
const ::Font& font,
const std::string& text,
float fontSize,
float spacing,
::Color tint = {255, 255, 255, 255}) {
set(::ImageTextEx(font, text.c_str(), fontSize, spacing, tint));
}
Image(const Image& other) { set(other.Copy()); }
Image(Image&& other) noexcept {
set(other);
other.data = nullptr;
other.width = 0;
other.height = 0;
other.mipmaps = 0;
other.format = 0;
}
[[nodiscard]] std::string ToString() const { return TextFormat("Image(width=%d, height=%d)", width, height); }
operator std::string() const { return ToString(); }
static ::Image Text(const std::string& text, int fontSize, ::Color color = {255, 255, 255, 255}) {
return ::ImageText(text.c_str(), fontSize, color);
}
static ::Image Text(
const ::Font& font,
const std::string& text,
float fontSize,
float spacing,
::Color tint = {255, 255, 255, 255}) {
return ::ImageTextEx(font, text.c_str(), fontSize, spacing, tint);
}
/**
* Get pixel data from screen buffer and return an Image (screenshot)
*/
static ::Image LoadFromScreen() { return ::LoadImageFromScreen(); }
/**
* Generate image: plain color
*/
static ::Image Color(int width, int height, ::Color color = {255, 255, 255, 255}) {
return ::GenImageColor(width, height, color);
}
/**
* Generate image: linear gradient
*/
static ::Image GradientLinear(int width, int height, int direction, ::Color start, ::Color end) {
return ::GenImageGradientLinear(width, height, direction, start, end);
}
/**
* Generate image: radial gradient
*/
static ::Image GradientRadial(int width, int height, float density, ::Color inner, ::Color outer) {
return ::GenImageGradientRadial(width, height, density, inner, outer);
}
/**
* Generate image: checked
*/
static ::Image Checked(
int width,
int height,
int checksX,
int checksY,
::Color col1 = {255, 255, 255, 255},
::Color col2 = {0, 0, 0, 255}) {
return ::GenImageChecked(width, height, checksX, checksY, col1, col2);
}
/**
* Generate image: white noise
*/
static ::Image WhiteNoise(int width, int height, float factor) {
return ::GenImageWhiteNoise(width, height, factor);
}
/**
* Generate image: cellular algorithm. Bigger tileSize means bigger cells
*/
static ::Image Cellular(int width, int height, int tileSize) { return ::GenImageCellular(width, height, tileSize); }
/**
* Get clipboard image content.
*/
static ::Image GetClipboard() { return ::GetClipboardImage(); }
~Image() { Unload(); }
Image& operator=(const ::Image& image) {
set(image);
return *this;
}
Image& operator=(const Image& other) {
if (this == &other) {
return *this;
}
Unload();
set(other.Copy());
return *this;
}
Image& operator=(Image&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.data = nullptr;
other.width = 0;
other.height = 0;
other.mipmaps = 0;
other.format = 0;
return *this;
}
/**
* Load image from file into CPU memory (RAM)
*
* @throws raylib::RaylibException Thrown if the image failed to load from the file.
*
* @see ::LoadImage()
*/
void Load(const std::string& fileName) {
set(::LoadImage(fileName.c_str()));
if (!IsValid()) {
throw RaylibException("Failed to load Image from file: " + fileName);
}
}
/**
* Load image from RAW file data.
*
* @throws raylib::RaylibException Thrown if the image failed to load from the file.
*
* @see ::LoadImageRaw()
*/
void Load(const std::string& fileName, int width, int height, int format, int headerSize) {
set(::LoadImageRaw(fileName.c_str(), width, height, format, headerSize));
if (!IsValid()) {
throw RaylibException("Failed to load Image from file: " + fileName);
}
}
/**
* Load image sequence from file (frames appended to image.data).
*
* @throws raylib::RaylibException Thrown if the image animation to load from the file.
*
* @see ::LoadImageAnim()
*/
void Load(const std::string& fileName, int* frames) {
set(::LoadImageAnim(fileName.c_str(), frames));
if (!IsValid()) {
throw RaylibException("Failed to load Image from file: " + fileName);
}
}
/**
* Load image from memory buffer, fileType refers to extension: i.e. "png".
*
* @throws raylib::RaylibException Thrown if the image animation to load from the file.
*
* @see ::LoadImageFromMemory()
*/
void Load(const std::string& fileType, const unsigned char* fileData, int dataSize) {
set(::LoadImageFromMemory(fileType.c_str(), fileData, dataSize));
if (!IsValid()) {
throw RaylibException("Failed to load Image data with file type: " + fileType);
}
}
/**
* Load an image from the given file.
*
* @throws raylib::RaylibException Thrown if the image animation to load from the file.
*
* @see ::LoadImageFromTexture()
*/
void Load(const ::Texture2D& texture) {
set(::LoadImageFromTexture(texture));
if (!IsValid()) {
throw RaylibException("Failed to load Image from texture.");
}
}
/**
* Unload image from CPU memory (RAM)
*/
void Unload() {
if (data != nullptr) {
::UnloadImage(*this);
data = nullptr;
}
}
/**
* Export image data to file, returns true on success
*
* @throws raylib::RaylibException Thrown if the image failed to load from the file.
*/
void Export(const std::string& fileName) const {
if (!::ExportImage(*this, fileName.c_str())) {
throw RaylibException(TextFormat("Failed to export Image to file: %s", fileName.c_str()));
}
}
/**
* Export image to memory buffer
*/
unsigned char* ExportToMemory(const char* fileType, int* fileSize) {
return ::ExportImageToMemory(*this, fileType, fileSize);
}
/**
* Export image as code file defining an array of bytes, returns true on success
*
* @throws raylib::RaylibException Thrown if the image failed to load from the file.
*/
void ExportAsCode(const std::string& fileName) const {
if (!::ExportImageAsCode(*this, fileName.c_str())) {
throw RaylibException(TextFormat("Failed to export Image code to file: %s", fileName.c_str()));
}
}
GETTER(void*, Data, data)
GETTER(int, Width, width)
GETTER(int, Height, height)
GETTER(int, Mipmaps, mipmaps)
GETTER(int, Format, format)
/**
* Set the width of the image canvas.
*
* @see ResizeCanvas
*/
void SetWidth(int width, int offsetX = 0, int offsetY = 0, ::Color fill = {255, 255, 255, 255}) {
ResizeCanvas(width, height, offsetX, offsetY, fill);
}
/**
* Set the height of the image canvas.
*
* @see ResizeCanvas
*/
void SetHeight(int height, int offsetX = 0, int offsetY = 0, ::Color fill = {255, 255, 255, 255}) {
ResizeCanvas(width, height, offsetX, offsetY, fill);
}
/**
* Retrieve the width and height of the image.
*/
RLCPP_NODISCARD ::Vector2 GetSize() const { return {static_cast<float>(width), static_cast<float>(height)}; }
/**
* Create an image duplicate (useful for transformations)
*/
RLCPP_NODISCARD ::Image Copy() const { return ::ImageCopy(*this); }
/**
* Create an image from another image piece
*/
RLCPP_NODISCARD ::Image FromImage(::Rectangle rec) const { return ::ImageFromImage(*this, rec); }
/**
* Convert image data to desired format
*/
Image& Format(int newFormat) {
::ImageFormat(this, newFormat);
return *this;
}
/**
* Convert image to POT (power-of-two)
*/
Image& ToPOT(::Color fillColor) {
::ImageToPOT(this, fillColor);
return *this;
}
/**
* Crop an image to area defined by a rectangle
*/
Image& Crop(::Rectangle crop) {
::ImageCrop(this, crop);
return *this;
}
/**
* Crop image depending on alpha value
*/
Image& AlphaCrop(float threshold) {
::ImageAlphaCrop(this, threshold);
return *this;
}
/**
* Clear alpha channel to desired color
*/
Image& AlphaClear(::Color color, float threshold) {
::ImageAlphaClear(this, color, threshold);
return *this;
}
/**
* Apply alpha mask to image
*/
Image& AlphaMask(const ::Image& alphaMask) {
::ImageAlphaMask(this, alphaMask);
return *this;
}
/**
* Premultiply alpha channel
*/
Image& AlphaPremultiply() {
::ImageAlphaPremultiply(this);
return *this;
}
/**
* Crop an image to a new given width and height.
*/
Image& Crop(int newWidth, int newHeight) { return Crop(0, 0, newWidth, newHeight); }
/**
* Crop an image to a new given width and height based on a vector.
*/
Image& Crop(::Vector2 size) { return Crop(0, 0, static_cast<int>(size.x), static_cast<int>(size.y)); }
/**
* Crop an image to area defined by a rectangle
*/
Image& Crop(int offsetX, int offsetY, int newWidth, int newHeight) {
::Rectangle rect{
static_cast<float>(offsetX),
static_cast<float>(offsetY),
static_cast<float>(newWidth),
static_cast<float>(newHeight)};
::ImageCrop(this, rect);
return *this;
}
/**
* Resize and image to new size
*/
Image& Resize(int newWidth, int newHeight) {
::ImageResize(this, newWidth, newHeight);
return *this;
}
/**
* Resize and image to new size using Nearest-Neighbor scaling algorithm
*/
Image& ResizeNN(int newWidth, int newHeight) {
::ImageResizeNN(this, newWidth, newHeight);
return *this;
}
/**
* Resize canvas and fill with color
*/
Image&
ResizeCanvas(int newWidth, int newHeight, int offsetX = 0, int offsetY = 0, ::Color color = {255, 255, 255, 255}) {
::ImageResizeCanvas(this, newWidth, newHeight, offsetX, offsetY, color);
return *this;
}
/**
* Generate all mipmap levels for a provided image
*/
Image& Mipmaps() {
::ImageMipmaps(this);
return *this;
}
/**
* Dither image data to 16bpp or lower (Floyd-Steinberg dithering)
*/
Image& Dither(int rBpp, int gBpp, int bBpp, int aBpp) {
::ImageDither(this, rBpp, gBpp, bBpp, aBpp);
return *this;
}
/**
* Flip image vertically
*/
Image& FlipVertical() {
::ImageFlipVertical(this);
return *this;
}
/**
* Flip image horizontally
*/
Image& FlipHorizontal() {
::ImageFlipHorizontal(this);
return *this;
}
/**
* Rotate image by input angle in degrees (-359 to 359)
*/
Image& Rotate(int degrees) {
::ImageRotate(this, degrees);
return *this;
}
/**
* Rotate image clockwise 90deg
*/
Image& RotateCW() {
::ImageRotateCW(this);
return *this;
}
/**
* Rotate image counter-clockwise 90deg
*/
Image& RotateCCW() {
::ImageRotateCCW(this);
return *this;
}
/**
* Modify image color: tint
*/
Image& ColorTint(::Color color = {255, 255, 255, 255}) {
::ImageColorTint(this, color);
return *this;
}
/**
* Modify image color: invert
*/
Image& ColorInvert() {
::ImageColorInvert(this);
return *this;
}
/**
* Modify image color: grayscale
*/
Image& ColorGrayscale() {
::ImageColorGrayscale(this);
return *this;
}
/**
* Modify image color: contrast
*
* @param contrast Contrast values between -100 and 100
*/
Image& ColorContrast(float contrast) {
::ImageColorContrast(this, contrast);
return *this;
}
/**
* Modify image color: brightness
*
* @param brightness Brightness values between -255 and 255
*/
Image& ColorBrightness(int brightness) {
::ImageColorBrightness(this, brightness);
return *this;
}
/**
* Modify image color: replace color
*/
Image& ColorReplace(::Color color, ::Color replace) {
::ImageColorReplace(this, color, replace);
return *this;
}
/**
* Get image alpha border rectangle
*
* @param threshold Threshold is defined as a percentatge: 0.0f -> 1.0f
*/
RLCPP_NODISCARD Rectangle GetAlphaBorder(float threshold) const { return ::GetImageAlphaBorder(*this, threshold); }
/**
* Get image pixel color at (x, y) position
*/
RLCPP_NODISCARD raylib::Color GetColor(int x = 0, int y = 0) const { return ::GetImageColor(*this, x, y); }
/**
* Get image pixel color at vector position
*/
RLCPP_NODISCARD raylib::Color GetColor(::Vector2 position) const {
return ::GetImageColor(*this, static_cast<int>(position.x), static_cast<int>(position.y));
}
/**
* Clear image background with given color
*/
Image& ClearBackground(::Color color = {0, 0, 0, 255}) {
::ImageClearBackground(this, color);
return *this;
}
/**
* Draw pixel within an image
*/
void DrawPixel(int posX, int posY, ::Color color = {255, 255, 255, 255}) {
::ImageDrawPixel(this, posX, posY, color);
}
void DrawPixel(::Vector2 position, ::Color color = {255, 255, 255, 255}) {
::ImageDrawPixelV(this, position, color);
}
void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, ::Color color = {255, 255, 255, 255}) {
::ImageDrawLine(this, startPosX, startPosY, endPosX, endPosY, color);
}
void DrawLine(::Vector2 start, ::Vector2 end, ::Color color = {255, 255, 255, 255}) {
::ImageDrawLineV(this, start, end, color);
}
/**
* Description: Draw a line defining thickness within an image
*/
void DrawLine(::Vector2 start, ::Vector2 end, int thick, ::Color color = {255, 255, 255, 255}) {
ImageDrawLineEx(this, start, end, thick, color);
}
void DrawCircle(int centerX, int centerY, int radius, ::Color color = {255, 255, 255, 255}) {
::ImageDrawCircle(this, centerX, centerY, radius, color);
}
void DrawCircle(::Vector2 center, int radius, ::Color color = {255, 255, 255, 255}) {
::ImageDrawCircleV(this, center, radius, color);
}
void DrawRectangle(int posX, int posY, int width, int height, ::Color color = {255, 255, 255, 255}) {
::ImageDrawRectangle(this, posX, posY, width, height, color);
}
void DrawRectangle(Vector2 position, Vector2 size, ::Color color = {255, 255, 255, 255}) {
::ImageDrawRectangleV(this, position, size, color);
}
void DrawRectangle(::Rectangle rec, ::Color color = {255, 255, 255, 255}) {
::ImageDrawRectangleRec(this, rec, color);
}
void DrawRectangleLines(::Rectangle rec, int thick = 1, ::Color color = {255, 255, 255, 255}) {
::ImageDrawRectangleLines(this, rec, thick, color);
}
// TODO: Add ImageDrawTriangle()
void Draw(const ::Image& src, ::Rectangle srcRec, ::Rectangle dstRec, ::Color tint = {255, 255, 255, 255}) {
::ImageDraw(this, src, srcRec, dstRec, tint);
}
void DrawText(const char* text, ::Vector2 position, int fontSize, ::Color color = {255, 255, 255, 255}) {
::ImageDrawText(this, text, static_cast<int>(position.x), static_cast<int>(position.y), fontSize, color);
}
void DrawText(const std::string& text, ::Vector2 position, int fontSize, ::Color color = {255, 255, 255, 255}) {
::ImageDrawText(
this,
text.c_str(),
static_cast<int>(position.x),
static_cast<int>(position.y),
fontSize,
color);
}
void DrawText(const std::string& text, int x, int y, int fontSize, ::Color color = {255, 255, 255, 255}) {
::ImageDrawText(this, text.c_str(), x, y, fontSize, color);
}
void DrawText(const char* text, int x, int y, int fontSize, ::Color color = {255, 255, 255, 255}) {
::ImageDrawText(this, text, x, y, fontSize, color);
}
void DrawText(
const ::Font& font,
const std::string& text,
::Vector2 position,
float fontSize,
float spacing,
::Color tint = {255, 255, 255, 255}) {
::ImageDrawTextEx(this, font, text.c_str(), position, fontSize, spacing, tint);
}
void DrawText(
const ::Font& font,
const char* text,
::Vector2 position,
float fontSize,
float spacing,
::Color tint = {255, 255, 255, 255}) {
::ImageDrawTextEx(this, font, text, position, fontSize, spacing, tint);
}
/**
* Load color data from image as a Color array (RGBA - 32bit)
*/
RLCPP_NODISCARD ::Color* LoadColors() const { return ::LoadImageColors(*this); }
/**
* Load colors palette from image as a Color array (RGBA - 32bit)
*/
::Color* LoadPalette(int maxPaletteSize, int* colorsCount) const {
return ::LoadImagePalette(*this, maxPaletteSize, colorsCount);
}
/**
* Unload color data loaded with LoadImageColors()
*/
void UnloadColors(::Color* colors) const { ::UnloadImageColors(colors); }
/**
* Unload colors palette loaded with LoadImagePalette()
*/
void UnloadPalette(::Color* colors) const { ::UnloadImagePalette(colors); }
/**
* Load texture from image data.
*/
RLCPP_NODISCARD ::Texture2D LoadTexture() const { return ::LoadTextureFromImage(*this); }
/**
* Loads a texture from the image data.
*
* @see LoadTexture()
*/
operator ::Texture2D() const { return LoadTexture(); }
/**
* Get pixel data size in bytes for certain format
*/
static int GetPixelDataSize(int width, int height, int format = PIXELFORMAT_UNCOMPRESSED_R32G32B32A32) {
return ::GetPixelDataSize(width, height, format);
}
/**
* Returns the pixel data size based on the current image.
*
* @return The pixel data size of the image.
*/
RLCPP_NODISCARD int GetPixelDataSize() const { return ::GetPixelDataSize(width, height, format); }
/**
* Retrieve whether or not the Image has been loaded.
*
* @return True or false depending on whether the Image has been loaded.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsImageValid(*this); }
/**
* Create an image from a selected channel of another image (GRAYSCALE)
*/
::Image Channel(int selectedChannel) { return ::ImageFromChannel(*this, selectedChannel); }
/**
* Apply custom square convolution kernel to image
*/
void KernelConvolution(const float* kernel, int kernelSize) {
::ImageKernelConvolution(this, kernel, kernelSize);
}
protected:
void set(const ::Image& image) {
data = image.data;
width = image.width;
height = image.height;
mipmaps = image.mipmaps;
format = image.format;
}
};
} // namespace raylib
using RImage = raylib::Image;
#endif // RAYLIB_CPP_INCLUDE_IMAGE_HPP_
+66
View File
@@ -0,0 +1,66 @@
#ifndef RAYLIB_CPP_INCLUDE_KEYBOARD_HPP_
#define RAYLIB_CPP_INCLUDE_KEYBOARD_HPP_
#include "./Functions.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Input-related functions: keyboard
*/
namespace Keyboard {
/**
* Detect if a key has been pressed once
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsKeyPressed(int key) {
return ::IsKeyPressed(key);
}
/**
* Detect if a key has been pressed again (Only PLATFORM_DESKTOP)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsKeyPressedRepeat(int key) {
return ::IsKeyPressedRepeat(key);
}
/**
* Detect if a key is being pressed
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsKeyDown(int key) {
return ::IsKeyDown(key);
}
/**
* Detect if a key has been released once
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsKeyReleased(int key) {
return ::IsKeyReleased(key);
}
/**
* Detect if a key is NOT being pressed
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsKeyUp(int key) {
return ::IsKeyUp(key);
}
/**
* Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetKeyPressed() {
return ::GetKeyPressed();
}
/**
* Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetCharPressed() {
return ::GetCharPressed();
}
} // namespace Keyboard
} // namespace raylib
namespace RKeyboard = raylib::Keyboard;
#endif // RAYLIB_CPP_INCLUDE_KEYBOARD_HPP_
+54
View File
@@ -0,0 +1,54 @@
#ifndef RAYLIB_CPP_INCLUDE_MATERIAL_HPP_
#define RAYLIB_CPP_INCLUDE_MATERIAL_HPP_
#include "./MaterialUnmanaged.hpp"
namespace raylib {
/**
* Material type (generic).
*
* The material will be unloaded on object destruction. Use raylib::MaterialUnmanaged if you're looking to not unload.
*
* @see raylib::MaterialUnmanaged
*/
class Material : public MaterialUnmanaged {
public:
using MaterialUnmanaged::MaterialUnmanaged;
Material(const Material&) = delete;
Material& operator=(const Material&) = delete;
Material(Material&& other) noexcept {
set(other);
other.maps = nullptr;
other.shader = {};
other.params[0] = 0.0f;
other.params[1] = 0.0f;
other.params[2] = 0.0f;
other.params[3] = 0.0f;
}
Material& operator=(Material&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.maps = nullptr;
other.shader = {};
return *this;
}
Material& operator=(const ::Material& material) {
Unload();
set(material);
return *this;
}
~Material() { Unload(); }
};
} // namespace raylib
using RMaterial = raylib::Material;
#endif // RAYLIB_CPP_INCLUDE_MATERIAL_HPP_
+96
View File
@@ -0,0 +1,96 @@
#ifndef RAYLIB_CPP_INCLUDE_MATERIALUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_MATERIALUNMANAGED_HPP_
#include <string>
#include <vector>
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* A Material that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::Material.
*
* @see raylib::Material
*/
class MaterialUnmanaged : public ::Material {
public:
/**
* Creates a MaterialUnmanaged from an existing Material struct.
*/
MaterialUnmanaged(const ::Material& material) : ::Material(material) {}
/**
* Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps).
*/
MaterialUnmanaged() : ::Material(::LoadMaterialDefault()) {}
/**
* Load materials from model file.
*/
static std::vector<MaterialUnmanaged> Load(const std::string& fileName) {
int count = 0;
::Material* mats = ::LoadMaterials(fileName.c_str(), &count);
return std::vector<MaterialUnmanaged>(mats, mats + count);
}
GETTERSETTER(::Shader, Shader, shader)
GETTERSETTER(::MaterialMap*, Maps, maps)
MaterialUnmanaged& operator=(const ::Material& material) {
set(material);
return *this;
}
/**
* Unload material from memory.
*/
void Unload() {
if (maps != nullptr) {
::UnloadMaterial(*this);
maps = nullptr;
}
}
/**
* Set texture for a material map type (MAP_DIFFUSE, MAP_SPECULAR...).
*/
MaterialUnmanaged& SetTexture(int mapType, const ::Texture2D& texture) {
::SetMaterialTexture(this, mapType, texture);
return *this;
}
/**
* Draw a 3d mesh with material and transform.
*/
void DrawMesh(const ::Mesh& mesh, ::Matrix transform) const { ::DrawMesh(mesh, *this, transform); }
/**
* Draw multiple mesh instances with material and different transforms.
*/
void DrawMesh(const ::Mesh& mesh, ::Matrix* transforms, int instances) const {
::DrawMeshInstanced(mesh, *this, transforms, instances);
}
/**
* Check if material is ready.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsMaterialValid(*this); }
protected:
void set(const ::Material& material) {
shader = material.shader;
maps = material.maps;
params[0] = material.params[0];
params[1] = material.params[1];
params[2] = material.params[2];
params[3] = material.params[3];
}
};
} // namespace raylib
using RMaterialUnmanaged = raylib::MaterialUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_MATERIALUNMANAGED_HPP_
+201
View File
@@ -0,0 +1,201 @@
#ifndef RAYLIB_CPP_INCLUDE_MATRIX_HPP_
#define RAYLIB_CPP_INCLUDE_MATRIX_HPP_
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
#include "./raymath.hpp"
#ifndef RAYLIB_CPP_NO_MATH
#include <cmath>
#endif
namespace raylib {
/**
* Matrix type (OpenGL style 4x4 - right handed, column major)
*/
class Matrix : public ::Matrix {
public:
constexpr Matrix(const ::Matrix& mat)
: ::Matrix(mat) {
// Nothing.
}
constexpr Matrix(
float m0 = 0,
float m4 = 0,
float m8 = 0,
float m12 = 0,
float m1 = 0,
float m5 = 0,
float m9 = 0,
float m13 = 0,
float m2 = 0,
float m6 = 0,
float m10 = 0,
float m14 = 0,
float m3 = 0,
float m7 = 0,
float m11 = 0,
float m15 = 0)
: ::Matrix{m0, m4, m8, m12, m1, m5, m9, m13, m2, m6, m10, m14, m3, m7, m11, m15} {
// Nothing.
}
GETTERSETTER(float, M0, m0)
GETTERSETTER(float, M1, m1)
GETTERSETTER(float, M2, m2)
GETTERSETTER(float, M3, m3)
GETTERSETTER(float, M4, m4)
GETTERSETTER(float, M5, m5)
GETTERSETTER(float, M6, m6)
GETTERSETTER(float, M7, m7)
GETTERSETTER(float, M8, m8)
GETTERSETTER(float, M9, m9)
GETTERSETTER(float, M10, m10)
GETTERSETTER(float, M11, m11)
GETTERSETTER(float, M12, m12)
GETTERSETTER(float, M13, m13)
GETTERSETTER(float, M14, m14)
GETTERSETTER(float, M15, m15)
Matrix& operator=(const ::Matrix& matrix) {
if (this != &matrix) {
set(matrix);
}
return *this;
}
Matrix& operator=(const Matrix& matrix) {
if (this != &matrix) {
set(matrix);
}
return *this;
}
constexpr bool operator==(const ::Matrix& other) {
return m0 == other.m0 && m1 == other.m1 && m2 == other.m2 && m3 == other.m3 && m4 == other.m4 &&
m5 == other.m5 && m6 == other.m6 && m7 == other.m7 && m8 == other.m8 && m9 == other.m9 &&
m10 == other.m10 && m11 == other.m11 && m12 == other.m12 && m13 == other.m13 && m14 == other.m14 &&
m15 == other.m15;
}
constexpr bool operator!=(const ::Matrix& other) { return !(*this == other); }
[[nodiscard]] std::string ToString() const {
return TextFormat(
"Matrix(\n"
" %f, %f, %f, %f\n"
" %f, %f, %f, %f\n"
" %f, %f, %f, %f\n"
" %f, %f, %f, %f\n"
")",
m0, m4, m8, m12,
m1, m5, m9, m13,
m2, m6, m10, m14,
m3, m7, m11, m15
);
}
operator std::string() const { return ToString(); }
#ifndef RAYLIB_CPP_NO_MATH
/**
* Returns the trace of the matrix (sum of the values along the diagonal)
*/
RLCPP_NODISCARD float Trace() const { return ::MatrixTrace(*this); }
/**
* Transposes provided matrix
*/
RLCPP_NODISCARD Matrix Transpose() const { return ::MatrixTranspose(*this); }
RLCPP_NODISCARD Matrix Invert() const { return ::MatrixInvert(*this); }
static Matrix Identity() { return ::MatrixIdentity(); }
Matrix Add(const ::Matrix& right) { return ::MatrixAdd(*this, right); }
Matrix operator+(const ::Matrix& matrix) { return ::MatrixAdd(*this, matrix); }
Matrix Subtract(const ::Matrix& right) { return ::MatrixSubtract(*this, right); }
Matrix operator-(const ::Matrix& matrix) { return ::MatrixSubtract(*this, matrix); }
static Matrix Translate(float x, float y, float z) { return ::MatrixTranslate(x, y, z); }
static Matrix Rotate(Vector3 axis, float angle) { return ::MatrixRotate(axis, angle); }
static Matrix RotateXYZ(Vector3 angle) { return ::MatrixRotateXYZ(angle); }
static Matrix RotateX(float angle) { return ::MatrixRotateX(angle); }
static Matrix RotateY(float angle) { return ::MatrixRotateY(angle); }
static Matrix RotateZ(float angle) { return ::MatrixRotateZ(angle); }
static Matrix Scale(float x, float y, float z) { return ::MatrixScale(x, y, z); }
RLCPP_NODISCARD Matrix Multiply(const ::Matrix& right) const { return ::MatrixMultiply(*this, right); }
RLCPP_NODISCARD Matrix Multiply(float value) const { return ::MatrixMultiplyValue(*this, value); }
Matrix operator*(const ::Matrix& matrix) { return ::MatrixMultiply(*this, matrix); }
Matrix operator*(float value) { return ::MatrixMultiplyValue(*this, value); }
static Matrix Frustum(double left, double right, double bottom, double top, double near, double far) {
return ::MatrixFrustum(left, right, bottom, top, near, far);
}
static Matrix Perspective(double fovy, double aspect, double near, double far) {
return ::MatrixPerspective(fovy, aspect, near, far);
}
static Matrix Ortho(double left, double right, double bottom, double top, double near, double far) {
return ::MatrixOrtho(left, right, bottom, top, near, far);
}
static Matrix LookAt(Vector3 eye, Vector3 target, Vector3 up) { return ::MatrixLookAt(eye, target, up); }
RLCPP_NODISCARD float16 ToFloatV() const { return ::MatrixToFloatV(*this); }
operator float16() const { return ToFloatV(); }
/**
* Set shader uniform value (matrix 4x4)
*/
Matrix& SetShaderValue(const ::Shader& shader, int uniformLoc) {
::SetShaderValueMatrix(shader, uniformLoc, *this);
return *this;
}
static Matrix GetCamera(const ::Camera& camera) { return ::GetCameraMatrix(camera); }
static Matrix GetCamera(const ::Camera2D& camera) { return ::GetCameraMatrix2D(camera); }
#endif
protected:
void set(const ::Matrix& mat) {
m0 = mat.m0;
m1 = mat.m1;
m2 = mat.m2;
m3 = mat.m3;
m4 = mat.m4;
m5 = mat.m5;
m6 = mat.m6;
m7 = mat.m7;
m8 = mat.m8;
m9 = mat.m9;
m10 = mat.m10;
m11 = mat.m11;
m12 = mat.m12;
m13 = mat.m13;
m14 = mat.m14;
m15 = mat.m15;
}
};
} // namespace raylib
using RMatrix = raylib::Matrix;
#endif // RAYLIB_CPP_INCLUDE_MATRIX_HPP_
+92
View File
@@ -0,0 +1,92 @@
#ifndef RAYLIB_CPP_INCLUDE_MESH_HPP_
#define RAYLIB_CPP_INCLUDE_MESH_HPP_
#include <string>
#include <vector>
#include "./MeshUnmanaged.hpp"
#include "./Model.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Vertex data defining a mesh
*
* The Mesh will be unloaded on object destruction.
*
* @see raylib::MeshUnmanaged
*/
class Mesh : public MeshUnmanaged {
public:
using MeshUnmanaged::MeshUnmanaged;
/**
* Explicitly forbid the copy constructor.
*/
Mesh(const Mesh&) = delete;
/**
* Explicitly forbid copy assignment.
*/
Mesh& operator=(const Mesh&) = delete;
/**
* Move constructor.
*/
Mesh(Mesh&& other) noexcept {
set(other);
other.vertexCount = 0;
other.triangleCount = 0;
other.vertices = nullptr;
other.texcoords = nullptr;
other.texcoords2 = nullptr;
other.normals = nullptr;
other.tangents = nullptr;
other.colors = nullptr;
other.indices = nullptr;
other.animVertices = nullptr;
other.animNormals = nullptr;
other.boneIndices = nullptr;
other.boneWeights = nullptr;
other.boneCount = 0;
other.vaoId = 0;
other.vboId = nullptr;
}
Mesh& operator=(Mesh&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.vertexCount = 0;
other.triangleCount = 0;
other.vertices = nullptr;
other.texcoords = nullptr;
other.texcoords2 = nullptr;
other.normals = nullptr;
other.tangents = nullptr;
other.colors = nullptr;
other.indices = nullptr;
other.animVertices = nullptr;
other.animNormals = nullptr;
other.boneIndices = nullptr;
other.boneWeights = nullptr;
other.boneCount = 0;
other.vaoId = 0;
other.vboId = nullptr;
return *this;
}
~Mesh() { Unload(); }
};
} // namespace raylib
using RMesh = raylib::Mesh;
#endif // RAYLIB_CPP_INCLUDE_MESH_HPP_
+265
View File
@@ -0,0 +1,265 @@
#ifndef RAYLIB_CPP_INCLUDE_MESHUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_MESHUNMANAGED_HPP_
#include <string>
#include <vector>
#include "./BoundingBox.hpp"
#include "./Matrix.hpp"
#include "./Model.hpp"
#include "./raylib-cpp-utils.hpp"
namespace raylib {
/**
* Vertex data defining a mesh, not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::Mesh.
*
* @see raylib::Mesh
*/
class MeshUnmanaged : public ::Mesh {
public:
/**
* Default texture constructor.
*/
MeshUnmanaged() {
vertexCount = 0;
triangleCount = 0;
vertices = nullptr;
texcoords = nullptr;
texcoords2 = nullptr;
normals = nullptr;
tangents = nullptr;
colors = nullptr;
indices = nullptr;
animVertices = nullptr;
animNormals = nullptr;
boneIndices = nullptr;
boneWeights = nullptr;
boneCount = 0;
vaoId = 0;
vboId = nullptr;
}
MeshUnmanaged(const ::Mesh& mesh) { set(mesh); }
MeshUnmanaged(::Mesh&& mesh) { set(mesh); }
/**
* Load meshes from model file
*/
// static std::vector<Mesh> Load(const std::string& fileName) {
// int count = 0;
// ::Mesh* meshes = LoadMeshes(fileName.c_str(), &count);
// return std::vector<Mesh>(meshes, meshes + count);
// }
/**
* Generate polygonal mesh
*/
static ::Mesh Poly(int sides, float radius) { return ::GenMeshPoly(sides, radius); }
/**
* Generate plane mesh (with subdivisions)
*/
static ::Mesh Plane(float width, float length, int resX, int resZ) {
return ::GenMeshPlane(width, length, resX, resZ);
}
/**
* Generate cuboid mesh
*/
static ::Mesh Cube(float width, float height, float length) { return ::GenMeshCube(width, height, length); }
/**
* Generate sphere mesh (standard sphere)
*/
static ::Mesh Sphere(float radius, int rings, int slices) { return ::GenMeshSphere(radius, rings, slices); }
/**
* Generate half-sphere mesh (no bottom cap)
*/
static ::Mesh HemiSphere(float radius, int rings, int slices) { return ::GenMeshHemiSphere(radius, rings, slices); }
/**
* Generate cylinder mesh
*/
static ::Mesh Cylinder(float radius, float height, int slices) { return ::GenMeshCylinder(radius, height, slices); }
/**
* Generate cone/pyramid mesh
*/
static ::Mesh Cone(float radius, float height, int slices) { return ::GenMeshCone(radius, height, slices); }
/**
* Generate torus mesh
*/
static ::Mesh Torus(float radius, float size, int radSeg, int sides) {
return ::GenMeshTorus(radius, size, radSeg, sides);
}
/**
* Generate trefoil knot mesh
*/
static ::Mesh Knot(float radius, float size, int radSeg, int sides) {
return ::GenMeshKnot(radius, size, radSeg, sides);
}
/**
* Generate heightmap mesh from image data
*/
static ::Mesh Heightmap(const ::Image& heightmap, ::Vector3 size) { return ::GenMeshHeightmap(heightmap, size); }
/**
* Generate cubes-based map mesh from image data
*/
static ::Mesh Cubicmap(const ::Image& cubicmap, ::Vector3 cubeSize) {
return ::GenMeshCubicmap(cubicmap, cubeSize);
}
GETTERSETTER(int, VertexCount, vertexCount)
GETTERSETTER(int, TriangleCount, triangleCount)
GETTERSETTER(float*, Vertices, vertices)
GETTERSETTER(float*, TexCoords, texcoords)
GETTERSETTER(float*, TexCoords2, texcoords2)
GETTERSETTER(float*, Normals, normals)
GETTERSETTER(float*, Tangents, tangents)
GETTERSETTER(unsigned char*, Colors, colors)
GETTERSETTER(unsigned short*, Indices, indices) // NOLINT
GETTERSETTER(float*, AnimVertices, animVertices)
GETTERSETTER(float*, AnimNormals, animNormals)
GETTERSETTER(unsigned char*, BoneIndices, boneIndices)
GETTERSETTER(float*, BoneWeights, boneWeights)
GETTERSETTER(int, BoneCount, boneCount)
GETTERSETTER(unsigned int, VaoId, vaoId)
GETTERSETTER(unsigned int*, VboId, vboId)
MeshUnmanaged& operator=(const ::Mesh& mesh) {
set(mesh);
return *this;
}
[[nodiscard]] std::string ToString() const {
return TextFormat(
"Mesh(vertexCount=%d, triangleCount=%d, boneCount=%d)",
vertexCount, triangleCount, boneCount
);
}
operator std::string() const { return ToString(); }
/**
* Unload mesh from memory (RAM and/or VRAM)
*/
void Unload() {
if (vboId != nullptr) {
::UnloadMesh(*this);
vboId = nullptr;
}
}
/**
* Upload mesh vertex data to GPU (VRAM)
*/
void Upload(bool dynamic = false) { ::UploadMesh(this, dynamic); }
/**
* Upload mesh vertex data to GPU (VRAM)
*/
void UpdateBuffer(int index, void* data, int dataSize, int offset = 0) {
::UpdateMeshBuffer(*this, index, data, dataSize, offset);
}
/**
* Draw a 3d mesh with material and transform
*/
void Draw(const ::Material& material, const ::Matrix& transform) const { ::DrawMesh(*this, material, transform); }
/**
* Draw multiple mesh instances with material and different transforms
*/
void Draw(const ::Material& material, const ::Matrix* transforms, int instances) const {
::DrawMeshInstanced(*this, material, transforms, instances);
}
/**
* Export mesh data to file
*
* @throws raylib::RaylibException Throws if failed to export the Mesh.
*/
void Export(const std::string& fileName) {
if (!::ExportMesh(*this, fileName.c_str())) {
throw RaylibException("Failed to export the Mesh");
}
}
/**
* Export mesh as code file (.h) defining multiple arrays of vertex attributes
*
* @throws raylib::RaylibException Throws if failed to export the Mesh.
*/
void ExportCode(const std::string& fileName) {
if (!::ExportMeshAsCode(*this, fileName.c_str())) {
throw RaylibException("Failed to export the Mesh");
}
}
/**
* Compute mesh bounding box limits
*/
RLCPP_NODISCARD raylib::BoundingBox BoundingBox() const { return ::GetMeshBoundingBox(*this); }
/**
* Compute mesh bounding box limits
*/
operator raylib::BoundingBox() const { return BoundingBox(); }
/**
* Compute mesh tangents
*/
MeshUnmanaged& GenTangents() {
::GenMeshTangents(this);
return *this;
}
/**
* Load model from generated mesh
*/
RLCPP_NODISCARD raylib::Model LoadModelFrom() const { return ::LoadModelFromMesh(*this); }
/**
* Load model from generated mesh
*/
operator raylib::Model() { return ::LoadModelFromMesh(*this); }
/**
* Returns whether or not the Mesh is valid.
*/
RLCPP_NODISCARD bool IsValid() const { return vaoId != 0 && vertexCount > 0; }
protected:
void set(const ::Mesh& mesh) {
vertexCount = mesh.vertexCount;
triangleCount = mesh.triangleCount;
vertices = mesh.vertices;
texcoords = mesh.texcoords;
texcoords2 = mesh.texcoords2;
normals = mesh.normals;
tangents = mesh.tangents;
colors = mesh.colors;
indices = mesh.indices;
animVertices = mesh.animVertices;
animNormals = mesh.animNormals;
boneIndices = mesh.boneIndices;
boneWeights = mesh.boneWeights;
boneCount = mesh.boneCount;
vaoId = mesh.vaoId;
vboId = mesh.vboId;
}
};
} // namespace raylib
using RMeshUnmanaged = raylib::MeshUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_MESHUNMANAGED_HPP_
+86
View File
@@ -0,0 +1,86 @@
#ifndef RAYLIB_CPP_INCLUDE_MODEL_HPP_
#define RAYLIB_CPP_INCLUDE_MODEL_HPP_
#include "./ModelUnmanaged.hpp"
namespace raylib {
class Mesh;
/**
* Model type.
*
* The model will be unloaded on object destruction. Use raylib::ModelUnmanaged if you're looking to not unload.
*
* @see raylib::ModelUnmanaged
*/
class Model : public ModelUnmanaged {
public:
using ModelUnmanaged::ModelUnmanaged;
/**
* The Model constructor with a Mesh() is removed.
*
* Use `raylib::MeshUnmanaged` or `::Mesh` instead, as raylib will take ownership of the data.
*
* @see raylib::MeshUnmanaged
*/
Model(const raylib::Mesh& mesh) = delete;
Model(const Model&) = delete;
Model& operator=(const Model&) = delete;
Model(Model&& other) noexcept {
set(other);
other.meshCount = 0;
other.materialCount = 0;
other.meshes = nullptr;
other.materials = nullptr;
other.meshMaterial = nullptr;
other.skeleton.boneCount = 0;
other.skeleton.bones = nullptr;
other.skeleton.bindPose = nullptr;
other.currentPose = nullptr;
other.boneMatrices = nullptr;
}
Model& operator=(Model&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.meshCount = 0;
other.materialCount = 0;
other.meshes = nullptr;
other.materials = nullptr;
other.meshMaterial = nullptr;
other.skeleton.boneCount = 0;
other.skeleton.bones = nullptr;
other.skeleton.bindPose = nullptr;
other.currentPose = nullptr;
other.boneMatrices = nullptr;
return *this;
}
Model& operator=(const ::Model& model) {
Unload();
set(model);
return *this;
}
~Model() { Unload(); }
void Load(const std::string& fileName) {
Unload();
ModelUnmanaged::Load(fileName);
}
void Load(const ::Mesh& mesh) {
Unload();
ModelUnmanaged::Load(mesh);
}
};
} // namespace raylib
using RModel = raylib::Model;
#endif // RAYLIB_CPP_INCLUDE_MODEL_HPP_
+123
View File
@@ -0,0 +1,123 @@
#ifndef RAYLIB_CPP_INCLUDE_MODELANIMATION_HPP_
#define RAYLIB_CPP_INCLUDE_MODELANIMATION_HPP_
#include <string>
#include <vector>
#include "./Mesh.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Model animation
*/
class ModelAnimation : public ::ModelAnimation {
public:
ModelAnimation(const ::ModelAnimation& model) { set(model); }
ModelAnimation(const ModelAnimation&) = delete;
ModelAnimation(ModelAnimation&& other) noexcept {
set(other);
other.boneCount = 0;
other.keyframeCount = 0;
other.keyframePoses = nullptr;
}
// Unloads animation data using populated animCount field, which is set by Load() method.
~ModelAnimation() { Unload(); }
/**
* Load model animations from file
*/
static std::vector<ModelAnimation> Load(const std::string& fileName) {
int count = 0;
::ModelAnimation* modelAnimations = ::LoadModelAnimations(fileName.c_str(), &count);
std::vector<ModelAnimation> mats(modelAnimations, modelAnimations + count);
RL_FREE(modelAnimations);
return mats;
}
GETTERSETTER(int, BoneCount, boneCount)
GETTERSETTER(int, KeyframeCount, keyframeCount)
GETTERSETTER(::Transform**, KeyframePoses, keyframePoses)
ModelAnimation& operator=(const ::ModelAnimation& model) {
set(model);
return *this;
}
ModelAnimation& operator=(const ModelAnimation&) = delete;
ModelAnimation& operator=(ModelAnimation&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.boneCount = 0;
other.keyframeCount = 0;
other.keyframePoses = nullptr;
return *this;
}
/**
* Unload animation data
*/
void Unload() {
if (keyframePoses != nullptr) {
::UnloadModelAnimations(this, 1);
keyframePoses = nullptr;
}
}
static void Unload(ModelAnimation *modelAnimation, int count) {
::UnloadModelAnimations(modelAnimation, count);
}
/**
* Update model animation pose
*/
ModelAnimation& Update(const ::Model& model, float frame) {
::UpdateModelAnimation(model, *this, frame);
return *this;
}
/**
* Blend two animation poses
*/
ModelAnimation& Blend(const ::Model& model, float frameA, const ::ModelAnimation& animB, float frameB, float blend) {
::UpdateModelAnimationEx(model, *this, frameA, animB, frameB, blend);
return *this;
}
/**
* Check model animation skeleton match
*/
RLCPP_NODISCARD bool IsValid(const ::Model& model) const { return ::IsModelAnimationValid(model, *this); }
protected:
void set(const ::ModelAnimation& model) {
boneCount = model.boneCount;
keyframeCount = model.keyframeCount;
keyframePoses = model.keyframePoses;
// Duplicate the name. TextCopy() uses the null terminator, which we ignore here.
for (int i = 0; i < 32; i++) {
name[i] = model.name[i];
}
}
};
} // namespace raylib
using RModelAnimation = raylib::ModelAnimation;
#endif // RAYLIB_CPP_INCLUDE_MODELANIMATION_HPP_
+211
View File
@@ -0,0 +1,211 @@
#ifndef RAYLIB_CPP_INCLUDE_MODELUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_MODELUNMANAGED_HPP_
#include <string>
#include "./BoundingBox.hpp"
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* A Model that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::Model.
*
* @see raylib::Model
*/
class ModelUnmanaged : public ::Model {
public:
/**
* Default constructor.
*/
ModelUnmanaged() {}
/**
* Creates a ModelUnmanaged from an existing Model struct.
*/
ModelUnmanaged(const ::Model& model) : ::Model(model) {}
/**
* Loads a Model from the given file.
*
* @throws raylib::RaylibException Throws if failed to load the Model.
*/
ModelUnmanaged(const std::string& fileName) { Load(fileName); }
/**
* Loads a Model from the given Mesh.
*
* @throws raylib::RaylibException Throws if failed to load the Model.
*/
ModelUnmanaged(const ::Mesh& mesh) { Load(mesh); }
GETTERSETTER(::Matrix, Transform, transform)
GETTERSETTER(int, MeshCount, meshCount)
GETTERSETTER(int, MaterialCount, materialCount)
GETTERSETTER(::Mesh*, Meshes, meshes)
GETTERSETTER(::Material*, Materials, materials)
GETTERSETTER(int*, MeshMaterial, meshMaterial)
GETTERSETTER(int, BoneCount, skeleton.boneCount)
GETTERSETTER(::BoneInfo*, Bones, skeleton.bones)
GETTERSETTER(::Transform*, BindPose, skeleton.bindPose)
GETTERSETTER(::ModelAnimPose, CurrentPose, currentPose)
GETTERSETTER(::Matrix*, BoneMatrices, boneMatrices)
ModelUnmanaged& operator=(const ::Model& model) {
set(model);
return *this;
}
[[nodiscard]] std::string ToString() const { return TextFormat("Model(meshCount=%d, materialCount=%d)", meshCount, materialCount); }
operator std::string() const { return ToString(); }
/**
* Loads a Model from the given file.
*
* @throws raylib::RaylibException Throws if failed to load the Model.
*/
void Load(const std::string& fileName) {
set(::LoadModel(fileName.c_str()));
if (!IsValid()) {
throw RaylibException("Failed to load Model from " + fileName);
}
}
/**
* Loads a Model from the given Mesh.
*
* @throws raylib::RaylibException Throws if failed to load the Model.
*/
void Load(const ::Mesh& mesh) {
set(::LoadModelFromMesh(mesh));
if (!IsValid()) {
throw RaylibException("Failed to load Model from Mesh");
}
}
/**
* Unload model (including meshes) from memory (RAM and/or VRAM).
*/
void Unload() {
if (meshes != nullptr || materials != nullptr) {
::UnloadModel(*this);
meshes = nullptr;
materials = nullptr;
}
}
/**
* Set material for a mesh.
*/
ModelUnmanaged& SetMeshMaterial(int meshId, int materialId) {
::SetModelMeshMaterial(this, meshId, materialId);
return *this;
}
/**
* Update model animation pose.
*/
ModelUnmanaged& UpdateAnimation(const ::ModelAnimation& anim, float frame) {
::UpdateModelAnimation(*this, anim, frame);
return *this;
}
/**
* Blend two model animation poses.
*/
ModelUnmanaged& BlendAnimation(
const ::ModelAnimation& animA,
float frameA,
const ::ModelAnimation& animB,
float frameB,
float blend) {
::UpdateModelAnimationEx(*this, animA, frameA, animB, frameB, blend);
return *this;
}
/**
* Check model animation skeleton match.
*/
RLCPP_NODISCARD bool IsModelAnimationValid(const ::ModelAnimation& anim) const {
return ::IsModelAnimationValid(*this, anim);
}
/**
* Draw a model (with texture if set).
*/
void Draw(::Vector3 position, float scale = 1.0f, ::Color tint = {255, 255, 255, 255}) const {
::DrawModel(*this, position, scale, tint);
}
/**
* Draw a model with extended parameters.
*/
void Draw(
::Vector3 position,
::Vector3 rotationAxis,
float rotationAngle = 0.0f,
::Vector3 scale = {1.0f, 1.0f, 1.0f},
::Color tint = {255, 255, 255, 255}) const {
::DrawModelEx(*this, position, rotationAxis, rotationAngle, scale, tint);
}
/**
* Draw a model wires (with texture if set).
*/
void DrawWires(::Vector3 position, float scale = 1.0f, ::Color tint = {255, 255, 255, 255}) const {
::DrawModelWires(*this, position, scale, tint);
}
/**
* Draw a model wires (with texture if set) with extended parameters.
*/
void DrawWires(
::Vector3 position,
::Vector3 rotationAxis,
float rotationAngle = 0.0f,
::Vector3 scale = {1.0f, 1.0f, 1.0f},
::Color tint = {255, 255, 255, 255}) const {
::DrawModelWiresEx(*this, position, rotationAxis, rotationAngle, scale, tint);
}
/**
* Compute model bounding box limits (considers all meshes).
*/
RLCPP_NODISCARD BoundingBox GetBoundingBox() const { return ::GetModelBoundingBox(*this); }
/**
* Compute model bounding box limits (considers all meshes).
*/
explicit operator BoundingBox() const { return ::GetModelBoundingBox(*this); }
/**
* Determines whether or not the Model has data in it.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsModelValid(*this); }
protected:
void set(const ::Model& model) {
transform = model.transform;
meshCount = model.meshCount;
materialCount = model.materialCount;
meshes = model.meshes;
materials = model.materials;
meshMaterial = model.meshMaterial;
skeleton.boneCount = model.skeleton.boneCount;
skeleton.bones = model.skeleton.bones;
skeleton.bindPose = model.skeleton.bindPose;
currentPose = model.currentPose;
boneMatrices = model.boneMatrices;
}
};
} // namespace raylib
using RModelUnmanaged = raylib::ModelUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_MODELUNMANAGED_HPP_
+153
View File
@@ -0,0 +1,153 @@
#ifndef RAYLIB_CPP_INCLUDE_MOUSE_HPP_
#define RAYLIB_CPP_INCLUDE_MOUSE_HPP_
#include "./Functions.hpp"
#include "./Vector2.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Input-related functions: mouse
*/
namespace Mouse {
/**
* Detect if a mouse button has been pressed once
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsButtonPressed(int button) {
return ::IsMouseButtonPressed(button);
}
/**
* Detect if a mouse button is being pressed
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsButtonDown(int button) {
return ::IsMouseButtonDown(button);
}
/**
* Detect if a mouse button has been released once
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsButtonReleased(int button) {
return ::IsMouseButtonReleased(button);
}
RLCPP_MAYBEUNUSED RLCPPAPI inline bool IsButtonUp(int button) {
return ::IsMouseButtonUp(button);
}
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetX() {
return ::GetMouseX();
}
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetY() {
return ::GetMouseY();
}
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetX(int x) {
::SetMousePosition(x, GetY());
}
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetY(int y) {
::SetMousePosition(GetX(), y);
}
RLCPP_MAYBEUNUSED RLCPPAPI inline Vector2 GetPosition() {
return ::GetMousePosition();
}
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetPosition(int x, int y) {
::SetMousePosition(x, y);
}
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetPosition(::Vector2 position) {
::SetMousePosition(static_cast<int>(position.x), static_cast<int>(position.y));
}
/**
* Get mouse delta between frames
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline Vector2 GetDelta() {
return ::GetMouseDelta();
}
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetOffset(int offsetX = 0, int offsetY = 0) {
::SetMouseOffset(offsetX, offsetY);
}
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetOffset(::Vector2 offset) {
::SetMouseOffset(static_cast<int>(offset.x), static_cast<int>(offset.y));
}
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetScale(float scaleX = 1.0f, float scaleY = 1.0f) {
::SetMouseScale(scaleX, scaleY);
}
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetScale(::Vector2 scale) {
::SetMouseScale(scale.x, scale.y);
}
/**
* Get mouse wheel movement for X or Y, whichever is larger
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline float GetWheelMove() {
return ::GetMouseWheelMove();
}
/**
* Get mouse wheel movement for both X and Y
*
* @see ::GetMouseWheelMoveV()
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline Vector2 GetWheelMoveV() {
return GetMouseWheelMoveV();
}
/**
* Sets the current mouse cursor icon.
*
* @see ::MouseCursor
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline void SetCursor(int cursor = MOUSE_CURSOR_DEFAULT) {
::SetMouseCursor(cursor);
}
/**
* Get touch position X for touch point 0 (relative to screen size)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetTouchX() {
return ::GetTouchX();
}
/**
* Get touch position Y for touch point 0 (relative to screen size)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetTouchY() {
return ::GetTouchY();
}
/**
* Get touch position XY for a touch point index (relative to screen size)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline Vector2 GetTouchPosition(int index) {
return ::GetTouchPosition(index);
}
/**
* Get a ray trace from mouse position
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline Ray GetRay(::Vector2 mousePosition, const ::Camera& camera) {
return ::GetMouseRay(mousePosition, camera);
}
/**
* Get a ray trace from mouse position
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline Ray GetRay(const ::Camera& camera) {
return ::GetMouseRay(::GetMousePosition(), camera);
}
} // namespace Mouse
} // namespace raylib
namespace RMouse = raylib::Mouse;
#endif // RAYLIB_CPP_INCLUDE_MOUSE_HPP_
+66
View File
@@ -0,0 +1,66 @@
#ifndef RAYLIB_CPP_INCLUDE_MUSIC_HPP_
#define RAYLIB_CPP_INCLUDE_MUSIC_HPP_
#include "./MusicUnmanaged.hpp"
namespace raylib {
/**
* Music stream type (audio file streaming from memory).
*
* The music stream will be unloaded on object destruction. Use raylib::MusicUnmanaged if you're looking to not unload.
*
* @see raylib::MusicUnmanaged
*/
class Music : public MusicUnmanaged {
public:
using MusicUnmanaged::MusicUnmanaged;
Music(const Music&) = delete;
Music& operator=(const Music&) = delete;
Music(Music&& other) noexcept {
set(other);
other.stream = {};
other.frameCount = 0;
other.looping = false;
other.ctxType = 0;
other.ctxData = nullptr;
}
Music& operator=(Music&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.ctxType = 0;
other.ctxData = nullptr;
other.looping = false;
other.frameCount = 0;
other.stream = {};
return *this;
}
Music& operator=(const ::Music& music) {
Unload();
set(music);
return *this;
}
~Music() { Unload(); }
void Load(const std::string& fileName) {
Unload();
MusicUnmanaged::Load(fileName);
}
void Load(const std::string& fileType, unsigned char* data, int dataSize) {
Unload();
MusicUnmanaged::Load(fileType, data, dataSize);
}
};
} // namespace raylib
using RMusic = raylib::Music;
#endif // RAYLIB_CPP_INCLUDE_MUSIC_HPP_
+209
View File
@@ -0,0 +1,209 @@
#ifndef RAYLIB_CPP_INCLUDE_MUSICUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_MUSICUNMANAGED_HPP_
#include <string>
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* A Music stream that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::Music.
*
* @see raylib::Music
*/
class MusicUnmanaged : public ::Music {
public:
/**
* Creates a MusicUnmanaged with the given components.
*/
MusicUnmanaged(
::AudioStream stream = {nullptr, nullptr, 0, 0, 0},
unsigned int frameCount = 0,
bool looping = false,
int ctxType = 0,
void* ctxData = nullptr)
: ::Music{stream, frameCount, looping, ctxType, ctxData} {}
/**
* Creates a MusicUnmanaged from an existing Music struct.
*/
MusicUnmanaged(const ::Music& music) : ::Music(music) {}
/**
* Load music stream from file.
*
* @throws raylib::RaylibException Throws if the music failed to load.
*/
MusicUnmanaged(const std::string& fileName) { Load(fileName); }
/**
* Load music stream from memory.
*
* @throws raylib::RaylibException Throws if the music failed to load.
*/
MusicUnmanaged(const std::string& fileType, unsigned char* data, int dataSize) {
Load(fileType, data, dataSize);
}
GETTER(::AudioStream, Stream, stream)
GETTER(unsigned int, FrameCount, frameCount)
GETTERSETTER(bool, Looping, looping)
GETTER(int, CtxType, ctxType)
GETTER(void*, CtxData, ctxData)
MusicUnmanaged& operator=(const ::Music& music) {
set(music);
return *this;
}
[[nodiscard]] std::string ToString() const { return TextFormat("Music(frameCount=%u, looping=%s)", frameCount, looping ? "true" : "false"); }
operator std::string() const { return ToString(); }
/**
* Load music stream from file.
*
* @throws raylib::RaylibException Throws if the music failed to load.
*/
void Load(const std::string& fileName) {
set(::LoadMusicStream(fileName.c_str()));
if (!IsValid()) {
throw RaylibException(TextFormat("Failed to load Music from file: %s", fileName.c_str()));
}
}
/**
* Load music stream from memory.
*
* @throws raylib::RaylibException Throws if the music failed to load.
*/
void Load(const std::string& fileType, unsigned char* data, int dataSize) {
set(::LoadMusicStreamFromMemory(fileType.c_str(), data, dataSize));
if (!IsValid()) {
throw RaylibException(TextFormat("Failed to load Music from %s file data", fileType.c_str()));
}
}
/**
* Unload music stream.
*/
void Unload() {
if (IsValid()) {
::UnloadMusicStream(*this);
ctxData = nullptr;
ctxType = 0;
}
}
/**
* Start music playing.
*/
MusicUnmanaged& Play() {
::PlayMusicStream(*this);
return *this;
}
/**
* Updates buffers for music streaming.
*/
MusicUnmanaged& Update() {
::UpdateMusicStream(*this);
return *this;
}
/**
* Stop music playing.
*/
MusicUnmanaged& Stop() {
::StopMusicStream(*this);
return *this;
}
/**
* Pause music playing.
*/
MusicUnmanaged& Pause() {
::PauseMusicStream(*this);
return *this;
}
/**
* Resume music playing.
*/
MusicUnmanaged& Resume() {
::ResumeMusicStream(*this);
return *this;
}
/**
* Seek music to a position (in seconds).
*/
MusicUnmanaged& Seek(float position) {
::SeekMusicStream(*this, position);
return *this;
}
/**
* Check if music is playing.
*/
RLCPP_NODISCARD bool IsPlaying() const { return ::IsMusicStreamPlaying(*this); }
/**
* Set volume for music.
*/
MusicUnmanaged& SetVolume(float volume) {
::SetMusicVolume(*this, volume);
return *this;
}
/**
* Set pitch for music.
*/
MusicUnmanaged& SetPitch(float pitch) {
::SetMusicPitch(*this, pitch);
return *this;
}
/**
* Set pan for a music (0.5 is center).
*/
MusicUnmanaged& SetPan(float pan = 0.5f) {
::SetMusicPan(*this, pan);
return *this;
}
/**
* Get music time length (in seconds).
*/
RLCPP_NODISCARD float GetTimeLength() const { return ::GetMusicTimeLength(*this); }
/**
* Get current music time played (in seconds).
*/
RLCPP_NODISCARD float GetTimePlayed() const { return ::GetMusicTimePlayed(*this); }
/**
* Retrieve whether or not the Music has been loaded.
*
* @return True or false depending on whether the Music has been loaded.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsMusicValid(*this); }
protected:
void set(const ::Music& music) {
stream = music.stream;
frameCount = music.frameCount;
looping = music.looping;
ctxType = music.ctxType;
ctxData = music.ctxData;
}
};
} // namespace raylib
using RMusicUnmanaged = raylib::MusicUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_MUSICUNMANAGED_HPP_
+296
View File
@@ -0,0 +1,296 @@
#ifndef RAYLIB_CPP_INCLUDE_QUATERNION_HPP_
#define RAYLIB_CPP_INCLUDE_QUATERNION_HPP_
#ifndef RAYLIB_CPP_NO_MATH
#include <cmath>
#include <utility>
#endif
#include <string>
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
#include "./raymath.hpp"
namespace raylib {
class Vector4 : public ::Vector4 {};
/**
* Quaternion type
*/
class Quaternion : public ::Quaternion {
public:
constexpr Quaternion(const ::Quaternion& quat) : ::Quaternion{quat.x, quat.y, quat.z, quat.w} {}
explicit constexpr Quaternion(const raylib::Vector4 vec4) : ::Quaternion{vec4.x, vec4.y, vec4.z, vec4.w} {}
explicit constexpr Quaternion(const float x = 0, const float y = 0, const float z = 0, const float w = 1) : ::Quaternion{x, y, z, w} {}
GETTERSETTER(float, X, x)
GETTERSETTER(float, Y, y)
GETTERSETTER(float, Z, z)
GETTERSETTER(float, W, w)
Quaternion& operator=(const ::Quaternion& quaternion) {
set(quaternion);
return *this;
}
/*
* An exact value by value equality comparison.
* Due to floating point inaccuracies consider using Equals instead.
*/
constexpr bool operator==(const ::Quaternion& other) const {
return x == other.x && y == other.y && z == other.z && w == other.w;
}
/*
* An exact value by value inequality comparison.
* Due to floating point inaccuracies consider using Equals instead.
*/
constexpr bool operator!=(const ::Quaternion& other) const { return !(*this == other); }
RLCPP_NODISCARD std::string ToString() const { return ::TextFormat("Quaternion(%f, %f, %f, %f)", x, y, z, w); }
operator std::string() const { return ToString(); }
#ifndef RAYLIB_CPP_NO_MATH
/**
* Add two quaternions
*/
RLCPP_NODISCARD Quaternion Add(const ::Quaternion& quaternion) const { return ::QuaternionAdd(*this, quaternion); }
/**
* Add two quaternions
*/
Quaternion operator+(const ::Quaternion& quaternion) const { return ::QuaternionAdd(*this, quaternion); }
Quaternion& operator+=(const ::Quaternion& quaternion) {
set(::QuaternionAdd(*this, quaternion));
return *this;
}
/**
* Add quaternion and float value
*/
RLCPP_NODISCARD Quaternion Add(const float value) const {
return ::QuaternionAddValue(*this, value);
}
/**
* Add quaternion and float value
*/
Quaternion operator+(const float value) const {
return ::QuaternionAddValue(*this, value);
}
/**
* Add quaternion and float value
*/
Quaternion& operator+=(const float value) {
set(::QuaternionAddValue(*this, value));
return *this;
}
/**
* Add quaternion and float value
*/
friend Quaternion operator+(const float lhs, const Quaternion& rhs) { return rhs + lhs; }
/**
* Subtract two quaternions.
*/
RLCPP_NODISCARD Quaternion Subtract(const ::Quaternion& quaternion) const { return ::QuaternionSubtract(*this, quaternion); }
/**
* Subtract two quaternions.
*/
Quaternion operator-(const ::Quaternion& quaternion) const { return ::QuaternionSubtract(*this, quaternion); }
Quaternion& operator-=(const ::Quaternion& quaternion) {
set(::QuaternionSubtract(*this, quaternion));
return *this;
}
/**
* Subtract quaternion by float value
*/
RLCPP_NODISCARD Quaternion Subtract(const float value) const {
return ::QuaternionSubtractValue(*this, value);
}
/**
* Get identity quaternion
*/
static RLCPP_NODISCARD Quaternion Identity() {
return ::QuaternionIdentity();
}
RLCPP_NODISCARD float Length() const { return ::QuaternionLength(*this); }
RLCPP_NODISCARD Quaternion Normalize() const { return ::QuaternionNormalize(*this); }
RLCPP_NODISCARD Quaternion Invert() const { return ::QuaternionInvert(*this); }
/**
* Multiply quaternion by quaternion
*/
RLCPP_NODISCARD Quaternion Multiply(const ::Quaternion& other) const { return ::QuaternionMultiply(*this, other); }
/**
* Multiply quaternion by quaternion
*/
Quaternion operator*(const ::Quaternion& other) const { return ::QuaternionMultiply(*this, other); }
/**
* Multiply quaternion by quaternion
*/
Quaternion& operator*=(const ::Quaternion& other) {
set(::QuaternionMultiply(*this, other));
return *this;
}
/**
* Scale quaternion components by value (multiply)
*/
RLCPP_NODISCARD Quaternion Scale(const float scale) const { return ::QuaternionScale(*this, scale); }
/**
* Divide quaternion by quaternion
*/
RLCPP_NODISCARD Quaternion Divide(const ::Quaternion& quaternion) const { return ::QuaternionDivide(*this, quaternion); }
/**
* Divide quaternion by quaternion
*/
Quaternion operator/(const ::Quaternion& quaternion) const { return ::QuaternionDivide(*this, quaternion); }
/**
* Divide quaternion by quaternion
*/
Quaternion& operator/=(const ::Quaternion& quaternion) {
set(::QuaternionDivide(*this, quaternion));
return *this;
}
/**
* Divide quaternion components by value
*/
RLCPP_NODISCARD constexpr Quaternion Divide(const float div) const { return ::Quaternion{x / div, y / div, z / div, w / div}; }
RLCPP_NODISCARD Quaternion Lerp(const ::Quaternion& v2, const float amount) const
{
return ::QuaternionLerp(*this, v2, amount);
}
/**
* Calculate normalized linear interpolation between two quaternions
*/
RLCPP_NODISCARD Quaternion Nlerp(const ::Quaternion& v2, const float amount) const {
return ::QuaternionNlerp(*this, v2, amount);
}
/**
* Calculates spherical linear interpolation between two quaternions
*/
RLCPP_NODISCARD Quaternion Slerp(const ::Quaternion& v2, const float amount) const {
return ::QuaternionSlerp(*this, v2, amount);
}
/**
* Calculate quaternion cubic spline interpolation using Cubic Hermite Spline
*/
RLCPP_NODISCARD Quaternion CubicHermiteSpline(
const ::Quaternion& outTangent1,
const ::Quaternion& q2,
const ::Quaternion& inTangent2,
const float t
) const {
return ::QuaternionCubicHermiteSpline(*this, outTangent1, q2, inTangent2, t);
}
/**
* Calculate quaternion based on the rotation from one vector to another
*/
static RLCPP_NODISCARD Quaternion FromVector3ToVector3(const ::Vector3& from, const ::Vector3& to) {
return ::QuaternionFromVector3ToVector3(from, to);
}
/**
* Get a quaternion for a given rotation matrix
*/
static RLCPP_NODISCARD Quaternion FromMatrix(const ::Matrix& mat) {
return ::QuaternionFromMatrix(mat);
}
/**
* Get a matrix for this quaternion
*/
RLCPP_NODISCARD ::Matrix ToMatrix() const {
return ::QuaternionToMatrix(*this);
}
/**
* Get rotation quaternion for an angle and axis
* NOTE: Angle must be provided in radians
*/
static RLCPP_NODISCARD Quaternion FromAxisAngle(const ::Vector3& axis, const float angle) {
return ::QuaternionFromAxisAngle(axis, angle);
}
/**
* Get the rotation angle and axis for this quaternion
*/
void ToAxisAngle(::Vector3* outAxis, float* outAngle) const {
::QuaternionToAxisAngle(*this, outAxis, outAngle);
}
/**
* Get the quaternion equivalent to Euler angles
* NOTE: Rotation order is ZYX
*/
static RLCPP_NODISCARD Quaternion FromEuler(const float pitch, const float yaw, const float roll) {
return ::QuaternionFromEuler(pitch, yaw, roll);
}
/**
* Get the Euler angles equivalent to quaternion
* NOTE: Angles are returned in radians
*/
RLCPP_NODISCARD ::Vector3 ToEuler() const {
return ::QuaternionToEuler(*this);
}
/**
* Transform quaternion given transformation matrix
*/
RLCPP_NODISCARD Quaternion Transform(const ::Matrix& mat) const {
return ::QuaternionTransform(*this, mat);
}
/*
* Check whether two given quaternions are almost equal
*/
RLCPP_NODISCARD bool Equals(const ::Quaternion& other) const {
return static_cast<bool>(::QuaternionEquals(*this, other));
}
#endif
protected:
void set(const ::Quaternion& quat) {
x = quat.x;
y = quat.y;
z = quat.z;
w = quat.w;
}
};
} // namespace raylib
using RQuaternion = raylib::Quaternion;
#endif // RAYLIB_CPP_INCLUDE_QUATERNION_HPP_
+90
View File
@@ -0,0 +1,90 @@
#ifndef RAYLIB_CPP_INCLUDE_RAY_HPP_
#define RAYLIB_CPP_INCLUDE_RAY_HPP_
#include "./RayCollision.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Ray type (useful for raycast)
*/
class Ray : public ::Ray {
public:
Ray(const ::Ray& ray) { set(ray); }
constexpr Ray(::Vector3 position = {0.0f, 0.0f, 0.0f}, ::Vector3 direction = {0.0f, 0.0f, 0.0f})
: ::Ray{position, direction} {
// Nothing.
}
Ray(::Vector2 mousePosition, const ::Camera& camera) { set(::GetMouseRay(mousePosition, camera)); }
Ray& operator=(const ::Ray& ray) {
set(ray);
return *this;
}
GETTERSETTER(::Vector3, Position, position)
GETTERSETTER(::Vector3, Direction, direction)
/**
* Draw a ray line
*/
void Draw(::Color color) const { DrawRay(*this, color); }
/**
* Get collision information between ray and sphere
*/
RayCollision GetCollision(::Vector3 center, float radius) const {
return ::GetRayCollisionSphere(*this, center, radius);
}
/**
* Detect collision between ray and box
*/
RayCollision GetCollision(const ::BoundingBox& box) const { return ::GetRayCollisionBox(*this, box); }
/**
* Get collision information between ray and mesh
*/
RayCollision GetCollision(const ::Mesh& mesh, const ::Matrix& transform) const {
return ::GetRayCollisionMesh(*this, mesh, transform);
}
/**
* Get collision info between ray and triangle
*/
RayCollision GetCollision(::Vector3 p1, ::Vector3 p2, ::Vector3 p3) const {
return ::GetRayCollisionTriangle(*this, p1, p2, p3);
}
/**
* Get collision info between ray and quad
*/
RayCollision GetCollision(::Vector3 p1, ::Vector3 p2, ::Vector3 p3, ::Vector3 p4) const {
return ::GetRayCollisionQuad(*this, p1, p2, p3, p4);
}
/**
* Get a ray trace from mouse position
*/
static Ray GetMouse(::Vector2 mousePosition, const ::Camera& camera) {
return ::GetMouseRay(mousePosition, camera);
}
/**
* Get a ray trace from mouse position
*/
static Ray GetMouse(const ::Camera& camera) { return ::GetMouseRay(::GetMousePosition(), camera); }
protected:
void set(const ::Ray& ray) {
position = ray.position;
direction = ray.direction;
}
};
} // namespace raylib
using RRay = raylib::Ray;
#endif // RAYLIB_CPP_INCLUDE_RAY_HPP_
+93
View File
@@ -0,0 +1,93 @@
#ifndef RAYLIB_CPP_INCLUDE_RAYCOLLISION_HPP_
#define RAYLIB_CPP_INCLUDE_RAYCOLLISION_HPP_
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Raycast hit information
*/
class RayCollision : public ::RayCollision {
public:
RayCollision(const ::RayCollision& ray) : ::RayCollision(ray) { }
constexpr RayCollision(bool hit, float distance, ::Vector3 point, ::Vector3 normal)
: ::RayCollision{hit, distance, point, normal} {
// Nothing.
}
/**
* Get collision info between ray and bounding box
*/
RayCollision(const ::Ray& ray, const ::BoundingBox& box)
: ::RayCollision(::GetRayCollisionBox(ray, box)) {
// Nothing.
}
/**
* Get collision info between ray and mesh
*/
RayCollision(const ::Ray& ray, const ::Mesh& mesh, const ::Matrix& transform)
: ::RayCollision(::GetRayCollisionMesh(ray, mesh, transform)) {
// Nothing.
}
/**
* Get collision info between ray and quad
*/
RayCollision(const ::Ray& ray, ::Vector3 p1, ::Vector3 p2, ::Vector3 p3, ::Vector3 p4)
: ::RayCollision(::GetRayCollisionQuad(ray, p1, p2, p3, p4)) {
// Nothing.
}
/**
* Get collision info between ray and sphere
*/
RayCollision(const ::Ray& ray, ::Vector3 center, float radius)
: ::RayCollision(::GetRayCollisionSphere(ray, center, radius)) {
// Nothing.
}
/**
* Get collision info between ray and triangle
*/
RayCollision(const ::Ray& ray, ::Vector3 p1, ::Vector3 p2, ::Vector3 p3)
: ::RayCollision(::GetRayCollisionTriangle(ray, p1, p2, p3)) {
// Nothing.
}
RayCollision& operator=(const ::RayCollision& ray) {
set(ray);
return *this;
}
[[nodiscard]] std::string ToString() const {
return TextFormat(
"RayCollision(hit=%s, distance=%f, point=(%f, %f, %f), normal=(%f, %f, %f))",
hit ? "true" : "false",
distance,
point.x, point.y, point.z,
normal.x, normal.y, normal.z
);
}
operator std::string() const { return ToString(); }
GETTERSETTER(bool, Hit, hit)
GETTERSETTER(float, Distance, distance)
GETTERSETTER(::Vector3, Position, point)
GETTERSETTER(::Vector3, Normal, normal)
protected:
void set(const ::RayCollision& ray) {
hit = ray.hit;
distance = ray.distance;
point = ray.point;
normal = ray.normal;
}
};
} // namespace raylib
using RRayCollision = raylib::RayCollision;
#endif // RAYLIB_CPP_INCLUDE_RAYCOLLISION_HPP_
+36
View File
@@ -0,0 +1,36 @@
#ifndef RAYLIB_CPP_INCLUDE_RAYLIBEXCEPTION_HPP_
#define RAYLIB_CPP_INCLUDE_RAYLIBEXCEPTION_HPP_
#include <stdexcept>
#include <string>
#include "./raylib.hpp"
namespace raylib {
/**
* Exception used for most raylib-related exceptions.
*/
class RaylibException : public std::runtime_error {
public:
/**
* Construct a runtime exception with the given message.
*
* @param message The message to provide for the exception.
*/
explicit RaylibException(const std::string& message) noexcept : std::runtime_error(message) {
// Nothing
}
/**
* Outputs the exception message to TraceLog().
*
* @param logLevel The output status to use when outputing.
*/
void TraceLog(int logLevel = LOG_ERROR) { ::TraceLog(logLevel, std::runtime_error::what()); }
};
} // namespace raylib
using RRaylibException = raylib::RaylibException;
#endif // RAYLIB_CPP_INCLUDE_RAYLIBEXCEPTION_HPP_
+162
View File
@@ -0,0 +1,162 @@
#ifndef RAYLIB_CPP_INCLUDE_RECTANGLE_HPP_
#define RAYLIB_CPP_INCLUDE_RECTANGLE_HPP_
#include "./Vector2.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Rectangle type
*/
class Rectangle : public ::Rectangle {
public:
constexpr Rectangle(const ::Rectangle& rect) : ::Rectangle{rect.x, rect.y, rect.width, rect.height} {}
constexpr Rectangle(float x = 0, float y = 0, float width = 0, float height = 0) : ::Rectangle{x, y, width, height} {}
constexpr Rectangle(::Vector2 position, ::Vector2 size) : ::Rectangle{position.x, position.y, size.x, size.y} {}
constexpr Rectangle(::Vector2 size) : ::Rectangle{0, 0, size.x, size.y} {}
constexpr Rectangle(::Vector4 rect) : ::Rectangle{rect.x, rect.y, rect.z, rect.w} {}
GETTERSETTER(float, X, x)
GETTERSETTER(float, Y, y)
GETTERSETTER(float, Width, width)
GETTERSETTER(float, Height, height)
Rectangle& operator=(const ::Rectangle& rect) {
set(rect);
return *this;
}
constexpr ::Vector4 ToVector4() const { return {x, y, width, height}; }
constexpr explicit operator ::Vector4() const { return {x, y, width, height}; }
[[nodiscard]] std::string ToString() const { return TextFormat("Rectangle(%fx%f, %fx%f)", x, y, width, height); }
operator std::string() const { return ToString(); }
/**
* Draw a color-filled rectangle
*/
static void Draw(int posX, int posY, int width, int height, ::Color color) {
::DrawRectangle(posX, posY, width, height, color);
}
static void Draw(::Vector2 position, ::Vector2 size, ::Color color) {
::DrawRectangleV(position, size, color);
}
void Draw(::Color color) const { ::DrawRectangleRec(*this, color); }
void Draw(::Vector2 origin, float rotation, ::Color color) const {
::DrawRectanglePro(*this, origin, rotation, color);
}
void DrawGradientV(::Color color1, ::Color color2) const {
::DrawRectangleGradientV(
static_cast<int>(x),
static_cast<int>(y),
static_cast<int>(width),
static_cast<int>(height),
color1,
color2);
}
void DrawGradientH(::Color color1, ::Color color2) const {
::DrawRectangleGradientH(
static_cast<int>(x),
static_cast<int>(y),
static_cast<int>(width),
static_cast<int>(height),
color1,
color2);
}
void DrawGradient(::Color topLeft, ::Color bottomLeft, ::Color bottomRight, ::Color topRight) const {
::DrawRectangleGradientEx(*this, topLeft, bottomLeft, bottomRight, topRight);
}
void DrawLines(::Color color) const {
::DrawRectangleLines(
static_cast<int>(x),
static_cast<int>(y),
static_cast<int>(width),
static_cast<int>(height),
color);
}
void DrawLines(::Color color, float lineThick) const { ::DrawRectangleLinesEx(*this, lineThick, color); }
void DrawRounded(float roundness, int segments, ::Color color) const {
::DrawRectangleRounded(*this, roundness, segments, color);
}
void DrawRoundedLines(float roundness, int segments, ::Color color) const {
::DrawRectangleRoundedLines(*this, roundness, segments, color);
}
void DrawRoundedLines(float roundness, int segments, float lineThick, ::Color color) const {
::DrawRectangleRoundedLinesEx(*this, roundness, segments, lineThick, color);
}
/**
* Check collision between two rectangles
*/
RLCPP_NODISCARD bool CheckCollision(::Rectangle rec2) const { return ::CheckCollisionRecs(*this, rec2); }
/**
* Get collision rectangle for two rectangles collision
*/
RLCPP_NODISCARD ::Rectangle GetCollision(::Rectangle rec2) const { return ::GetCollisionRec(*this, rec2); }
/**
* Check if point is inside rectangle
*/
RLCPP_NODISCARD bool CheckCollision(::Vector2 point) const { return ::CheckCollisionPointRec(point, *this); }
/**
* Check collision between circle and rectangle
*/
RLCPP_NODISCARD bool CheckCollision(::Vector2 center, float radius) const {
return ::CheckCollisionCircleRec(center, radius, *this);
}
RLCPP_NODISCARD Vector2 GetSize() const { return {width, height}; }
Rectangle& SetSize(float newWidth, float newHeight) {
width = newWidth;
height = newHeight;
return *this;
}
Rectangle& SetSize(const ::Vector2& size) { return SetSize(size.x, size.y); }
Rectangle& SetShapesTexture(const ::Texture2D& texture) {
::SetShapesTexture(texture, *this);
return *this;
}
RLCPP_NODISCARD Vector2 GetPosition() const { return {x, y}; }
Rectangle& SetPosition(float newX, float newY) {
x = newX;
y = newY;
return *this;
}
Rectangle& SetPosition(const ::Vector2& position) { return SetPosition(position.x, position.y); }
protected:
void set(const ::Rectangle& rect) {
x = rect.x;
y = rect.y;
width = rect.width;
height = rect.height;
}
};
} // namespace raylib
using RRectangle = raylib::Rectangle;
#endif // RAYLIB_CPP_INCLUDE_RECTANGLE_HPP_
+65
View File
@@ -0,0 +1,65 @@
#ifndef RAYLIB_CPP_INCLUDE_RENDERTEXTURE_HPP_
#define RAYLIB_CPP_INCLUDE_RENDERTEXTURE_HPP_
#include "./RenderTextureUnmanaged.hpp"
namespace raylib {
/**
* RenderTexture type, for texture rendering.
*
* The render texture will be unloaded on object destruction. Use raylib::RenderTextureUnmanaged
* if you're looking to not unload.
*
* @see raylib::RenderTextureUnmanaged
*/
class RenderTexture : public RenderTextureUnmanaged {
public:
using RenderTextureUnmanaged::RenderTextureUnmanaged;
RenderTexture(const RenderTexture&) = delete;
RenderTexture& operator=(const RenderTexture&) = delete;
RenderTexture(RenderTexture&& other) noexcept {
set(other);
other.id = 0;
other.texture = {};
other.depth = {};
}
RenderTexture& operator=(RenderTexture&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.id = 0;
other.texture = {};
other.depth = {};
return *this;
}
RenderTexture& operator=(const ::RenderTexture& other) {
Unload();
set(other);
return *this;
}
~RenderTexture() { Unload(); }
/**
* Unload previous render texture, then load a new one.
*/
void Load(int width, int height) {
Unload();
RenderTextureUnmanaged::Load(width, height);
}
};
using RenderTexture2D = RenderTexture;
} // namespace raylib
using RRenderTexture = raylib::RenderTexture;
using RRenderTexture2D = raylib::RenderTexture2D;
#endif // RAYLIB_CPP_INCLUDE_RENDERTEXTURE_HPP_
+123
View File
@@ -0,0 +1,123 @@
#ifndef RAYLIB_CPP_INCLUDE_RENDERTEXTUREUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_RENDERTEXTUREUNMANAGED_HPP_
#include "./RaylibException.hpp"
#include "./TextureUnmanaged.hpp"
#include "./raylib-cpp-utils.hpp"
namespace raylib {
/**
* A RenderTexture that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::RenderTexture.
*
* @see raylib::RenderTexture
*/
class RenderTextureUnmanaged : public ::RenderTexture {
public:
/**
* Default constructor to build an empty RenderTexture.
*/
RenderTextureUnmanaged() : ::RenderTexture{0, {}, {}} {}
/**
* Creates a RenderTexture from an existing RenderTexture struct.
*/
RenderTextureUnmanaged(const ::RenderTexture& renderTexture) : ::RenderTexture(renderTexture) {}
/**
* Creates a RenderTexture from its components.
*/
RenderTextureUnmanaged(unsigned int id, const ::Texture& texture, const ::Texture& depth)
: ::RenderTexture{id, texture, depth} {}
/**
* Load texture for rendering (framebuffer).
*
* @throws raylib::RaylibException Throws if failed to create the render texture.
*/
RenderTextureUnmanaged(int width, int height) { Load(width, height); }
[[nodiscard]] std::string ToString() const { return TextFormat("RenderTexture(id=%u)", id); }
operator std::string() const { return ToString(); }
GETTER(unsigned int, Id, id)
/**
* Get the color buffer attachment texture.
*/
TextureUnmanaged GetTexture() { return texture; }
RLCPP_NODISCARD TextureUnmanaged GetTexture() const { return texture; }
void SetTexture(const ::Texture& newTexture) { texture = newTexture; }
/**
* Get the depth buffer attachment texture.
*/
TextureUnmanaged GetDepth() { return depth; }
void SetDepth(const ::Texture& newDepth) { depth = newDepth; }
RenderTextureUnmanaged& operator=(const ::RenderTexture& other) {
set(other);
return *this;
}
/**
* Load texture for rendering (framebuffer).
*
* @throws raylib::RaylibException Throws if failed to create the render texture.
*/
void Load(int width, int height) {
set(::LoadRenderTexture(width, height));
if (!IsValid()) {
throw RaylibException("Failed to create RenderTexture");
}
}
/**
* Unload render texture from GPU memory (VRAM).
*/
void Unload() {
if (IsValid()) {
::UnloadRenderTexture(*this);
id = 0;
}
}
/**
* Initializes render texture for drawing.
*/
RenderTextureUnmanaged& BeginMode() {
::BeginTextureMode(*this);
return *this;
}
/**
* Ends drawing to render texture.
*/
RenderTextureUnmanaged& EndMode() {
::EndTextureMode();
return *this;
}
/**
* Retrieves whether or not the render texture is ready.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsRenderTextureValid(*this); }
protected:
void set(const ::RenderTexture& renderTexture) {
id = renderTexture.id;
texture = renderTexture.texture;
depth = renderTexture.depth;
}
};
using RenderTexture2DUnmanaged = RenderTextureUnmanaged;
} // namespace raylib
using RRenderTextureUnmanaged = raylib::RenderTextureUnmanaged;
using RRenderTexture2DUnmanaged = raylib::RenderTexture2DUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_RENDERTEXTUREUNMANAGED_HPP_
+53
View File
@@ -0,0 +1,53 @@
#ifndef RAYLIB_CPP_INCLUDE_SHADER_HPP_
#define RAYLIB_CPP_INCLUDE_SHADER_HPP_
#include <string>
#include "ShaderUnmanaged.hpp"
#include "Texture.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Shader type (generic)
*/
class Shader : public ShaderUnmanaged {
public:
using ShaderUnmanaged::ShaderUnmanaged;
Shader(const Shader&) = delete;
Shader(Shader&& other) noexcept {
set(other);
other.id = 0;
other.locs = nullptr;
}
Shader& operator=(const Shader&) = delete;
Shader& operator=(Shader&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.id = 0;
other.locs = nullptr;
return *this;
}
/**
* Unload shader from GPU memory (VRAM)
*/
~Shader() { Unload(); }
};
} // namespace raylib
using RShader = raylib::Shader;
#endif // RAYLIB_CPP_INCLUDE_SHADER_HPP_
+160
View File
@@ -0,0 +1,160 @@
#ifndef RAYLIB_CPP_INCLUDE_SHADERUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_SHADERUNMANAGED_HPP_
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
#include <rlgl.h>
#include <string>
namespace raylib {
/**
* Shader type (generic), not managed by C++ RAII.
*/
class ShaderUnmanaged : public ::Shader {
public:
ShaderUnmanaged() : ::Shader{rlGetShaderIdDefault(), rlGetShaderLocsDefault()} {}
ShaderUnmanaged(const ::Shader& shader) : ::Shader(shader) { }
ShaderUnmanaged(unsigned int id, int* locs = nullptr) : ::Shader{id, locs} {}
ShaderUnmanaged(const std::string& vsFileName, const std::string& fsFileName) {
set(::LoadShader(vsFileName.c_str(), fsFileName.c_str()));
}
ShaderUnmanaged(const char* vsFileName, const char* fsFileName) { set(::LoadShader(vsFileName, fsFileName)); }
/**
* Load shader from files and bind default locations.
*
* @see ::LoadShader
*/
static ::Shader Load(const std::string& vsFileName, const std::string& fsFileName) {
return ::LoadShader(vsFileName.c_str(), fsFileName.c_str());
}
static ::Shader Load(const char* vsFileName, const char* fsFileName) {
return ::LoadShader(vsFileName, fsFileName);
}
/**
* Load a shader from memory.
*
* @see ::LoadShaderFromMemory
*/
static ::Shader LoadFromMemory(const std::string& vsCode, const std::string& fsCode) {
return ::LoadShaderFromMemory(vsCode.c_str(), fsCode.c_str());
}
static ::Shader LoadFromMemory(const char* vsCode, const char* fsCode) {
return ::LoadShaderFromMemory(vsCode, fsCode);
}
GETTER(unsigned int, Id, id)
GETTER(int*, Locs, locs)
ShaderUnmanaged& operator=(const ::Shader& shader) {
set(shader);
return *this;
}
[[nodiscard]] std::string ToString() const { return TextFormat("Shader(id=%u)", id); }
operator std::string() const { return ToString(); }
/**
* Begin custom shader drawing.
*/
ShaderUnmanaged& BeginMode() {
::BeginShaderMode(*this);
return *this;
}
/**
* End custom shader drawing (use default shader).
*/
ShaderUnmanaged& EndMode() {
::EndShaderMode();
return *this;
}
/**
* Get shader uniform location
*
* @see GetShaderLocation()
*/
RLCPP_NODISCARD int GetLocation(const std::string& uniformName) const { return ::GetShaderLocation(*this, uniformName.c_str()); }
/**
* Get shader attribute location
*
* @see GetShaderLocationAttrib()
*/
RLCPP_NODISCARD int GetLocationAttrib(const std::string& attribName) const {
return ::GetShaderLocationAttrib(*this, attribName.c_str());
}
/**
* Set shader uniform value
*
* @see SetShaderValue()
*/
ShaderUnmanaged& SetValue(int uniformLoc, const void* value, int uniformType) {
::SetShaderValue(*this, uniformLoc, value, uniformType);
return *this;
}
/**
* Set shader uniform value vector
*
* @see SetShaderValueV()
*/
ShaderUnmanaged& SetValue(int uniformLoc, const void* value, int uniformType, int count) {
::SetShaderValueV(*this, uniformLoc, value, uniformType, count);
return *this;
}
/**
* Set shader uniform value (matrix 4x4)
*
* @see SetShaderValueMatrix()
*/
ShaderUnmanaged& SetValue(int uniformLoc, const ::Matrix& mat) {
::SetShaderValueMatrix(*this, uniformLoc, mat);
return *this;
}
/**
* Set shader uniform value for texture
*
* @see SetShaderValueTexture()
*/
ShaderUnmanaged& SetValue(int uniformLoc, const ::Texture2D& texture) {
::SetShaderValueTexture(*this, uniformLoc, texture);
return *this;
}
/**
* Unload shader from GPU memory (VRAM).
*/
void Unload() {
if (locs != nullptr) {
::UnloadShader(*this);
locs = nullptr;
}
}
/**
* Retrieves whether or not the shader is ready.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsShaderValid(*this); }
protected:
void set(const ::Shader& shader) {
id = shader.id;
locs = shader.locs;
}
};
} // namespace raylib
using RShaderUnmanaged = raylib::ShaderUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_SHADERUNMANAGED_HPP_
+59
View File
@@ -0,0 +1,59 @@
#ifndef RAYLIB_CPP_INCLUDE_SOUND_HPP_
#define RAYLIB_CPP_INCLUDE_SOUND_HPP_
#include "./SoundUnmanaged.hpp"
namespace raylib {
/**
* Wave/Sound management functions.
*
* The sound will be unloaded on object destruction. Use raylib::SoundUnmanaged if you're looking to not unload.
*
* @code
* raylib::Sound boom("boom.wav");
* boom.Play();
* @endcode
*
* @see raylib::SoundUnmanaged
*/
class Sound : public SoundUnmanaged {
public:
using SoundUnmanaged::SoundUnmanaged;
Sound(const Sound&) = delete;
Sound& operator=(const Sound&) = delete;
Sound(Sound&& other) noexcept {
set(other);
other.stream = {nullptr, nullptr, 0, 0, 0};
other.frameCount = 0;
}
Sound& operator=(Sound&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.frameCount = 0;
other.stream = {nullptr, nullptr, 0, 0, 0};
return *this;
}
~Sound() { Unload(); }
void Load(const std::string& fileName) {
Unload();
SoundUnmanaged::Load(fileName);
}
void Load(const ::Wave& wave) {
Unload();
SoundUnmanaged::Load(wave);
}
};
} // namespace raylib
using RSound = raylib::Sound;
#endif // RAYLIB_CPP_INCLUDE_SOUND_HPP_
+190
View File
@@ -0,0 +1,190 @@
#ifndef RAYLIB_CPP_INCLUDE_SOUNDUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_SOUNDUNMANAGED_HPP_
#include <string>
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* A Sound that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::Sound.
*
* @see raylib::Sound
*/
class SoundUnmanaged : public ::Sound {
public:
/**
* Default constructor, creates an empty Sound.
*/
SoundUnmanaged() : ::Sound{{nullptr, nullptr, 0, 0, 0}, 0} {}
/**
* Creates a SoundUnmanaged from its components.
*/
SoundUnmanaged(::AudioStream stream, unsigned int frameCount) : ::Sound{stream, frameCount} {}
/**
* Creates a SoundUnmanaged from an existing Sound struct.
*/
SoundUnmanaged(const ::Sound& sound) : ::Sound(sound) {}
/**
* Loads a Sound from the given file.
*
* @throws raylib::RaylibException Throws if the Sound failed to load.
*/
SoundUnmanaged(const std::string& fileName) { Load(fileName); }
/**
* Loads a Sound from the given Wave.
*
* @throws raylib::RaylibException Throws if the Sound failed to load.
*/
SoundUnmanaged(const ::Wave& wave) { Load(wave); }
GETTER(unsigned int, FrameCount, frameCount)
GETTER(::AudioStream, Stream, stream)
SoundUnmanaged& operator=(const ::Sound& sound) {
set(sound);
return *this;
}
[[nodiscard]] std::string ToString() const { return TextFormat("Sound(frameCount=%u)", frameCount); }
operator std::string() const { return ToString(); }
/**
* Load a sound from the given file.
*
* @throws raylib::RaylibException Throws if the Sound failed to load.
*/
void Load(const std::string& fileName) {
set(::LoadSound(fileName.c_str()));
if (!IsValid()) {
throw RaylibException("Failed to load Sound from file");
}
}
/**
* Load a sound from the given Wave.
*
* @throws raylib::RaylibException Throws if the Sound failed to load.
*/
void Load(const ::Wave& wave) {
set(::LoadSoundFromWave(wave));
if (!IsValid()) {
throw RaylibException("Failed to load Wave");
}
}
/**
* Unload sound.
*/
void Unload() {
// Protect against calling UnloadSound() twice.
if (frameCount != 0) {
::UnloadSound(*this);
frameCount = 0;
}
}
/**
* Update sound buffer with new data.
*/
SoundUnmanaged& Update(const void* data, int samplesCount) {
::UpdateSound(*this, data, samplesCount);
return *this;
}
/**
* Update sound buffer with new data, assuming it's the same sample count.
*/
SoundUnmanaged& Update(const void* data) {
::UpdateSound(*this, data, static_cast<int>(frameCount));
return *this;
}
/**
* Play a sound.
*/
SoundUnmanaged& Play() {
::PlaySound(*this);
return *this;
}
/**
* Stop playing a sound.
*/
SoundUnmanaged& Stop() {
::StopSound(*this);
return *this;
}
/**
* Pause a sound.
*/
SoundUnmanaged& Pause() {
::PauseSound(*this);
return *this;
}
/**
* Resume a paused sound.
*/
SoundUnmanaged& Resume() {
::ResumeSound(*this);
return *this;
}
/**
* Check if a sound is currently playing.
*/
RLCPP_NODISCARD bool IsPlaying() const { return ::IsSoundPlaying(*this); }
/**
* Set volume for a sound (1.0 is max level).
*/
SoundUnmanaged& SetVolume(float volume) {
::SetSoundVolume(*this, volume);
return *this;
}
/**
* Set pitch for a sound (1.0 is base level).
*/
SoundUnmanaged& SetPitch(float pitch) {
::SetSoundPitch(*this, pitch);
return *this;
}
/**
* Set pan for a sound (0.5 is center).
*/
SoundUnmanaged& SetPan(float pan = 0.5f) {
::SetSoundPan(*this, pan);
return *this;
}
/**
* Retrieve whether or not the Sound buffer is loaded.
*
* @return True or false depending on whether the Sound buffer is loaded.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsSoundValid(*this); }
protected:
void set(const ::Sound& sound) {
stream = sound.stream;
frameCount = sound.frameCount;
}
};
} // namespace raylib
using RSoundUnmanaged = raylib::SoundUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_SOUNDUNMANAGED_HPP_
+199
View File
@@ -0,0 +1,199 @@
#ifndef RAYLIB_CPP_INCLUDE_TEXT_HPP_
#define RAYLIB_CPP_INCLUDE_TEXT_HPP_
#include <string>
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Text Functions.
*/
class Text {
public:
/**
* The internal text.
*/
std::string text;
/**
* The size of the text.
*/
float fontSize;
/**
* The color of the text.
*/
::Color color;
/**
* The internal raylib font to use for the text.
*/
::Font font;
/**
* The character spacing for the text.
*/
float spacing;
/**
* Initializes a new Text object.
*
* @param text Text to initialize.
* @param fontSize The size of the text.
* @param color The color of the font.
* @param font Font to initialize.
* @param spacing The spacing of the text.
*/
Text(
const std::string& text = "",
float fontSize = 10,
const ::Color& color = WHITE,
const ::Font& font = ::GetFontDefault(),
float spacing = 0)
: text(text)
, fontSize(fontSize)
, color(color)
, font(font)
, spacing(spacing) {
// Nothing.
}
/**
* Initializes a new Text object with a custom font.
*
* @param font Font to initialize.
* @param text Text to initialize.
* @param fontSize The size of the text.
* @param spacing The spacing of the text.
* @param color The color of the font.
*/
Text(
const ::Font& font,
const std::string& text = "",
float fontSize = 10,
float spacing = 0,
const ::Color& color = WHITE)
: text(text)
, fontSize(fontSize)
, color(color)
, font(font)
, spacing(spacing) {
// Nothing.
}
GETTERSETTER(const std::string&, Text, text)
GETTERSETTER(float, FontSize, fontSize)
GETTERSETTER(::Font, Font, font)
GETTERSETTER(::Color, Color, color)
GETTERSETTER(float, Spacing, spacing)
/**
* Draw text with values in class.
*/
void Draw(const ::Vector2& position) const { ::DrawTextEx(font, text.c_str(), position, fontSize, spacing, color); }
/**
* Draw text with values in class.
*/
void Draw(int posX, int posY) const {
::DrawTextEx(
font,
text.c_str(),
{static_cast<float>(posX), static_cast<float>(posY)},
fontSize,
spacing,
color);
}
/**
* Draw text using Font and pro parameters (rotation).
*
* @see DrawTextPro()
*/
void Draw(const ::Vector2& position, float rotation, const ::Vector2& origin = {0, 0}) const {
::DrawTextPro(font, text.c_str(), position, origin, rotation, fontSize, spacing, color);
}
/**
* Measure string width for default font
*/
RLCPP_NODISCARD int Measure() const { return ::MeasureText(text.c_str(), static_cast<int>(fontSize)); }
/**
* Measure string size for Font
*/
RLCPP_NODISCARD Vector2 MeasureEx() const { return ::MeasureTextEx(font, text.c_str(), fontSize, spacing); }
Text& operator=(const Text& other) {
if (this == &other) {
return *this;
}
text = other.text;
fontSize = other.fontSize;
color = other.color;
font = other.font;
spacing = other.spacing;
return *this;
}
/**
* Draw text using font and color
*
* @see ::DrawText
*/
static void
Draw(const std::string& text, const int posX, const int posY, const int fontSize, const ::Color& color) {
::DrawText(text.c_str(), posX, posY, fontSize, color);
}
/**
* Draw text using font and color, with position defined as Vector2
*
* @see ::DrawText
*/
static void Draw(const std::string& text, const ::Vector2& pos, const int fontSize, const ::Color& color) {
::DrawText(text.c_str(), static_cast<int>(pos.x), static_cast<int>(pos.y), fontSize, color);
}
/**
* Draw text using font, color, position, font size and spacing
*
* @see ::DrawTextEx
*/
static void Draw(
const ::Font& font,
const std::string& text,
const ::Vector2& position,
const float fontSize,
const float spacing,
const ::Color& color) {
::DrawTextEx(font, text.c_str(), position, fontSize, spacing, color);
}
/**
* Draw text using font, color, position, origin, font size and spacing
*
* @see ::DrawTextPro
*/
static void Draw(
const ::Font& font,
const std::string& text,
const ::Vector2& position,
const ::Vector2& origin,
const float rotation,
const float fontSize,
const float spacing,
const ::Color& color) {
::DrawTextPro(font, text.c_str(), position, origin, rotation, fontSize, spacing, color);
}
};
} // namespace raylib
using RText = raylib::Text;
#endif // RAYLIB_CPP_INCLUDE_TEXT_HPP_
+102
View File
@@ -0,0 +1,102 @@
#ifndef RAYLIB_CPP_INCLUDE_TEXTURE_HPP_
#define RAYLIB_CPP_INCLUDE_TEXTURE_HPP_
#include "./TextureUnmanaged.hpp"
namespace raylib {
/**
* Texture type
*
* The texture will be unloaded on object destruction. Use raylib::TextureUnmanaged if you're looking to not unload.
*
* @see raylib::TextureUnmanaged
*/
class Texture : public TextureUnmanaged {
public:
using TextureUnmanaged::TextureUnmanaged;
/**
* Explicitly forbid the copy constructor.
*/
Texture(const Texture&) = delete;
/**
* Explicitly forbid copy assignment.
*/
Texture& operator=(const Texture&) = delete;
/**
* Move constructor.
*/
Texture(Texture&& other) noexcept {
set(other);
other.id = 0;
other.width = 0;
other.height = 0;
other.mipmaps = 0;
other.format = 0;
}
/**
* On destruction, unload the Texture.
*/
~Texture() { Unload(); }
/**
* Move assignment.
*/
Texture& operator=(Texture&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.id = 0;
other.width = 0;
other.height = 0;
other.mipmaps = 0;
other.format = 0;
return *this;
}
/**
* Unload previous texture, then load texture from image data
*/
void Load(const ::Image& image) {
Unload();
TextureUnmanaged::Load(image);
}
/**
* Unload previous texture, then load cubemap from image.
* Multiple image cubemap layouts supported
*/
void Load(const ::Image& image, int layoutType) {
Unload();
TextureUnmanaged::Load(image, layoutType);
}
/**
* Unload previous texture, then load texture from file into GPU memory (VRAM)
*/
void Load(const std::string& fileName) {
Unload();
TextureUnmanaged::Load(fileName);
}
};
// Create the Texture aliases.
using Texture2D = Texture;
using TextureCubemap = Texture;
} // namespace raylib
using RTexture = raylib::Texture;
using RTexture2D = raylib::Texture2D;
using RTextureCubemap = raylib::TextureCubemap;
#endif // RAYLIB_CPP_INCLUDE_TEXTURE_HPP_
+347
View File
@@ -0,0 +1,347 @@
#ifndef RAYLIB_CPP_INCLUDE_TEXTUREUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_TEXTUREUNMANAGED_HPP_
#include <string>
#include "./Image.hpp"
#include "./Material.hpp"
#include "./RaylibException.hpp"
#include "./Vector2.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* A Texture that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::Texture.
*
* @see raylib::Texture
*/
class TextureUnmanaged : public ::Texture {
public:
/**
* Default texture constructor.
*/
TextureUnmanaged() : ::Texture{0, 0, 0, 0, 0} {
// Nothing.
}
/**
* Move/Create a texture structure manually.
*/
TextureUnmanaged(
unsigned int id,
int width,
int height,
int mipmaps = 1,
int format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8)
: ::Texture{id, width, height, mipmaps, format} {
// Nothing.
}
/**
* Creates a texture object based on the given Texture struct data.
*/
TextureUnmanaged(const ::Texture& texture)
: ::Texture{texture.id, texture.width, texture.height, texture.mipmaps, texture.format} {
// Nothing.
}
/**
* Creates a texture from the given Image.
*
* @throws raylib::RaylibException Throws if failed to create the texture from the given image.
*/
TextureUnmanaged(const ::Image& image) { Load(image); }
/**
* Load cubemap from image, multiple image cubemap layouts supported.
*
* @throws raylib::RaylibException Throws if failed to create the texture from the given cubemap.
*
* @see LoadTextureCubemap()
*/
TextureUnmanaged(const ::Image& image, int layout) { Load(image, layout); }
/**
* Load texture from file into GPU memory (VRAM)
*
* @throws raylib::RaylibException Throws if failed to create the texture from the given file.
*/
TextureUnmanaged(const std::string& fileName) { Load(fileName); }
TextureUnmanaged(::Texture&& other) : ::Texture{other.id, other.width, other.height, other.mipmaps, other.format} {
// Nothing.
}
GETTER(unsigned int, Id, id)
GETTER(int, Width, width)
GETTER(int, Height, height)
GETTER(int, Mipmaps, mipmaps)
GETTER(int, Format, format)
TextureUnmanaged& operator=(const ::Texture& texture) {
set(texture);
return *this;
}
[[nodiscard]] std::string ToString() const { return TextFormat("Texture(id=%u, %dx%d)", id, width, height); }
operator std::string() const { return ToString(); }
/**
* Retrieve the width and height of the texture.
*/
RLCPP_NODISCARD Vector2 GetSize() const { return {static_cast<float>(width), static_cast<float>(height)}; }
/**
* Load texture from image data
*/
void Load(const ::Image& image) {
set(::LoadTextureFromImage(image));
if (!IsValid()) {
throw RaylibException("Failed to load Texture from Image");
}
}
/**
* Load cubemap from image, multiple image cubemap layouts supported
*/
void Load(const ::Image& image, int layoutType) {
set(::LoadTextureCubemap(image, layoutType));
if (!IsValid()) {
throw RaylibException("Failed to load Texture from Cubemap");
}
}
/**
* Load texture from file into GPU memory (VRAM)
*/
void Load(const std::string& fileName) {
set(::LoadTexture(fileName.c_str()));
if (!IsValid()) {
throw RaylibException("Failed to load Texture from file: " + fileName);
}
}
/**
* Unload texture from GPU memory (VRAM)
*/
void Unload() {
// Protect against calling UnloadTexture() twice.
if (id != 0) {
::UnloadTexture(*this);
id = 0;
}
}
/**
* Update GPU texture with new data
*/
TextureUnmanaged& Update(const void* pixels) {
::UpdateTexture(*this, pixels);
return *this;
}
/**
* Update GPU texture rectangle with new data
*/
TextureUnmanaged& Update(::Rectangle rec, const void* pixels) {
UpdateTextureRec(*this, rec, pixels);
return *this;
}
/**
* Get pixel data from GPU texture and return an Image
*/
RLCPP_NODISCARD ::Image GetData() const { return ::LoadImageFromTexture(*this); }
/**
* Get pixel data from GPU texture and return an Image
*/
operator Image() { return GetData(); }
/**
* Generate GPU mipmaps for a texture
*/
TextureUnmanaged& GenMipmaps() {
::GenTextureMipmaps(this);
return *this;
}
/**
* Set texture scaling filter mode
*/
TextureUnmanaged& SetFilter(int filterMode) {
::SetTextureFilter(*this, filterMode);
return *this;
}
/**
* Set texture wrapping mode
*/
TextureUnmanaged& SetWrap(int wrapMode) {
::SetTextureWrap(*this, wrapMode);
return *this;
}
/**
* Draw a Texture2D
*
* @see ::DrawTexture()
*/
void Draw(int posX = 0, int posY = 0, ::Color tint = {255, 255, 255, 255}) const {
::DrawTexture(*this, posX, posY, tint);
}
/**
* Draw a Texture2D with position defined as Vector2
*
* @see ::DrawTextureV()
*/
void Draw(::Vector2 position, ::Color tint = {255, 255, 255, 255}) const { ::DrawTextureV(*this, position, tint); }
/**
* Draw a Texture2D with extended parameters
*
* @see ::DrawTextureEx()
*/
void Draw(::Vector2 position, float rotation, float scale = 1.0f, ::Color tint = {255, 255, 255, 255}) const {
::DrawTextureEx(*this, position, rotation, scale, tint);
}
/**
* Draw a part of a texture defined by a rectangle
*
* @see ::DrawTextureRec()
*/
void Draw(::Rectangle sourceRec, ::Vector2 position = {0, 0}, ::Color tint = {255, 255, 255, 255}) const {
::DrawTextureRec(*this, sourceRec, position, tint);
}
/**
* Draw a part of a texture defined by a rectangle with 'pro' parameters
*
* @see ::DrawTexturePro()
*/
void Draw(
::Rectangle sourceRec,
::Rectangle destRec,
::Vector2 origin = {0, 0},
float rotation = 0,
::Color tint = {255, 255, 255, 255}) const {
::DrawTexturePro(*this, sourceRec, destRec, origin, rotation, tint);
}
/**
* Draws a texture (or part of it) that stretches or shrinks nicely
*
* @see ::DrawTextureNPatch()
*/
void Draw(
::NPatchInfo nPatchInfo,
::Rectangle destRec,
::Vector2 origin = {0, 0},
float rotation = 0,
::Color tint = {255, 255, 255, 255}) const {
::DrawTextureNPatch(*this, nPatchInfo, destRec, origin, rotation, tint);
}
/**
* Draw a billboard texture
*
* @see ::DrawBillboard()
*/
void
DrawBillboard(const ::Camera& camera, ::Vector3 position, float size, ::Color tint = {255, 255, 255, 255}) const {
::DrawBillboard(camera, *this, position, size, tint);
}
/**
* Draw a billboard texture defined by source
*
* @see ::DrawBillboardRec()
*/
void DrawBillboard(
const ::Camera& camera,
::Rectangle source,
::Vector3 position,
::Vector2 size,
::Color tint = {255, 255, 255, 255}) const {
DrawBillboardRec(camera, *this, source, position, size, tint);
}
/**
* Draw a billboard texture defined by source and rotation
*
* @see ::DrawBillboardPro()
*/
void DrawBillboard(
const ::Camera& camera,
::Rectangle source,
Vector3 position,
::Vector3 up,
Vector2 size,
Vector2 origin,
float rotation = 0.0f,
::Color tint = {255, 255, 255, 255}) const {
DrawBillboardPro(camera, *this, source, position, up, size, origin, rotation, tint);
}
/**
* Set texture for a material map type (MAP_DIFFUSE, MAP_SPECULAR...)
*/
TextureUnmanaged& SetMaterial(::Material* material, int mapType = MATERIAL_MAP_NORMAL) {
::SetMaterialTexture(material, mapType, *this);
return *this;
}
TextureUnmanaged& SetMaterial(const ::Material& material, int mapType = MATERIAL_MAP_NORMAL) {
::SetMaterialTexture(const_cast<::Material*>(&material), mapType, *this);
return *this;
}
/**
* Set texture and rectangle to be used on shapes drawing.
*/
TextureUnmanaged& SetShapes(const ::Rectangle& source) {
::SetShapesTexture(*this, source);
return *this;
}
/**
* Set shader uniform value for texture (sampler2d)
*/
TextureUnmanaged& SetShaderValue(const ::Shader& shader, int locIndex) {
::SetShaderValueTexture(shader, locIndex, *this);
return *this;
}
/**
* Determines whether or not the Texture has been loaded and is ready.
*
* @return True or false depending on whether the Texture has data.
*/
RLCPP_NODISCARD bool IsValid() const { return IsTextureValid(*this); }
protected:
void set(const ::Texture& texture) {
id = texture.id;
width = texture.width;
height = texture.height;
mipmaps = texture.mipmaps;
format = texture.format;
}
};
// Create the TextureUnmanaged aliases.
using Texture2DUnmanaged = TextureUnmanaged;
using TextureCubemapUnmanaged = TextureUnmanaged;
} // namespace raylib
using RTextureUnmanaged = raylib::TextureUnmanaged;
using RTexture2DUnmanaged = raylib::Texture2DUnmanaged;
using RTextureCubemapUnmanaged = raylib::TextureCubemapUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_TEXTUREUNMANAGED_HPP_
+51
View File
@@ -0,0 +1,51 @@
#ifndef RAYLIB_CPP_INCLUDE_TOUCH_HPP_
#define RAYLIB_CPP_INCLUDE_TOUCH_HPP_
#include "./Functions.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Input-related functions: touch
*/
namespace Touch {
/**
* Get touch position X for touch point 0 (relative to screen size)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetX() {
return ::GetTouchX();
}
/**
* Get touch position Y for touch point 0 (relative to screen size)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetY() {
return ::GetTouchY();
}
/**
* Get touch position XY for a touch point index (relative to screen size)
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline Vector2 GetPosition(int index) {
return ::GetTouchPosition(index);
}
/**
* Get touch point identifier for given index
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetPointId(int index) {
return ::GetTouchPointId(index);
}
/**
* Get number of touch points
*/
RLCPP_MAYBEUNUSED RLCPPAPI inline int GetPointCount() {
return ::GetTouchPointCount();
}
} // namespace Touch
} // namespace raylib
namespace RTouch = raylib::Touch;
#endif // RAYLIB_CPP_INCLUDE_TOUCH_HPP_
+396
View File
@@ -0,0 +1,396 @@
#ifndef RAYLIB_CPP_INCLUDE_VECTOR2_HPP_
#define RAYLIB_CPP_INCLUDE_VECTOR2_HPP_
#ifndef RAYLIB_CPP_NO_MATH
#include <cmath>
#endif
#include <string>
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
#include "./raymath.hpp"
namespace raylib {
/**
* Vector2 type
*/
class Vector2 : public ::Vector2 {
public:
constexpr Vector2(const ::Vector2& vec) : ::Vector2{vec.x, vec.y} {}
constexpr Vector2(float x = 0, float y = 0) : ::Vector2{x, y} {}
GETTERSETTER(float, X, x)
GETTERSETTER(float, Y, y)
/**
* Set the Vector2 to the same as the given Vector2.
*/
Vector2& operator=(const ::Vector2& vector2) {
set(vector2);
return *this;
}
/**
* Determine whether or not the vectors are equal.
*/
constexpr bool operator==(const ::Vector2& other) const { return x == other.x && y == other.y; }
/**
* Determines if the vectors are not equal.
*/
constexpr bool operator!=(const ::Vector2& other) const { return !(*this == other); }
RLCPP_NODISCARD std::string ToString() const { return TextFormat("Vector2(%f, %f)", x, y); }
operator std::string() const { return ToString(); }
#ifndef RAYLIB_CPP_NO_MATH
/**
* Add two vectors (v1 + v2)
*/
Vector2 Add(const ::Vector2& vector2) const { return Vector2Add(*this, vector2); }
/**
* Add two vectors (v1 + v2)
*/
Vector2 operator+(const ::Vector2& vector2) const { return Vector2Add(*this, vector2); }
/**
* Add two vectors (v1 + v2)
*/
Vector2& operator+=(const ::Vector2& vector2) {
set(Vector2Add(*this, vector2));
return *this;
}
/**
* Add vector and float value
*/
Vector2 Add(float value) const {
return Vector2AddValue(*this, value);
}
/**
* Add vector and float value
*/
Vector2 operator+(float value) const {
return Vector2AddValue(*this, value);
}
/**
* Add vector and float value
*/
Vector2& operator+=(float value) {
set(Vector2AddValue(*this, value));
return *this;
}
/**
* Subtract two vectors (v1 - v2)
*/
RLCPP_NODISCARD Vector2 Subtract(const ::Vector2& vector2) const { return Vector2Subtract(*this, vector2); }
/**
* Subtract two vectors (v1 - v2)
*/
Vector2 operator-(const ::Vector2& vector2) const { return Vector2Subtract(*this, vector2); }
/**
* Subtract two vectors (v1 - v2)
*/
Vector2& operator-=(const ::Vector2& vector2) {
set(Vector2Subtract(*this, vector2));
return *this;
}
/**
* Subtract vector by float value
*/
RLCPP_NODISCARD Vector2 Subtract(float value) const {
return Vector2SubtractValue(*this, value);
}
/**
* Subtract vector by float value
*/
Vector2 operator-(float value) const {
return Vector2SubtractValue(*this, value);
}
/**
* Subtract vector by float value
*/
Vector2& operator-=(float value) {
set(Vector2SubtractValue(*this, value));
return *this;
}
/**
* Negate vector
*/
RLCPP_NODISCARD Vector2 Negate() const { return Vector2Negate(*this); }
/**
* Negate vector
*/
Vector2 operator-() const { return Vector2Negate(*this); }
/**
* Multiply vector by vector
*/
RLCPP_NODISCARD Vector2 Multiply(const ::Vector2& vector2) const { return Vector2Multiply(*this, vector2); }
/**
* Multiply vector by vector
*/
Vector2 operator*(const ::Vector2& vector2) const { return Vector2Multiply(*this, vector2); }
/**
* Multiply vector by vector
*/
Vector2& operator*=(const ::Vector2& vector2) {
set(Vector2Multiply(*this, vector2));
return *this;
}
/**
* Scale vector (multiply by value)
*/
RLCPP_NODISCARD Vector2 Scale(const float scale) const { return Vector2Scale(*this, scale); }
/**
* Scale vector (multiply by value)
*/
Vector2 operator*(const float scale) const { return Vector2Scale(*this, scale); }
/**
* Scale vector (multiply by value)
*/
Vector2& operator*=(const float scale) {
set(Vector2Scale(*this, scale));
return *this;
}
/**
* Divide vector by vector
*/
RLCPP_NODISCARD Vector2 Divide(const ::Vector2& vector2) const { return Vector2Divide(*this, vector2); }
/**
* Divide vector by vector
*/
Vector2 operator/(const ::Vector2& vector2) const { return Vector2Divide(*this, vector2); }
/**
* Divide vector by vector
*/
Vector2& operator/=(const ::Vector2& vector2) {
set(Vector2Divide(*this, vector2));
return *this;
}
/**
* Divide vector by value
*/
RLCPP_NODISCARD Vector2 Divide(const float div) const { return ::Vector2{x / div, y / div}; }
/**
* Divide vector by value
*/
Vector2 operator/(const float div) const { return Divide(div); }
/**
* Divide vector by value
*/
Vector2& operator/=(const float div) {
this->x /= div;
this->y /= div;
return *this;
}
/**
* Normalize provided vector
*/
RLCPP_NODISCARD Vector2 Normalize() const { return Vector2Normalize(*this); }
/**
* Transforms a Vector2 by a given Matrix
*/
RLCPP_NODISCARD Vector2 Transform(::Matrix mat) const { return ::Vector2Transform(*this, mat); }
/**
* Calculate linear interpolation between two vectors
*/
RLCPP_NODISCARD Vector2 Lerp(const ::Vector2& vector2, float amount) const { return Vector2Lerp(*this, vector2, amount); }
/**
* Calculate reflected vector to normal
*/
RLCPP_NODISCARD Vector2 Reflect(const ::Vector2& normal) const { return Vector2Reflect(*this, normal); }
/**
* Rotate Vector by float in radians
*/
RLCPP_NODISCARD Vector2 Rotate(float angle) const { return Vector2Rotate(*this, angle); }
/**
* Move Vector towards target
*/
RLCPP_NODISCARD Vector2 MoveTowards(const ::Vector2& target, float maxDistance) const {
return Vector2MoveTowards(*this, target, maxDistance);
}
/**
* Invert the given vector
*/
RLCPP_NODISCARD Vector2 Invert() const { return ::Vector2Invert(*this); }
/**
* Clamp the components of the vector between
*/
RLCPP_NODISCARD Vector2 Clamp(::Vector2 min, ::Vector2 max) const { return ::Vector2Clamp(*this, min, max); }
/**
* // Clamp the magnitude of the vector between two min and max values
*/
RLCPP_NODISCARD Vector2 Clamp(float min, float max) const { return ::Vector2ClampValue(*this, min, max); }
/**
* Check whether two given vectors are almost equal
*/
RLCPP_NODISCARD int Equals(::Vector2 q) const { return ::Vector2Equals(*this, q); }
/**
* Calculate vector length
*/
RLCPP_NODISCARD float Length() const { return Vector2Length(*this); }
/**
* Calculate vector square length
*/
RLCPP_NODISCARD float LengthSqr() const { return Vector2LengthSqr(*this); }
/**
* Calculate two vectors dot product
*/
RLCPP_NODISCARD float DotProduct(const ::Vector2& vector2) const { return Vector2DotProduct(*this, vector2); }
/**
* Calculate distance between two vectors
*/
RLCPP_NODISCARD float Distance(const ::Vector2& vector2) const { return Vector2Distance(*this, vector2); }
/**
* Calculate square distance between two vectors
*/
RLCPP_NODISCARD float DistanceSqr(::Vector2 v2) const { return ::Vector2DistanceSqr(*this, v2); }
/**
* Calculate angle from two vectors in X-axis
*/
RLCPP_NODISCARD float Angle(const ::Vector2& vector2) const { return Vector2Angle(*this, vector2); }
/**
* Vector with components value 0.0f
*/
static Vector2 Zero() { return Vector2Zero(); }
/**
* Vector with components value 1.0f
*/
static Vector2 One() { return Vector2One(); }
#endif
void DrawPixel(::Color color = {0, 0, 0, 255}) const { ::DrawPixelV(*this, color); }
void DrawLine(::Vector2 endPos, ::Color color = {0, 0, 0, 255}) const { ::DrawLineV(*this, endPos, color); }
void DrawLine(::Vector2 endPos, float thick, ::Color color = {0, 0, 0, 255}) const {
::DrawLineEx(*this, endPos, thick, color);
}
void DrawLineBezier(::Vector2 endPos, float thick, ::Color color = {0, 0, 0, 255}) const {
::DrawLineBezier(*this, endPos, thick, color);
}
/**
* Draw a color-filled circle (Vector version)
*/
void DrawCircle(float radius, ::Color color = {0, 0, 0, 255}) const { ::DrawCircleV(*this, radius, color); }
void DrawRectangle(::Vector2 size, ::Color color = {0, 0, 0, 255}) const { ::DrawRectangleV(*this, size, color); }
void DrawPoly(int sides, float radius, float rotation, ::Color color = {0, 0, 0, 255}) const {
::DrawPoly(*this, sides, radius, rotation, color);
}
/**
* Check collision between two circles
*/
RLCPP_NODISCARD bool CheckCollisionCircle(float radius1, ::Vector2 center2, float radius2) const {
return ::CheckCollisionCircles(*this, radius1, center2, radius2);
}
/**
* Check collision between circle and rectangle
*/
RLCPP_NODISCARD bool CheckCollisionCircle(float radius, ::Rectangle rec) const {
return ::CheckCollisionCircleRec(*this, radius, rec);
}
/**
* Check if point is inside rectangle
*/
RLCPP_NODISCARD bool CheckCollision(::Rectangle rec) const { return ::CheckCollisionPointRec(*this, rec); }
/**
* Check if point is inside circle
*/
RLCPP_NODISCARD bool CheckCollision(::Vector2 center, float radius) const {
return ::CheckCollisionPointCircle(*this, center, radius);
}
/**
* Check if point is inside a triangle
*/
RLCPP_NODISCARD bool CheckCollision(::Vector2 p1, ::Vector2 p2, ::Vector2 p3) const {
return ::CheckCollisionPointTriangle(*this, p1, p2, p3);
}
/**
* Check the collision between two lines defined by two points each, returns collision point by reference
*/
bool
CheckCollisionLines(::Vector2 endPos1, ::Vector2 startPos2, ::Vector2 endPos2, ::Vector2* collisionPoint) const {
return ::CheckCollisionLines(*this, endPos1, startPos2, endPos2, collisionPoint);
}
/**
* Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold]
*/
RLCPP_NODISCARD bool CheckCollisionPointLine(::Vector2 p1, ::Vector2 p2, int threshold = 1) const {
return ::CheckCollisionPointLine(*this, p1, p2, threshold);
}
protected:
void set(const ::Vector2& vec) {
x = vec.x;
y = vec.y;
}
};
} // namespace raylib
using RVector2 = raylib::Vector2;
#endif // RAYLIB_CPP_INCLUDE_VECTOR2_HPP_
+312
View File
@@ -0,0 +1,312 @@
#ifndef RAYLIB_CPP_INCLUDE_VECTOR3_HPP_
#define RAYLIB_CPP_INCLUDE_VECTOR3_HPP_
#ifndef RAYLIB_CPP_NO_MATH
#include <cmath>
#endif
#include <string>
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
#include "./raymath.hpp"
namespace raylib {
/**
* Vector3 type
*/
class Vector3 : public ::Vector3 {
public:
constexpr Vector3(const ::Vector3& vec) : ::Vector3{vec.x, vec.y, vec.z} {}
constexpr Vector3(float x = 0, float y = 0, float z = 0) : ::Vector3{x, y, z} {}
Vector3(::Color color) { set(ColorToHSV(color)); }
GETTERSETTER(float, X, x)
GETTERSETTER(float, Y, y)
GETTERSETTER(float, Z, z)
Vector3& operator=(const ::Vector3& vector3) {
set(vector3);
return *this;
}
constexpr bool operator==(const ::Vector3& other) const { return x == other.x && y == other.y && z == other.z; }
constexpr bool operator!=(const ::Vector3& other) const { return !(*this == other); }
RLCPP_NODISCARD std::string ToString() const { return TextFormat("Vector3(%f, %f, %f)", x, y, z); }
operator std::string() const { return ToString(); }
#ifndef RAYLIB_CPP_NO_MATH
/**
* Add two vectors
*/
RLCPP_NODISCARD Vector3 Add(const ::Vector3& vector3) const { return Vector3Add(*this, vector3); }
/**
* Add two vectors
*/
Vector3 operator+(const ::Vector3& vector3) const { return Vector3Add(*this, vector3); }
Vector3& operator+=(const ::Vector3& vector3) {
set(Vector3Add(*this, vector3));
return *this;
}
/**
* Add vector and float value
*/
RLCPP_NODISCARD Vector3 Add(float value) const {
return Vector3AddValue(*this, value);
}
/**
* Add vector and float value
*/
Vector3 operator+(float value) const {
return Vector3AddValue(*this, value);
}
Vector3& operator+=(float value) {
set(Vector3AddValue(*this, value));
return *this;
}
/**
* Subtract two vectors.
*/
RLCPP_NODISCARD Vector3 Subtract(const ::Vector3& vector3) const { return Vector3Subtract(*this, vector3); }
/**
* Subtract two vectors.
*/
Vector3 operator-(const ::Vector3& vector3) const { return Vector3Subtract(*this, vector3); }
Vector3& operator-=(const ::Vector3& vector3) {
set(Vector3Subtract(*this, vector3));
return *this;
}
/**
* Subtract vector by float value
*/
RLCPP_NODISCARD Vector3 Subtract(float value) const {
return Vector3SubtractValue(*this, value);
}
/**
* Subtract vector by float value
*/
Vector3 operator-(float value) const {
return Vector3SubtractValue(*this, value);
}
Vector3& operator-=(float value) {
set(Vector3SubtractValue(*this, value));
return *this;
}
/**
* Negate provided vector (invert direction)
*/
RLCPP_NODISCARD Vector3 Negate() const { return Vector3Negate(*this); }
/**
* Negate provided vector (invert direction)
*/
Vector3 operator-() const { return Vector3Negate(*this); }
/**
* Multiply vector by vector
*/
RLCPP_NODISCARD Vector3 Multiply(const ::Vector3& vector3) const { return Vector3Multiply(*this, vector3); }
/**
* Multiply vector by vector
*/
Vector3 operator*(const ::Vector3& vector3) const { return Vector3Multiply(*this, vector3); }
/**
* Multiply vector by vector
*/
Vector3& operator*=(const ::Vector3& vector3) {
set(Vector3Multiply(*this, vector3));
return *this;
}
/**
* Multiply vector by scalar
*/
RLCPP_NODISCARD Vector3 Scale(const float scaler) const { return Vector3Scale(*this, scaler); }
/**
* Multiply vector by scalar
*/
Vector3 operator*(const float scaler) const { return Vector3Scale(*this, scaler); }
/**
* Multiply vector by scalar
*/
Vector3& operator*=(const float scaler) {
set(Vector3Scale(*this, scaler));
return *this;
}
/**
* Divide vector by vector
*/
RLCPP_NODISCARD Vector3 Divide(const ::Vector3& vector3) const { return Vector3Divide(*this, vector3); }
/**
* Divide vector by vector
*/
Vector3 operator/(const ::Vector3& vector3) const { return Vector3Divide(*this, vector3); }
/**
* Divide vector by vector
*/
Vector3& operator/=(const ::Vector3& vector3) {
x /= vector3.x;
y /= vector3.y;
z /= vector3.z;
return *this;
}
/**
* Divide a vector by a value.
*/
RLCPP_NODISCARD Vector3 Divide(const float div) const { return ::Vector3{x / div, y / div, z / div}; }
/**
* Divide a vector by a value.
*/
Vector3 operator/(const float div) const { return Divide(div); }
/**
* Divide a vector by a value.
*/
Vector3& operator/=(const float div) {
x /= div;
y /= div;
z /= div;
return *this;
}
/**
* Calculate vector length
*/
RLCPP_NODISCARD float Length() const { return Vector3Length(*this); }
/**
* Calculate vector square length
*/
RLCPP_NODISCARD float LengthSqr() const { return Vector3LengthSqr(*this); }
RLCPP_NODISCARD Vector3 Normalize() const { return Vector3Normalize(*this); }
RLCPP_NODISCARD float DotProduct(const ::Vector3& vector3) const { return Vector3DotProduct(*this, vector3); }
RLCPP_NODISCARD float Distance(const ::Vector3& vector3) const { return Vector3Distance(*this, vector3); }
RLCPP_NODISCARD Vector3 Lerp(const ::Vector3& vector3, const float amount) const { return Vector3Lerp(*this, vector3, amount); }
RLCPP_NODISCARD Vector3 CrossProduct(const ::Vector3& vector3) const { return Vector3CrossProduct(*this, vector3); }
RLCPP_NODISCARD Vector3 Perpendicular() const { return Vector3Perpendicular(*this); }
RLCPP_NODISCARD Vector3 Project(const ::Vector3& vector3) const { return Vector3Project(*this, vector3); }
RLCPP_NODISCARD Vector3 Reject(const ::Vector3& vector3) const { return Vector3Reject(*this, vector3); }
void OrthoNormalize(::Vector3* vector3) { Vector3OrthoNormalize(this, vector3); }
RLCPP_NODISCARD Vector3 Transform(const ::Matrix& matrix) const { return Vector3Transform(*this, matrix); }
RLCPP_NODISCARD Vector3 RotateByQuaternion(const ::Quaternion& quaternion) const {
return Vector3RotateByQuaternion(*this, quaternion);
}
RLCPP_NODISCARD Vector3 Reflect(const ::Vector3& normal) const { return Vector3Reflect(*this, normal); }
RLCPP_NODISCARD Vector3 Min(const ::Vector3& vector3) const { return Vector3Min(*this, vector3); }
RLCPP_NODISCARD Vector3 Max(const ::Vector3& vector3) const { return Vector3Max(*this, vector3); }
RLCPP_NODISCARD Vector3 Barycenter(const ::Vector3& a, const ::Vector3& b, const ::Vector3& c) const {
return Vector3Barycenter(*this, a, b, c);
}
static Vector3 Zero() { return Vector3Zero(); }
static Vector3 One() { return Vector3One(); }
#endif
void DrawLine3D(const ::Vector3& endPos, ::Color color) const { ::DrawLine3D(*this, endPos, color); }
void DrawPoint3D(::Color color) const { ::DrawPoint3D(*this, color); }
void DrawCircle3D(float radius, const ::Vector3& rotationAxis, float rotationAngle, Color color) const {
::DrawCircle3D(*this, radius, rotationAxis, rotationAngle, color);
}
void DrawCube(float width, float height, float length, ::Color color) const {
::DrawCube(*this, width, height, length, color);
}
void DrawCube(const ::Vector3& size, ::Color color) const { ::DrawCubeV(*this, size, color); }
void DrawCubeWires(float width, float height, float length, ::Color color) const {
::DrawCubeWires(*this, width, height, length, color);
}
void DrawCubeWires(const ::Vector3& size, ::Color color) const { ::DrawCubeWiresV(*this, size, color); }
void DrawSphere(float radius, ::Color color) const { ::DrawSphere(*this, radius, color); }
void DrawSphere(float radius, int rings, int slices, ::Color color) const {
::DrawSphereEx(*this, radius, rings, slices, color);
}
void DrawSphereWires(float radius, int rings, int slices, ::Color color) const {
::DrawSphereWires(*this, radius, rings, slices, color);
}
void DrawCylinder(float radiusTop, float radiusBottom, float height, int slices, ::Color color) const {
::DrawCylinder(*this, radiusTop, radiusBottom, height, slices, color);
}
void DrawCylinderWires(float radiusTop, float radiusBottom, float height, int slices, ::Color color) const {
::DrawCylinderWires(*this, radiusTop, radiusBottom, height, slices, color);
}
void DrawPlane(const ::Vector2& size, ::Color color) const { ::DrawPlane(*this, size, color); }
/**
* Detect collision between two spheres
*/
RLCPP_NODISCARD bool CheckCollision(float radius1, const ::Vector3& center2, float radius2) const {
return CheckCollisionSpheres(*this, radius1, center2, radius2);
}
protected:
void set(const ::Vector3& vec) {
x = vec.x;
y = vec.y;
z = vec.z;
}
};
} // namespace raylib
using RVector3 = raylib::Vector3;
#endif // RAYLIB_CPP_INCLUDE_VECTOR3_HPP_
+308
View File
@@ -0,0 +1,308 @@
#ifndef RAYLIB_CPP_INCLUDE_VECTOR4_HPP_
#define RAYLIB_CPP_INCLUDE_VECTOR4_HPP_
#ifndef RAYLIB_CPP_NO_MATH
#include <cmath>
#include <utility>
#endif
#include <string>
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
#include "./raymath.hpp"
namespace raylib {
class Quaternion : public ::Quaternion {};
/**
* Vector4 type
*/
class Vector4 : public ::Vector4 {
public:
constexpr Vector4(const ::Vector4& vec) : ::Vector4{vec.x, vec.y, vec.z, vec.w} {}
explicit constexpr Vector4(const raylib::Quaternion quat) : ::Vector4{quat.x, quat.y, quat.z, quat.w} {}
explicit constexpr Vector4(const float x = 0, const float y = 0, const float z = 0, const float w = 0) : ::Vector4{x, y, z, w} {}
explicit constexpr Vector4(const ::Rectangle rectangle) : ::Vector4{rectangle.x, rectangle.y, rectangle.width, rectangle.height} {}
explicit Vector4(const ::Color color) { set(ColorNormalize(color)); }
GETTERSETTER(float, X, x)
GETTERSETTER(float, Y, y)
GETTERSETTER(float, Z, z)
GETTERSETTER(float, W, w)
Vector4& operator=(const ::Vector4& vector4) {
set(vector4);
return *this;
}
/*
* An exact value by value equality comparison.
* Due to floating point inaccuracies consider using Equals instead.
*/
constexpr bool operator==(const ::Vector4& other) const {
return x == other.x && y == other.y && z == other.z && w == other.w;
}
/*
* An exact value by value inequality comparison.
* Due to floating point inaccuracies consider using Equals instead.
*/
constexpr bool operator!=(const ::Vector4& other) const { return !(*this == other); }
RLCPP_NODISCARD constexpr ::Rectangle ToRectangle() const { return {x, y, z, w}; }
constexpr operator ::Rectangle() const { return {x, y, z, w}; }
RLCPP_NODISCARD std::string ToString() const { return ::TextFormat("Vector4(%f, %f, %f, %f)", x, y, z, w); }
operator std::string() const { return ToString(); }
#ifndef RAYLIB_CPP_NO_MATH
static Vector4 Zero() { return ::Vector4Zero(); }
static Vector4 One() { return ::Vector4One(); }
/**
* Add two vectors
*/
RLCPP_NODISCARD Vector4 Add(const ::Vector4& vector4) const { return ::Vector4Add(*this, vector4); }
/**
* Add two vectors
*/
Vector4 operator+(const ::Vector4& vector4) const { return ::Vector4Add(*this, vector4); }
Vector4& operator+=(const ::Vector4& vector4) {
set(::Vector4Add(*this, vector4));
return *this;
}
/**
* Add vector and float value
*/
RLCPP_NODISCARD Vector4 Add(const float value) const {
return ::Vector4AddValue(*this, value);
}
/**
* Add vector and float value
*/
Vector4 operator+(const float value) const {
return ::Vector4AddValue(*this, value);
}
/**
* Add vector and float value
*/
Vector4& operator+=(const float value) {
set(::Vector4AddValue(*this, value));
return *this;
}
/**
* Add vector and float value
*/
friend Vector4 operator+(const float lhs, const Vector4& rhs) { return rhs + lhs; }
/**
* Subtract two vectors.
*/
RLCPP_NODISCARD Vector4 Subtract(const ::Vector4& vector4) const { return ::Vector4Subtract(*this, vector4); }
/**
* Subtract two vectors.
*/
Vector4 operator-(const ::Vector4& vector4) const { return ::Vector4Subtract(*this, vector4); }
Vector4& operator-=(const ::Vector4& vector4) {
set(::Vector4Subtract(*this, vector4));
return *this;
}
/**
* Subtract vector by float value
*/
RLCPP_NODISCARD Vector4 Subtract(const float value) const {
return ::Vector4SubtractValue(*this, value);
}
/**
* Subtract vector by float value
*/
Vector4 operator-(const float value) const {
return ::Vector4SubtractValue(*this, value);
}
/**
* Subtract vector by float value
*/
Vector4& operator-=(const float value) {
set(::Vector4SubtractValue(*this, value));
return *this;
}
/**
* Subtract vector by float value
*/
friend Vector4 operator-(const float lhs, const Vector4& rhs) { return rhs - lhs; }
/**
* Negate provided vector
*/
RLCPP_NODISCARD Vector4 Negate() const { return ::Vector4Negate(*this); }
/**
* Negate provided vector
*/
Vector4 operator-() const { return ::Vector4Negate(*this); }
/**
* Multiply vector by vector
*/
RLCPP_NODISCARD Vector4 Multiply(const ::Vector4& other) const { return ::Vector4Multiply(*this, other); }
/**
* Multiply vector by vector
*/
Vector4 operator*(const ::Vector4& other) const { return ::Vector4Multiply(*this, other); }
/**
* Multiply vector by vector
*/
Vector4& operator*=(const ::Vector4& other) {
set(::Vector4Multiply(*this, other));
return *this;
}
/**
* Scale vector components by value (multiply)
*/
RLCPP_NODISCARD Vector4 Scale(const float scale) const { return ::Vector4Scale(*this, scale); }
/**
* Scale vector components by value (multiply)
*/
Vector4 operator*(const float scale) const { return ::Vector4Scale(*this, scale); }
/**
* Scale vector components by value (multiply)
*/
Vector4& operator*=(const float scale) {
set(::Vector4Scale(*this, scale));
return *this;
}
/**
* Scale vector components by value (multiply)
*/
friend Vector4 operator*(const float lhs, const Vector4& rhs) { return rhs * lhs; }
/**
* Divide vector by vector
*/
RLCPP_NODISCARD Vector4 Divide(const ::Vector4& vector4) const { return ::Vector4Divide(*this, vector4); }
/**
* Divide vector by vector
*/
Vector4 operator/(const ::Vector4& vector4) const { return ::Vector4Divide(*this, vector4); }
/**
* Divide vector by vector
*/
Vector4& operator/=(const ::Vector4& vector4) {
set(::Vector4Divide(*this, vector4));
return *this;
}
/**
* Divide vector components by value
*/
RLCPP_NODISCARD constexpr Vector4 Divide(const float div) const { return ::Vector4{x / div, y / div, z / div, w / div}; }
/**
* Divide vector components by value
*/
Vector4 operator/(const float div) const { return Divide(div); }
/**
* Divide vector components by value
*/
Vector4& operator/=(const float div) {
x /= div;
y /= div;
z /= div;
w /= div;
return *this;
}
/**
* Divide vector components by value
*/
constexpr friend Vector4 operator/(const float lhs, const Vector4& rhs) {
return Vector4{
lhs / rhs.x,
lhs / rhs.y,
lhs / rhs.z,
lhs / rhs.w
};
}
RLCPP_NODISCARD float Length() const { return ::Vector4Length(*this); }
RLCPP_NODISCARD float LengthSqr() const { return ::Vector4LengthSqr(*this); }
RLCPP_NODISCARD float DotProduct(const ::Vector4& v2) const { return ::Vector4DotProduct(*this, v2); }
RLCPP_NODISCARD float Distance(const ::Vector4& v2) const { return ::Vector4Distance(*this, v2); }
RLCPP_NODISCARD float DistanceSqr(const ::Vector4& v2) const { return ::Vector4DistanceSqr(*this, v2); }
RLCPP_NODISCARD Vector4 Normalize() const { return ::Vector4Normalize(*this); }
RLCPP_NODISCARD Vector4 Min(const ::Vector4& v2) const { return ::Vector4Min(*this, v2); }
RLCPP_NODISCARD Vector4 Max(const ::Vector4& v2) const { return ::Vector4Max(*this, v2); }
RLCPP_NODISCARD Vector4 Lerp(const ::Vector4& v2, const float amount) const { return ::Vector4Lerp(*this, v2, amount); }
RLCPP_NODISCARD Vector4 MoveTowards(const ::Vector4& target, const float maxDistance) const { return ::Vector4MoveTowards(*this, target, maxDistance); }
RLCPP_NODISCARD Vector4 Invert() const { return ::Vector4Invert(*this); }
/*
* Check whether two given vectors are almost equal
*/
RLCPP_NODISCARD bool Equals(const ::Vector4& other) const {
return static_cast<bool>(::Vector4Equals(*this, other));
}
#endif
RLCPP_NODISCARD Color ColorFromNormalized() const { return ::ColorFromNormalized(*this); }
operator Color() const { return ColorFromNormalized(); }
protected:
void set(const ::Vector4& vec4) {
x = vec4.x;
y = vec4.y;
z = vec4.z;
w = vec4.w;
}
};
} // namespace raylib
using RVector4 = raylib::Vector4;
#endif // RAYLIB_CPP_INCLUDE_VECTOR4_HPP_
+74
View File
@@ -0,0 +1,74 @@
#ifndef RAYLIB_CPP_INCLUDE_VRSTEREOCONFIG_HPP_
#define RAYLIB_CPP_INCLUDE_VRSTEREOCONFIG_HPP_
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* VR stereo config functions for VR simulator
*/
class VrStereoConfig : public ::VrStereoConfig {
public:
VrStereoConfig(const ::VrDeviceInfo& info) { Load(info); }
VrStereoConfig(const VrStereoConfig&) = delete;
VrStereoConfig& operator=(const VrStereoConfig&) = delete;
VrStereoConfig(VrStereoConfig&&) = default;
VrStereoConfig& operator=(VrStereoConfig&&) = default;
/**
* Load VR stereo config for VR simulator device parameters
*/
void Load(const ::VrDeviceInfo& info) { set(LoadVrStereoConfig(info)); }
/**
* Unload VR stereo config
*/
~VrStereoConfig() { Unload(); }
/**
* Begin stereo rendering
*/
VrStereoConfig& BeginMode() {
::BeginVrStereoMode(*this);
return *this;
}
/**
* End stereo rendering
*/
VrStereoConfig& EndMode() {
::EndVrStereoMode();
return *this;
}
/**
* Unload VR stereo config
*/
void Unload() { ::UnloadVrStereoConfig(*this); }
protected:
void set(const ::VrStereoConfig& config) {
projection[0] = config.projection[0];
projection[1] = config.projection[1];
viewOffset[0] = config.viewOffset[0];
viewOffset[1] = config.viewOffset[1];
leftLensCenter[0] = config.leftLensCenter[0];
leftLensCenter[1] = config.leftLensCenter[1];
rightLensCenter[0] = config.rightLensCenter[0];
rightLensCenter[1] = config.rightLensCenter[1];
leftScreenCenter[0] = config.leftScreenCenter[0];
leftScreenCenter[1] = config.leftScreenCenter[1];
rightScreenCenter[0] = config.rightScreenCenter[0];
rightScreenCenter[1] = config.rightScreenCenter[1];
scale[0] = config.scale[0];
scale[1] = config.scale[1];
scaleIn[0] = config.scaleIn[0];
scaleIn[1] = config.scaleIn[1];
}
};
} // namespace raylib
using RVrStereoConfig = raylib::VrStereoConfig;
#endif // RAYLIB_CPP_INCLUDE_VRSTEREOCONFIG_HPP_
+74
View File
@@ -0,0 +1,74 @@
#ifndef RAYLIB_CPP_INCLUDE_WAVE_HPP_
#define RAYLIB_CPP_INCLUDE_WAVE_HPP_
#include "./WaveUnmanaged.hpp"
namespace raylib {
/**
* Wave type, defines audio wave data.
*
* The wave will be unloaded on object destruction. Use raylib::WaveUnmanaged if you're looking to not unload.
* Unlike other resource types, Wave supports value-copy semantics via WaveCopy().
*
* @see raylib::WaveUnmanaged
*/
class Wave : public WaveUnmanaged {
public:
using WaveUnmanaged::WaveUnmanaged;
Wave(const Wave& other) : WaveUnmanaged(other.Copy()) {}
Wave(Wave&& other) noexcept : WaveUnmanaged(other) {
other.frameCount = 0;
other.sampleRate = 0;
other.sampleSize = 0;
other.channels = 0;
other.data = nullptr;
}
Wave& operator=(const ::Wave& wave) {
Unload();
set(wave);
return *this;
}
Wave& operator=(const Wave& other) {
if (this == &other) {
return *this;
}
Unload();
set(other.Copy());
return *this;
}
Wave& operator=(Wave&& other) noexcept {
if (this == &other) {
return *this;
}
Unload();
set(other);
other.frameCount = 0;
other.sampleRate = 0;
other.sampleSize = 0;
other.channels = 0;
other.data = nullptr;
return *this;
}
~Wave() { Unload(); }
void Load(const std::string& fileName) {
Unload();
WaveUnmanaged::Load(fileName);
}
void Load(const std::string& fileType, const unsigned char* fileData, int dataSize) {
Unload();
WaveUnmanaged::Load(fileType, fileData, dataSize);
}
};
} // namespace raylib
using RWave = raylib::Wave;
#endif // RAYLIB_CPP_INCLUDE_WAVE_HPP_
+178
View File
@@ -0,0 +1,178 @@
#ifndef RAYLIB_CPP_INCLUDE_WAVEUNMANAGED_HPP_
#define RAYLIB_CPP_INCLUDE_WAVEUNMANAGED_HPP_
#include <string>
#include "./RaylibException.hpp"
#include "./raylib-cpp-utils.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* A Wave that is not managed by C++ RAII.
*
* Make sure to Unload() this if needed, otherwise use raylib::Wave.
*
* @see raylib::Wave
*/
class WaveUnmanaged : public ::Wave {
public:
/**
* Creates a WaveUnmanaged from an existing Wave struct.
*/
WaveUnmanaged(const ::Wave& wave) : ::Wave(wave) {}
/**
* Creates a WaveUnmanaged from its components.
*/
WaveUnmanaged(
unsigned int frameCount = 0,
unsigned int sampleRate = 0,
unsigned int sampleSize = 0,
unsigned int channels = 0,
void* data = nullptr)
: ::Wave{frameCount, sampleRate, sampleSize, channels, data} {}
/**
* Load wave data from file.
*
* @throws raylib::RaylibException Throws if the Wave failed to load.
*/
WaveUnmanaged(const std::string& fileName) { Load(fileName); }
/**
* Load wave from memory buffer; fileType refers to extension: i.e. "wav".
*
* @throws raylib::RaylibException Throws if the Wave failed to load.
*/
WaveUnmanaged(const std::string& fileType, const unsigned char* fileData, int dataSize) {
Load(fileType, fileData, dataSize);
}
GETTER(unsigned int, FrameCount, frameCount)
GETTER(unsigned int, SampleRate, sampleRate)
GETTER(unsigned int, SampleSize, sampleSize)
GETTER(unsigned int, Channels, channels)
GETTER(void*, Data, data)
WaveUnmanaged& operator=(const ::Wave& wave) {
set(wave);
return *this;
}
[[nodiscard]] std::string ToString() const {
return TextFormat(
"Wave(frameCount=%u, sampleRate=%u, sampleSize=%u, channels=%u, data=%p)",
frameCount, sampleRate, sampleSize, channels, data
);
}
operator std::string() const { return ToString(); }
/**
* Load wave data from file.
*
* @throws raylib::RaylibException Throws if the Wave failed to load.
*/
void Load(const std::string& fileName) {
set(::LoadWave(fileName.c_str()));
if (!IsValid()) {
throw RaylibException("Failed to load Wave from file: " + fileName);
}
}
/**
* Load wave from memory buffer; fileType refers to extension: i.e. "wav".
*
* @throws raylib::RaylibException Throws if the Wave failed to load.
*/
void Load(const std::string& fileType, const unsigned char* fileData, int dataSize) {
set(::LoadWaveFromMemory(fileType.c_str(), fileData, dataSize));
if (!IsValid()) {
throw RaylibException("Failed to load Wave from file data of type: " + fileType);
}
}
/**
* Unload wave data.
*/
void Unload() {
// Protect against calling UnloadWave() twice.
if (data != nullptr) {
::UnloadWave(*this);
data = nullptr;
}
}
/**
* Copy a wave to a new wave.
*/
RLCPP_NODISCARD ::Wave Copy() const { return ::WaveCopy(*this); }
/**
* Crop a wave to defined samples range.
*/
WaveUnmanaged& Crop(int initSample, int finalSample) {
::WaveCrop(this, initSample, finalSample);
return *this;
}
/**
* Convert wave data to desired format.
*/
WaveUnmanaged& Format(int sampleRate, int sampleSize, int channels = 2) {
::WaveFormat(this, sampleRate, sampleSize, channels);
return *this;
}
/**
* Load samples data from wave as a floats array.
*/
float* LoadSamples() { return ::LoadWaveSamples(*this); }
/**
* Unload samples data loaded with LoadWaveSamples().
*/
static void UnloadSamples(float* samples) { ::UnloadWaveSamples(samples); }
/**
* Export wave data to file, returns true on success.
*/
bool Export(const std::string& fileName) { return ::ExportWave(*this, fileName.c_str()); }
/**
* Export wave sample data to code (.h), returns true on success.
*/
bool ExportAsCode(const std::string& fileName) { return ::ExportWaveAsCode(*this, fileName.c_str()); }
/**
* Load sound from wave data.
*/
::Sound LoadSound() { return ::LoadSoundFromWave(*this); }
/**
* Load sound from wave data.
*/
operator ::Sound() { return LoadSound(); }
/**
* Retrieve whether or not the Wave data has been loaded.
*
* @return True or false depending on whether the wave data has been loaded.
*/
RLCPP_NODISCARD bool IsValid() const { return ::IsWaveValid(*this); }
protected:
void set(const ::Wave& wave) {
frameCount = wave.frameCount;
sampleRate = wave.sampleRate;
sampleSize = wave.sampleSize;
channels = wave.channels;
data = wave.data;
}
};
} // namespace raylib
using RWaveUnmanaged = raylib::WaveUnmanaged;
#endif // RAYLIB_CPP_INCLUDE_WAVEUNMANAGED_HPP_
+474
View File
@@ -0,0 +1,474 @@
#ifndef RAYLIB_CPP_INCLUDE_WINDOW_HPP_
#define RAYLIB_CPP_INCLUDE_WINDOW_HPP_
#include <string>
#include "./RaylibException.hpp"
#include "./Vector2.hpp"
#include "./raylib.hpp"
namespace raylib {
/**
* Window and Graphics Device Functions.
*/
class Window {
public:
/**
* Build a Window object, but defer the initialization. Ensure you call Init() manually.
*
* @see Init()
*/
Window() = default;
/**
* Initialize window and OpenGL context.
*
* @param width The width of the window.
* @param height The height of the window.
* @param title The desired title of the window.
* @param flags The ConfigFlags to set prior to initializing the window. See SetConfigFlags for more details.
* @param logLevel The the current threshold (minimum) log level
*
* @see ::SetConfigFlags()
* @see ConfigFlags
*
* @throws raylib::RaylibException Thrown if the window failed to initiate.
*/
Window(int width, int height, const std::string& title = "raylib", unsigned int flags = 0, TraceLogLevel logLevel = LOG_ALL) {
Init(width, height, title, flags, logLevel);
}
Window(const Window&) = delete;
Window& operator=(const Window&) = delete;
/**
* Close window and unload OpenGL context
*/
~Window() { Close(); }
[[nodiscard]] std::string ToString() const { return TextFormat("Window(%dx%d)", GetWidth(), GetHeight()); }
operator std::string() const { return ToString(); }
/**
* Initializes the window.
*
* @param width The width of the window.
* @param height The height of the window.
* @param title The desired title of the window.
* @param flags The ConfigFlags to set prior to initializing the window. See SetConfigFlags for more details.
*
* @see ::SetConfigFlags()
* @see ConfigFlags
*
* @throws raylib::RaylibException Thrown if the window failed to initiate.
*/
static void Init(int width = 800, int height = 450, const std::string& title = "raylib", unsigned int flags = 0, TraceLogLevel logLevel = LOG_ALL) {
if (flags != 0) {
::SetConfigFlags(flags);
}
::SetTraceLogLevel(logLevel);
::InitWindow(width, height, title.c_str());
if (!::IsWindowReady()) {
throw RaylibException("Failed to create Window");
}
}
/**
* Check if KEY_ESCAPE pressed or Close icon pressed
*/
static bool ShouldClose() { return ::WindowShouldClose(); }
/**
* Set a custom key to exit program (default is ESC)
*/
static void SetExitKey(int key) { ::SetExitKey(key); }
/**
* Close window and unload OpenGL context
*/
static void Close() {
if (::IsWindowReady()) {
::CloseWindow();
}
}
/**
* Check if cursor is on the current screen
*/
static bool IsCursorOnScreen() { return ::IsCursorOnScreen(); }
/**
* Check if cursor is not visible
*/
static bool IsCursorHidden() { return ::IsCursorHidden(); }
/**
* Hides cursor
*/
static void HideCursor() { ::HideCursor(); }
/**
* Shows cursor
*/
static void ShowCursor() { ::ShowCursor(); }
/**
* Check if window is currently fullscreen
*/
static bool IsFullscreen() { return ::IsWindowFullscreen(); }
/**
* Check if window is currently hidden
*/
static bool IsHidden() { return ::IsWindowHidden(); }
/**
* Check if window is currently minimized
*/
static bool IsMinimized() { return ::IsWindowMinimized(); }
/**
* Check if window is currently minimized
*/
static bool IsMaximized() { return ::IsWindowMaximized(); }
/**
* Check if window is currently focused
*/
static bool IsFocused() { return ::IsWindowFocused(); }
/**
* Check if window has been resized last frame
*/
static bool IsResized() { return ::IsWindowResized(); }
/**
* Check if one specific window flag is enabled
*/
static bool IsState(unsigned int flag) { return ::IsWindowState(flag); }
/**
* Set window configuration state using flags
*/
Window& SetState(unsigned int flag) {
::SetWindowState(flag);
return *this;
}
/**
* Clear window configuration state flags
*/
Window& ClearState(unsigned int flag) {
::ClearWindowState(flag);
return *this;
}
/**
* Clear window with given color.
*/
Window& ClearBackground(const ::Color& color = BLACK) {
::ClearBackground(color);
return *this;
}
/**
* Toggle window state: fullscreen/windowed
*/
Window& ToggleFullscreen() {
::ToggleFullscreen();
return *this;
}
/**
* Set whether or not the application should be fullscreen.
*/
Window& SetFullscreen(bool fullscreen) {
if (fullscreen) {
if (!IsFullscreen()) {
ToggleFullscreen();
}
}
else {
if (IsFullscreen()) {
ToggleFullscreen();
}
}
return *this;
}
/**
* Toggle window state: borderless/windowed
*/
Window& ToggleBorderless() {
::ToggleBorderlessWindowed();
return *this;
}
/**
* Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
*/
Window& Maximize() {
::MaximizeWindow();
return *this;
}
/**
* Set window state: minimized, if resizable (only PLATFORM_DESKTOP)
*/
Window& Minimize() {
::MinimizeWindow();
return *this;
}
/**
* Set window state: not minimized/maximized (only PLATFORM_DESKTOP)
*/
Window& Restore() {
::RestoreWindow();
return *this;
}
/**
* Set icon for window
*/
Window& SetIcon(const ::Image& image) {
::SetWindowIcon(image);
return *this;
}
/**
* Set icon for window (multiple images, RGBA 32bit, only PLATFORM_DESKTOP)
*/
Window& SetIcons(Image* images, int count) {
::SetWindowIcons(images, count);
return *this;
}
/**
* Set title for window
*/
Window& SetTitle(const std::string& title) {
::SetWindowTitle(title.c_str());
return *this;
}
/**
* Set window position on screen
*/
Window& SetPosition(int x, int y) {
::SetWindowPosition(x, y);
return *this;
}
/**
* Set window position on screen
*/
Window& SetPosition(const ::Vector2& position) {
return SetPosition(static_cast<int>(position.x), static_cast<int>(position.y));
}
/**
* Set monitor for the current window
*/
Window& SetMonitor(int monitor) {
::SetWindowMonitor(monitor);
return *this;
}
/**
* Set window minimum dimensions
*/
Window& SetMinSize(int width, int height) {
::SetWindowMinSize(width, height);
return *this;
}
/**
* Set window minimum dimensions
*/
Window& SetMinSize(const ::Vector2& size) {
::SetWindowMinSize(static_cast<int>(size.x), static_cast<int>(size.y));
return *this;
}
/**
* Set window dimensions
*/
Window& SetSize(int width, int height) {
::SetWindowSize(width, height);
return *this;
}
/**
* Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
*/
Window& SetOpacity(float opacity) {
::SetWindowOpacity(opacity);
return *this;
}
/**
* Set window focused (only PLATFORM_DESKTOP)
*/
Window& SetFocused() {
::SetWindowFocused();
return *this;
}
/**
* Set window dimensions
*/
Window& SetSize(const ::Vector2& size) { return SetSize(static_cast<int>(size.x), static_cast<int>(size.y)); }
/**
* Get the screen's width and height.
*/
static Vector2 GetSize() { return {static_cast<float>(GetWidth()), static_cast<float>(GetHeight())}; }
/**
* Get native window handle
*/
static void* GetHandle() { return ::GetWindowHandle(); }
/**
* Setup canvas (framebuffer) to start drawing
*/
Window& BeginDrawing() {
::BeginDrawing();
return *this;
}
/**
* End canvas drawing and swap buffers (double buffering)
*/
Window& EndDrawing() {
::EndDrawing();
return *this;
}
/**
* Get current screen width
*/
static int GetWidth() { return ::GetScreenWidth(); }
/**
* Get current screen height
*/
static int GetHeight() { return ::GetScreenHeight(); }
/**
* Get current render width (it considers HiDPI)
*/
static int GetRenderWidth() { return ::GetRenderWidth(); }
/**
* Get current render height (it considers HiDPI)
*/
static int GetRenderHeight() { return ::GetRenderHeight(); }
/**
* Get window position XY on monitor
*/
static Vector2 GetPosition() { return ::GetWindowPosition(); }
/*
* Get current window monitor
*/
static int GetMonitor() { return ::GetCurrentMonitor(); }
/**
* Get window scale DPI factor
*/
static Vector2 GetScaleDPI() { return ::GetWindowScaleDPI(); }
/**
* Set clipboard text content
*/
static void SetClipboardText(const std::string& text) { ::SetClipboardText(text.c_str()); }
/**
* Get clipboard text content
*/
static std::string GetClipboardText() { return ::GetClipboardText(); }
/**
* Set target FPS (maximum)
*/
Window& SetTargetFPS(int fps) {
::SetTargetFPS(fps);
return *this;
}
/**
* Returns current FPS
*/
static int GetFPS() { return ::GetFPS(); }
/**
* Draw current FPS
*/
static void DrawFPS(int posX = 10, int posY = 10) { ::DrawFPS(posX, posY); }
/**
* Returns time in seconds for last frame drawn
*/
static float GetFrameTime() { return ::GetFrameTime(); }
/**
* Returns elapsed time in seconds since InitWindow()
*/
static double GetTime() { return ::GetTime(); }
/**
* Check if window has been initialized successfully
*/
static bool IsReady() { return ::IsWindowReady(); }
/**
* Sets the configuration flags for raylib.
*
* @param flags The ConfigFlags to apply to the configuration.
*
* @see ::SetConfigFlags
*/
static void SetConfigFlags(unsigned int flags) { ::SetConfigFlags(flags); }
/**
* Alternates between calling `BeginDrawing()` and `EndDrawing()`.
*
* @code
* while (window.Drawing()) {
* DrawRectangle();
* }
* @endcode
*
* @return True if we're within the `BeginDrawing()` scope.
*/
bool Drawing() {
if (m_drawing) {
EndDrawing();
m_drawing = false;
}
else {
BeginDrawing();
m_drawing = true;
}
return m_drawing;
}
protected:
/**
* Handles the internal drawing state for calling either `BeginDrawing()` or `EndDrawing()` from the `Drawing()` function.
*
* @see Drawing()
*/
bool m_drawing = false;
};
} // namespace raylib
using RWindow = raylib::Window;
#endif // RAYLIB_CPP_INCLUDE_WINDOW_HPP_
+38
View File
@@ -0,0 +1,38 @@
/**
* Utility for raylib-cpp.
*/
#ifndef RAYLIB_CPP_INCLUDE_RAYLIB_CPP_UTILS_HPP_
#define RAYLIB_CPP_INCLUDE_RAYLIB_CPP_UTILS_HPP_
#ifndef GETTER
/**
* A utility to build a get method on top of a property.
*
* @param type The type of the property.
* @param method The human-readable name for the method.
* @param name The machine-readable name of the property.
*/
#define GETTER(type, method, name) \
/** Retrieves the name value for the object. @return The name value of the object. */ \
type Get##method() const { \
return name; \
}
#endif
#ifndef GETTERSETTER
/**
* A utility to build get and set methods on top of a property.
*
* @param type The type of the property.
* @param method The human-readable name for the method.
* @param name The machine-readable name of the property.
*/
#define GETTERSETTER(type, method, name) \
GETTER(type, method, name) \
/** Sets the name value for the object. @param value The value of which to set name to. */ \
void Set##method(type value) { \
name = value; \
}
#endif
#endif // RAYLIB_CPP_INCLUDE_RAYLIB_CPP_UTILS_HPP_
+88
View File
@@ -0,0 +1,88 @@
/**
* [raylib-cpp](https://github.com/RobLoach/raylib-cpp) is a C++ wrapper library for raylib, a simple and easy-to-use library to enjoy videogames programming. This C++ header provides object-oriented wrappers around raylib's struct interfaces.
*
* @see raylib namespace for a list of all available classes.
* @mainpage raylib-cpp
* @include core_basic_window.cpp
* @author Rob Loach (RobLoach)
* @copyright zlib/libpng
*
* raylib-cpp is licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software:
*
* Copyright 2020 Rob Loach (RobLoach)
*
* 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 RAYLIB_CPP_INCLUDE_RAYLIB_CPP_HPP_
#define RAYLIB_CPP_INCLUDE_RAYLIB_CPP_HPP_
#include "./AudioDevice.hpp"
#include "./AudioStream.hpp"
#include "./AudioStreamUnmanaged.hpp"
#include "./AutomationEventList.hpp"
#include "./BoundingBox.hpp"
#include "./Camera2D.hpp"
#include "./Camera3D.hpp"
#include "./Color.hpp"
#include "./FileData.hpp"
#include "./FileText.hpp"
#include "./Font.hpp"
#include "./FontUnmanaged.hpp"
#include "./Functions.hpp"
#include "./Gamepad.hpp"
#include "./Image.hpp"
#include "./Keyboard.hpp"
#include "./Material.hpp"
#include "./MaterialUnmanaged.hpp"
#include "./Matrix.hpp"
#include "./Mesh.hpp"
#include "./Model.hpp"
#include "./ModelUnmanaged.hpp"
#include "./ModelAnimation.hpp"
#include "./Mouse.hpp"
#include "./Music.hpp"
#include "./MusicUnmanaged.hpp"
#include "./Ray.hpp"
#include "./RayCollision.hpp"
#include "./RaylibException.hpp"
#include "./Rectangle.hpp"
#include "./RenderTexture.hpp"
#include "./RenderTextureUnmanaged.hpp"
#include "./Shader.hpp"
#include "./Sound.hpp"
#include "./SoundUnmanaged.hpp"
#include "./Text.hpp"
#include "./Texture.hpp"
#include "./TextureUnmanaged.hpp"
#include "./Touch.hpp"
#include "./Vector2.hpp"
#include "./Vector3.hpp"
#include "./Vector4.hpp"
#include "./VrStereoConfig.hpp"
#include "./Wave.hpp"
#include "./WaveUnmanaged.hpp"
#include "./Window.hpp"
/**
* All raylib-cpp classes and functions appear in the raylib namespace.
*/
namespace raylib {
// Nothing.
} // namespace raylib
#endif // RAYLIB_CPP_INCLUDE_RAYLIB_CPP_HPP_
+61
View File
@@ -0,0 +1,61 @@
/**
* C++ header to wrap raylib.h.
*/
#ifndef RAYLIB_CPP_INCLUDE_RAYLIB_HPP_
#define RAYLIB_CPP_INCLUDE_RAYLIB_HPP_
#ifdef __cplusplus
extern "C" {
#endif
#ifndef RAYLIB_H_FILE
#define RAYLIB_H_FILE "raylib.h"
#endif
#include RAYLIB_H_FILE // NOLINT
#if !defined(RAYLIB_VERSION_MAJOR) || !defined(RAYLIB_VERSION_MINOR)
#error "raylib-cpp requires raylib >= 5"
#endif
#if RAYLIB_VERSION_MAJOR < 6
#error "raylib-cpp requires raylib >= 6"
#endif
#if RAYLIB_VERSION_MAJOR > 6
#error "raylib-cpp requires raylib ~6.0. Use the `next` branch for the next version of raylib."
#endif
#ifndef RLCPP_MAYBEUNUSED
# if defined(__has_cpp_attribute)
# if __has_cpp_attribute(maybe_unused) && __cplusplus >= 201703L
# define RLCPP_MAYBEUNUSED [[maybe_unused]]
# else
# define RLCPP_MAYBEUNUSED
# endif
# elif (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || (__cplusplus >= 201703L)
# define RLCPP_MAYBEUNUSED [[maybe_unused]]
# else
# define RLCPP_MAYBEUNUSED
# endif
#endif
#ifndef RLCPP_NODISCARD
# if defined(__has_cpp_attribute)
# if __has_cpp_attribute(nodiscard) && __cplusplus >= 201703L
# define RLCPP_NODISCARD [[nodiscard]]
# else
# define RLCPP_NODISCARD
# endif
# elif (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || (__cplusplus >= 201703L)
# define RLCPP_NODISCARD [[nodiscard]]
# else
# define RLCPP_NODISCARD
# endif
#endif
#ifdef __cplusplus
}
#endif
#endif // RAYLIB_CPP_INCLUDE_RAYLIB_HPP_
+30
View File
@@ -0,0 +1,30 @@
/**
* C++ header to wrap raymath.h.
*/
#ifndef RAYLIB_CPP_INCLUDE_RAYMATH_HPP_
#define RAYLIB_CPP_INCLUDE_RAYMATH_HPP_
#ifdef __cplusplus
extern "C" {
#endif
#ifndef RAYLIB_CPP_NO_MATH
#ifndef BUILD_RAYLIB_CPP_MODULES
#ifndef RAYMATH_STATIC_INLINE
#define RAYMATH_STATIC_INLINE
#endif
#endif
#ifdef __GNUC__
#pragma GCC diagnostic push // These throw a warnings on visual studio, need to check if __GNUC__ is defined to use it.
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#endif
#define RAYMATH_DISABLE_CPP_OPERATORS
#include "raymath.h" // NOLINT
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif
#endif
#ifdef __cplusplus
}
#endif
#endif // RAYLIB_CPP_INCLUDE_RAYMATH_HPP_
+151
View File
@@ -0,0 +1,151 @@
#include "polypartiCL.hpp"
#include "include/raylib-cpp.hpp"
#include <vector>
#include "rlgl.h"
#include <exception>
#include <iostream>
using namespace std;
string roomName = "rooms/load.room";
string partName = "particles/load.prtc";
int main(int argc, char* argv[]) {
const int fps = 60;
const int screenWidth = 1920;
const int screenHeight = 1080;
float angle = 0.05;
float d_interval_pct = 0.00001;
bool rotate = false;
bool drawLines = true;
bool drawFPS = false;
bool useShader = true;
bool paused = false;
// bool counterclockwise = false;
//
for (int i = 0; i < argc; i++) {
if (argv[i] == "--rotate"s || argv[i] == "-r"s) {
rotate = true;
}
}
Polyparti::Room sim(screenWidth, screenHeight, fps);
vector<raylib::Vector2> lines;
cout << "ok-1" << endl;
sim.loadRoom(roomName);
sim.loadParticles(partName);
sim.addFields();
for (const auto& item : sim.getCorners()) {
lines.push_back({item[0], item[1]});
}
raylib::Window window(screenWidth, screenHeight, "polypartiCL");
//raylib::Button::key R(KEY_R);
window.SetTargetFPS(fps);
raylib::RenderTexture2D renderTarget(screenWidth, screenHeight);
raylib::RenderTexture2D blur(screenWidth, screenHeight);
raylib::Shader blurShader("", "shaders/blur2.fs");
raylib::Vector2 mouse_i, mouse_f, mouse_d;
raylib::Vector2 midpoint(screenWidth * 0.5, screenHeight * 0.5);
int resXY = blurShader.GetLocation("resolution");
int dirXY = blurShader.GetLocation("direction");
float resolution[2] = { float(screenWidth), float(screenHeight)};
blurShader.SetValue(resXY, resolution, RL_SHADER_UNIFORM_VEC2);
while(!window.ShouldClose()) {
if (IsKeyPressed(KEY_R)) rotate = !rotate;
if (IsKeyPressed(KEY_L)) drawLines = !drawLines;
if (IsKeyPressed(KEY_F)) drawFPS = !drawFPS;
if (IsKeyPressed(KEY_D)) angle *= -1;
if (IsKeyPressed(KEY_B)) useShader = !useShader;
if (IsKeyPressed(KEY_SPACE)) paused = !paused;
if (IsKeyPressed(KEY_T)) sim.reverseInterval();
//if (IsKeyPressed(KEY_UP)) sim.adjustInterval(d_interval_pct);
//if (IsKeyPressed(KEY_DOWN)) sim.adjustInterval(-d_interval_pct);
/*if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) {
mouse_f = GetMousePosition();
mouse_f -= midpoint;
mouse_d = GetMouseDelta();
mouse_i = mouse_f - mouse_d;
angle = mouse_f.DotProduct(mouse_i);
angle = angle / mouse_f.Length() * mouse_i.Length();
angle = acos(angle);
}*/
if (!paused) {
sim.updateFields();
if (rotate) sim.rotateRoom(angle);
lines.clear();
}
for(const auto& item : sim.getCorners()) lines.push_back({item[0], item[1]});
if (useShader) {
renderTarget.BeginMode();
ClearBackground(BLACK);
if(drawLines) {
for(int i = 0; i < (lines.size() - 1); i++)
lines[i].DrawLine(lines[i+1], WHITE);
}
for (int i = 0; i < sim.getFieldCount(); i++) {
auto& field = sim.getField(i);
int *color = field.getColor();
rlBegin(RL_LINES);
rlColor4ub(color[0], color[1], color[2], color[3]);
for (const auto& p : field.getPositions()) {
rlVertex2f(p[0],p[1]);
rlVertex2f(p[0]+1.0f,p[1]+1.0f);
}
rlEnd();
}
renderTarget.EndMode();
float dirH[2] = {1.0f, 0.0f};
float dirV[2] = {0.0f, 1.0f};
blurShader.SetValue(dirXY, dirH, SHADER_UNIFORM_VEC2);
blur.BeginMode();
ClearBackground(BLACK);
blurShader.BeginMode();
DrawTextureRec(renderTarget.texture, {0, 0, resolution[0], -resolution[1]},
{0, 0}, WHITE);
blurShader.EndMode();
blur.EndMode();
blurShader.SetValue(dirXY, dirV, SHADER_UNIFORM_VEC2);
}
while(window.Drawing()) {
window.ClearBackground(BLACK);
if (useShader) {
blurShader.BeginMode();
DrawTextureRec(blur.texture, {0, 0, resolution[0], -resolution[1]}, {0,0}, WHITE);
blurShader.EndMode();
} else {
for (int i = 0; i < (int)lines.size() - 1; i++) {
lines[i].DrawLine(lines[i+1], WHITE);
}
for (int i = 0; i < sim.getFieldCount(); i++) {
auto& field = sim.getField(i);
int *color = field.getColor();
rlBegin(RL_LINES);
rlColor4ub(color[0], color[1], color[2], color[3]);
for (const auto& p : field.getPositions()) {
rlVertex2f(p[0],p[1]);
rlVertex2f(p[0]+1.0f,p[1]+1.0f);
}
rlEnd();
}
}
if(drawFPS) window.DrawFPS(10,10);
}
}
}
+4
View File
@@ -0,0 +1,4 @@
s
30000 0.64 0.78 0 360 yellow
30000 0.5 0.3333 0 360 magenta
30000 0.36 0.78 0 360 cyan
+4
View File
@@ -0,0 +1,4 @@
r
20000 0.4 0.5 0 360 blue
20000 0.6 0.5 0 360 green
20000 0.5 0.5 0 360 red
+4
View File
@@ -0,0 +1,4 @@
s
20000 0.5 0.33333333333 0 360 cyan
20000 0.3555 0.783 0 360 magenta
20000 0.6445 0.783 0 360 yellow
+4
View File
@@ -0,0 +1,4 @@
r
20000 0.2421875 0.899999999 0 60 blue
20000 0.7578125 0.899999999 120 180 green
20000 0.5 0.1 180 360 red
+4
View File
@@ -0,0 +1,4 @@
r
20000 0.333 0.78 0 360 blue
20000 0.666 0.78 0 360 green
20000 0.5 0.3333 0 360 red
+6
View File
@@ -0,0 +1,6 @@
r
12000 0.5 0.5 0 360 cyan
12000 0.25 0.25 0 360 magenta
12000 0.25 0.75 0 360 yellow
12000 0.75 0.25 0 360 green
12000 0.75 0.75 0 360 red
+514
View File
@@ -0,0 +1,514 @@
//use floats, not doubles, for 32-bit iGPUs
#include "polypartiCL.hpp"
#include <cmath>
#include <sycl/sycl.hpp>
#include <exception>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace sycl;
struct Polyparti::ParticleField::ColCode {
std::vector<XYVector> positions, velocities;
float t, fieldTime, lifeTime;
int count, decay = 0;
int color[4];
//float decay = 1.0f;
bool dies = false, dead = false;
// allocate only one queue so we don't reinitialize every step of the calculation
static queue& q_shared() {
static queue q{gpu_selector_v, property::queue::in_order()};
return q;
}
void checkCollisions(std::vector<XYVector> verticies) {
queue& q = q_shared();
int len_points = positions.size();
//Pointers to malloc on GPU VRAM for calculations. malloc_shared pointers are entry/exit
//point for data in CPU RAM
float *v_ptr = malloc_shared<float>(2 * len_points, q);
float *d_ptr = malloc_shared<float>(2 * len_points, q);
float *c_ptr = malloc_shared<float>(2 * len_points, q);
float *ray_ptr = malloc_device<float>(2 * len_points, q);
float *det_ptr = malloc_device<float>(len_points, q);
float *bestA_ptr = malloc_device<float>(2 * len_points, q);
float *bestSlope_ptr = malloc_device<float>(2 * len_points, q);
float *r_ptr = malloc_device<float>(len_points, q);
float *s_ptr = malloc_device<float>(len_points, q);
float *rPref_ptr = malloc_device<float>(len_points, q);
float *sPref_ptr = malloc_device<float>(len_points, q);
float *nml_ptr = malloc_device<float>(len_points * 2, q);
float *dot_ptr = malloc_device<float>(len_points, q);
float *t_ptr = malloc_shared<float>(1, q);
std::vector<float> sPrefInit(len_points, float(1000000.0f));
XYVector A, B, borderSlope;
//Copy arrays from CPU RAM to shared pointer with GPU VRAM & CPU RAM
//SYCL can only handle one memcpy per kernel
q.submit([&](handler& h) {h.memcpy(c_ptr, &positions[0], len_points * 2 * sizeof(float)); });
q.wait();
q.submit([&](handler& h) {h.memcpy(v_ptr, &velocities[0], len_points * 2 * sizeof(float));});
q.wait();
q.submit([&](handler& h) {h.memcpy(sPref_ptr, &sPrefInit[0], len_points * sizeof(float)); });
q.wait();
q.submit([&](handler& h) { h.memcpy(t_ptr, &t, sizeof(float)); });
q.wait();
//Calculate expected location of each particle after imminent time step, and vectorize the
//difference <dx, dy> from the current position. We will use Cramer's Rule with the
//vectorized boundary, also <dx, dy>, to check intersection
q.submit([&](handler& h) {
h.parallel_for(len_points * 2, [=](id<1> i) {
d_ptr[i] = v_ptr[i] * *t_ptr + c_ptr[i];
ray_ptr[i] = d_ptr[i] - c_ptr[i];
});
});
q.wait();
//Iterate over each room boundary in terms of their endpoints. Note that iterative and
//parallel computing concepts can work in tandem, with the next kernel executed
//sychronously within the for loop
for (int i = 1; i < verticies.size(); i++) {
A = verticies[i-1], B = verticies[i];
borderSlope[0] = B[0] - A[0];
borderSlope[1] = B[1] - A[1];
q.submit([&](handler& h) {
h.parallel_for(len_points, [=](id<1> i) {
//Calculate determinant of 2x2 matrix of both vectors
det_ptr[i] = borderSlope[0] * ray_ptr[(i*2) + 1] - borderSlope[1] * ray_ptr[(i*2)];
if (fabs(det_ptr[i]) > float(1e-5) * hypot(borderSlope[0], borderSlope[1]) * hypot(ray_ptr[i*2], ray_ptr[(i*2) + 1])) {
//
r_ptr[i] = ((c_ptr[i*2] - A[0]) * ray_ptr[(i*2)+1] - (c_ptr[(2*i)+1] - A[1]) * ray_ptr[i*2]) / det_ptr[i];
s_ptr[i] = ((c_ptr[i*2] - A[0]) * borderSlope[1] - (c_ptr[(i*2) + 1] - A[1]) * borderSlope[0]) / det_ptr[i];
} else {
r_ptr[i] = float(-1.0f);
s_ptr[i] = float(-1.0f);
}
});
});
q.wait();
q.submit([&](handler& h) {
h.parallel_for(len_points, [=](id<1> i) {
if (r_ptr[i] >= float(0.0) && r_ptr[i] <= float(1.0)
&& s_ptr[i] >= float(0.0) && s_ptr[i] <= float(1.0)) {
if (s_ptr[i] < sPref_ptr[i]) {
sPref_ptr[i] = s_ptr[i];
rPref_ptr[i] = r_ptr[i];
bestA_ptr[i*2] = A[0];
bestA_ptr[(i*2) + 1] = A[1];
bestSlope_ptr[i*2] = borderSlope[0];
bestSlope_ptr[(i*2) + 1] = borderSlope[1];
}
}
});
});
q.wait();
}
q.submit([&](handler& h) {
h.parallel_for(len_points, [=](id<1> i) {
if (sPref_ptr[i] < float(1000000.0f)) {
nml_ptr[(i*2)] = (-1 * bestSlope_ptr[(i*2) + 1]) / hypot(bestSlope_ptr[i*2], bestSlope_ptr[(i*2) + 1]);
nml_ptr[(i*2) + 1] = bestSlope_ptr[i*2] / hypot(bestSlope_ptr[i*2], bestSlope_ptr[(i*2) + 1]);
dot_ptr[i] = (nml_ptr[i*2] * v_ptr[i*2]) + (nml_ptr[(i*2) + 1] * v_ptr[(i*2) + 1]);
if (dot_ptr[i] > 0) {
nml_ptr[i*2] = nml_ptr[i*2] * -1;
nml_ptr[(i*2) + 1] = nml_ptr[(i*2) + 1] * -1;
dot_ptr[i] *= -1;
}
v_ptr[i*2] -= 2 * dot_ptr[i] * nml_ptr[i*2];
v_ptr[(i*2) + 1] -= 2 * dot_ptr[i] * nml_ptr[(i*2) + 1];
c_ptr[i*2] = bestA_ptr[i*2] + (rPref_ptr[i] * bestSlope_ptr[i*2]);
c_ptr[(i*2) + 1] = bestA_ptr[(i*2) + 1] + (rPref_ptr[i] * bestSlope_ptr[(i*2) + 1]);
c_ptr[i*2] -= nml_ptr[i*2] * 1e-4f;
c_ptr[(i*2) + 1] -= nml_ptr[(i*2) + 1] * 1e-4f;
}
});
});
q.wait();
//Get the computed data back into pointers we can use
q.submit([&](handler& h) {h.memcpy(&positions[0], c_ptr, len_points * 2 * sizeof(float));});
q.submit([&](handler& h) {h.memcpy(&velocities[0], v_ptr, len_points * 2 * sizeof(float));});
q.wait();
free(c_ptr, q);
free(d_ptr, q);
free(v_ptr, q);
free(ray_ptr, q);
free(det_ptr, q);
free(bestA_ptr, q);
free(bestSlope_ptr, q);
free(r_ptr, q);
free(s_ptr, q);
free(rPref_ptr, q);
free(sPref_ptr, q);
free(nml_ptr, q);
free(dot_ptr, q);
free(t_ptr,q);
}
void moveParticles() {
queue& q = q_shared();
int len = positions.size();
float *v_ptr = malloc_shared<float>(2 * len, q);
float *p_ptr = malloc_shared<float>(2 * len, q);
float *t_ptr = malloc_shared<float>(1, q);
q.submit([&](handler& h) {
h.memcpy(p_ptr, &positions[0], len * 2 * sizeof(float));
});
q.wait();
q.submit([&](handler& h) { h.memcpy(v_ptr, &velocities[0], len * 2 * sizeof(float)); } );
q.wait();
q.submit([&](handler& h) { h.memcpy(t_ptr, &t, sizeof(float)); } );
q.wait();
q.submit([&](handler& h) { h.parallel_for(len * 2, [=](id<1> i) {
p_ptr[i] += v_ptr[i] * *t_ptr;
}); });
q.wait();
q.submit([&](handler& h) { h.memcpy(&positions[0], p_ptr, len * 2 * sizeof(float)); });
q.wait();
q.submit([&](handler& h) { h.memcpy(&velocities[0], v_ptr, len * 2 * sizeof(float)); });
q.wait();
free(p_ptr, q);
free(v_ptr, q);
free(t_ptr, q);
}
};
Polyparti::ParticleField::ParticleField() : colcode(std::make_unique<ColCode>()) { }
Polyparti::ParticleField::~ParticleField() = default;
Polyparti::ParticleField::ParticleField(const ParticleField& other)
: colcode(std::make_unique<ColCode>(*other.colcode)) {}
Polyparti::ParticleField::ParticleField(ParticleField&&) noexcept = default;
Polyparti::ParticleField& Polyparti::ParticleField::operator=(ParticleField&& other) noexcept = default;
Polyparti::ParticleField& Polyparti::ParticleField::operator=(const ParticleField& other) {
if (this != &other) { *colcode = *other.colcode; }
return *this;
}
void Polyparti::ParticleField::addParticle(float x, float y, float vx, float vy) {
colcode->positions.push_back({x, y});
colcode->velocities.push_back({vx, vy});
colcode->count++;
}
void Polyparti::ParticleField::deleteParticle(int index) {
colcode->positions.erase(colcode->positions.begin() + index);
colcode->velocities.erase(colcode->velocities.begin() + index);
colcode->count--;
}
void Polyparti::ParticleField::updateField(std::vector<XYVector> verticies) {
colcode->checkCollisions(verticies);
colcode->moveParticles();
colcode->fieldTime += colcode->t;
if (colcode->dies) {
if (colcode->lifeTime >= colcode->fieldTime) {
colcode->color[3] -= colcode->decay;
}
if (colcode->color[3] <= 0) {
colcode->dead = true;
}
}
}
const std::vector<XYVector>& Polyparti::ParticleField::getPositions() const {
return colcode->positions;
}
int Polyparti::ParticleField::getSize() {
return colcode->positions.size();
}
void Polyparti::ParticleField::setColor(std::string newColor) {
colcode->color[3] = 255;
if (newColor == "red" ) {
colcode->color[0] = 255;
colcode->color[1] = 0;
colcode->color[2] = 0;
} else if (newColor == "orange") {
colcode->color[0] = 255;
colcode->color[1] = 127;
colcode->color[2] = 0;
} else if (newColor == "yellow") {
colcode->color[0] = 255;
colcode->color[1] = 255;
colcode->color[2] = 0;
} else if (newColor == "green") {
colcode->color[0] = 0;
colcode->color[1] = 255;
colcode->color[2] = 0;
} else if (newColor == "blue") {
colcode->color[0] = 0;
colcode->color[1] = 0;
colcode->color[2] = 255;
} else if (newColor == "indigo") {
colcode->color[0] = 31;
colcode->color[1] = 0;
colcode->color[2] = 127;
} else if (newColor == "violet") {
colcode->color[0] = 127;
colcode->color[1] = 0;
colcode->color[2] = 127;
} else if (newColor == "cyan") {
colcode->color[0] = 0;
colcode->color[1] = 255;
colcode->color[2] = 255;
} else if (newColor == "darkgreen") {
colcode->color[0] = 0;
colcode->color[1] = 127;
colcode->color[2] = 0;
} else if (newColor == "magenta") {
colcode->color[0] = 255;
colcode->color[1] = 0;
colcode->color[2] = 255;
} else {
colcode->color[0] = 255;
colcode->color[1] = 255;
colcode->color[2] = 255;
}
}
int* Polyparti::ParticleField::getColor() {
return colcode->color;
}
int Polyparti::ParticleField::getCount() {
return colcode->count;
}
void Polyparti::ParticleField::setInterval(const float interval) {
colcode->t = interval;
}
void Polyparti::ParticleField::setDecay(const float t, const float d) {
if (t != 0) {
colcode->dies = true;
colcode->lifeTime = fabs(t);
colcode->decay = static_cast<int>(fabs(d) * 255);
}
}
bool Polyparti::ParticleField::isDead() {
return colcode->dead;
}
struct Polyparti::Room::ImplRoom {
std::vector<XYVector> corners;
XYVector midpoint;
// std::vector<ParticleField> field;
};
Polyparti::Room::Room() : implRoom(std::make_unique<ImplRoom>()) {}
Polyparti::Room::Room(int w, int h) : Room() { screenWidth = w; screenHeight = h;}
Polyparti::Room::Room(int w, int h, int fps) : Room() {
screenWidth = w;
screenHeight = h;
interval = 1.0f/fps;
}
Polyparti::Room::~Room() = default;
Polyparti::Room::Room(const Room& other)
: implRoom(std::make_unique<ImplRoom>(*other.implRoom)),
info(other.info),
field(other.field),
x_min(other.x_min),
x_max(other.x_max),
y_min(other.y_min),
y_max(other.y_max){}
Polyparti::Room::Room(Room&& other) noexcept = default;
Polyparti::Room& Polyparti::Room::operator=(const Room& other) {
if (this != &other) {
*implRoom = *other.implRoom;
info = other.info;
field = other.field;
x_min = other.x_min;
x_max = other.x_max;
y_min = other.y_min;
y_max = other.y_max;
}
return *this;
}
Polyparti::Room& Polyparti::Room::operator=(Room&& other) noexcept = default;
void Polyparti::Room::addCorner(float x, float y) { implRoom->corners.push_back({x,y}); }
void Polyparti::Room::checkCorners() {
if (implRoom->corners.front() != implRoom->corners.back()) { implRoom->corners.push_back(implRoom->corners.front()); }
}
std::vector<XYVector> Polyparti::Room::getCorners() {
return implRoom->corners;
}
void Polyparti::Room::loadRoom(std::string name) {
std::ifstream roomfile;
std::string line, item;
bool relative = false;
float a, b, tot_x = 0, tot_y = 0;
int n = 0;
char check;
roomfile.open(name);
if (roomfile.is_open()) {check = roomfile.get();}
else { std::cout << "error" << std::endl;}
x_min = screenHeight;
y_min = screenWidth;
if (check == 'r') { relative = true; }
if (roomfile.is_open()) {
while (roomfile >> a >> b) {
if (relative) { a *= screenWidth; b *= screenHeight; }
addCorner(a,b);
tot_x += a;
tot_y += b;
n++;
if ( a > x_max) {x_max = a;}
if ( a < x_min) {x_min = a;}
if ( b > y_max) {y_max = b;}
if ( b < y_min) {y_min = b;}
}
} else {
std::cout << "error: rooms/load.room not found" << '\n';
}
checkCorners();
roomfile.close();
implRoom->midpoint[0] = tot_x / n;
implRoom->midpoint[1] = tot_y / n;
}
void Polyparti::Room::loadParticles(std::string name) {
fieldInfo newEntry;
std::ifstream partfile(name);
bool relativeScreen = false;
bool relativeRoom = false;
int count;
float x, y, deg_start, deg_end, life, decay;
std::string color;
char check = partfile.get();
if (check =='s') { relativeScreen = true;}
else if (check == 'r') { relativeRoom = true; }
if (partfile.is_open()) {
while (partfile >> count >> x >> y >> deg_start >> deg_end >> color) {
if (relativeScreen) {
x *= screenWidth;
y *= screenHeight;
} else if (relativeRoom) {
x = implRoom->midpoint[0] + (x * (x_max - x_min) / 2);
y = implRoom->midpoint[1] + (y * (y_max - y_min) / 2);
}
newEntry.count = count;
newEntry.x = x;
newEntry.y = y;
newEntry.deg_start = deg_start;
newEntry.deg_end = deg_end;
newEntry.color = color;
//newEntry.life = life;
//newEntry.decayRate = decay;
this->info.push_back(newEntry);
}
}
else {
std::cout << "error: particles/load.prtc not found" << '\n';
}
}
void Polyparti::Room::initField(Polyparti::Room::fieldInfo info) {
ParticleField newField;
double rad = 4 * std::acos(0.0);
info.deg_start = (info.deg_start / 360) * rad;
info.deg_end = (info.deg_end/360) * rad;
for (int i = 0; i < info.count; i++) {
double angle = (float(i) / info.count) * (info.deg_end - info.deg_start);
newField.addParticle(info.x, info.y, velocity * (std::cos(angle + info.deg_start)), velocity * (std::sin(angle + info.deg_start)));
}
newField.setColor(info.color);
newField.setInterval(interval);
newField.setDecay(info.life, info.decayRate);
field.push_back(std::move(newField));
}
void Polyparti::Room::rotateRoom(float degrees) {
float rad = (degrees / 360) * 4 * std::acos(0.0);
/*float tot_x = 0, tot_y = 0;
int n = implRoom->corners.size();
for (auto& point : implRoom->corners) {
tot_x += point[0];
tot_y += point[1];
}
implRoom->midpoint[0] = tot_x / n;
implRoom->midpoint[1] = tot_y / n;*/
for (auto& point : implRoom->corners) {
float temp = point[0];
point[0] = ((temp - implRoom->midpoint[0]) * std::cos(rad) - (point[1] - (implRoom->midpoint[1])) * std::sin(rad));
point[1] = ((temp - implRoom->midpoint[0]) * std::sin(rad) + (point[1] - (implRoom->midpoint[1])) * std::cos(rad));
point[0] += implRoom->midpoint[0];
point[1] += implRoom->midpoint[1];
}
}
void Polyparti::Room::addFields() { for (auto& i: info) initField(i);}
void Polyparti::Room::updateFields() {
for (auto& f : field) {
f.updateField(implRoom->corners);
}
field.erase(std::remove_if(field.begin(), field.end(), [](auto& f) { return f.isDead();}), field.end());
}
Polyparti::ParticleField& Polyparti::Room::getField(int index) { return field.at(index); }
void Polyparti::Room::adjustInterval(const float diff) {
//float diff = 1.0 + pct;
interval += diff;
for (auto &f : field) {
f.setInterval(diff);
}
}
void Polyparti::Room::reverseInterval() {
interval = -interval;
for (auto &f : field) {
f.setInterval(interval);
}
}
int Polyparti::Room::getFieldCount() {
return field.size();
}
+92
View File
@@ -0,0 +1,92 @@
#pragma once
#include <vector>
#include <array>
#include <memory>
#include <string>
typedef std::array<float, 2> XYVector;
//enum Colors {pRED, pORANGE, pYELLOW, pGREEN, pBLUE, pINDIGO, pVIOLET};
namespace Polyparti {
/*inline static float interval = 1.0f / 60;
inline static float velocity = 100;
static int screenWidth, screenHeight;*/
class ParticleField {
public:
ParticleField();
~ParticleField();
ParticleField(const ParticleField& other);
ParticleField(ParticleField&& other) noexcept;
ParticleField& operator=(const ParticleField& other);
ParticleField& operator=(ParticleField&& other) noexcept;
void addParticle(float x, float y, float vx, float vy);
void deleteParticle(int index);
void updateField(std::vector<XYVector> verticies);
const std::vector<XYVector>& getPositions() const;
int getSize();
void setColor(std::string newColor);
int* getColor();
void setCount(int count);
int getCount();
void setInterval(const float diff);
void setDecay(const float t, const float d);
bool isDead();
private:
struct ColCode;
std::unique_ptr<ColCode> colcode;
};
class Room {
private:
struct ImplRoom;
std::unique_ptr<ImplRoom> implRoom;
struct fieldInfo {
int count;
float x, y, deg_start, deg_end, life, decayRate;
int screenWidth, screenHeight;
std::string color;
};
std::vector<fieldInfo> info;
std::vector<ParticleField> field;
float x_min = 0, x_max = 0, y_min = 0, y_max = 0;
inline static float interval = 1.0f / 60;
inline static float velocity = 90;
inline static float screenWidth = 1920;
inline static float screenHeight = 1080;
public:
//std::vector<ParticleField> field;
//std::vector<fieldInfo> info;
int fieldCount = 0;
Room();
Room(int w, int h);
Room(int w, int h, int fps);
~Room();
Room(const Room& other);
Room(Room&& other) noexcept;
Room& operator=(const Room& other);
Room& operator=(Room&& other) noexcept;
static void setFPS(const int fps) {
interval = 1.0f / fps;
}
void addCorner(float x, float y);
void checkCorners();
std::vector<XYVector> getCorners(); //implement
void loadRoom(std::string name);
void loadParticles(std::string name);
void rotateRoom(float degrees);
void initField(fieldInfo info);
void addFields();
void updateFields();
ParticleField& getField(int index);
void adjustInterval(const float pct);
void reverseInterval();
int getFieldCount();
};
};
+6
View File
@@ -0,0 +1,6 @@
r
0.5 0.1
0.725 0.5
0.5 0.9
0.275 0.5
0.5 0.1
+8
View File
@@ -0,0 +1,8 @@
r
0.361979 0.0601852
0.6479167 0.0601852
0.790625 0.5
0.6479167 0.9398148
0.361979 0.9398148
0.209375 0.5
0.361979 0.0601852
+5
View File
@@ -0,0 +1,5 @@
r
0.5 0.111615741
0.754148958 0.894191667
0.245851042 0.894191667
0.5 0.111615741
View File
+6
View File
@@ -0,0 +1,6 @@
r
0.5 0.05
0.75 0.5
0.5 0.95
0.25 0.5
0.5 0.05
+6
View File
@@ -0,0 +1,6 @@
r
0.1 0.1
0.9 0.1
0.9 0.9
0.1 0.9
0.1 0.1
+6
View File
@@ -0,0 +1,6 @@
r
0 0
1 0
1 1
0 1
0 0

Some files were not shown because too many files have changed in this diff Show More