Skip to content

Commit be2efd4

Browse files
authored
Merge pull request #360 from mikomikotaishi/master
Add support for C++20 modules
2 parents 6bd8b09 + c094f76 commit be2efd4

File tree

5 files changed

+275
-0
lines changed

5 files changed

+275
-0
lines changed

CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,20 @@ option(BUILD_RAYLIB_CPP_EXAMPLES "Examples" ${RAYLIB_CPP_IS_MAIN})
1818
# Include Directory
1919
add_subdirectory(include)
2020

21+
# Modules
22+
option(BUILD_RAYLIB_CPP_MODULES "Build C++ modules support" OFF)
23+
24+
if(BUILD_RAYLIB_CPP_MODULES)
25+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28)
26+
message(STATUS "Building raylib-cpp C++ modules (CMake ${CMAKE_VERSION} supports modules)")
27+
add_subdirectory(modules)
28+
else()
29+
message(WARNING "Skipping raylib-cpp C++ modules (requires CMake 3.28+, found ${CMAKE_VERSION})")
30+
endif()
31+
else()
32+
message(STATUS "raylib-cpp C++ modules support is disabled. Enable with -BUILD_RAYLIB_CPP_MODULES=ON")
33+
endif()
34+
2135
# Examples
2236
if(BUILD_RAYLIB_CPP_EXAMPLES)
2337
add_subdirectory(examples)

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,24 @@ raylib::Vector2 direction(50, 50);
253253
raylib::Vector2 newDirection = direction.Rotate(30);
254254
```
255255
256+
### Modules
257+
258+
If using C++20 or later, by passing `BUILD_RAYLIB_CPP_MODULES` to the build system the library may be imported as a module by using `import raylib;`.
259+
260+
```cpp
261+
import raylib;
262+
263+
int main() {
264+
int screenWidth = 800;
265+
int screenHeight = 450;
266+
267+
raylib::Window window(screenWidth, screenHeight, "raylib-cpp - basic window");
268+
raylib::Texture logo("raylib_logo.png");
269+
270+
// ...
271+
}
272+
```
273+
256274
## Getting Started
257275

258276
*raylib-cpp* is a header-only library. This means in order to use it, you must link your project to [raylib](https://www.raylib.com/), and then include [`raylib-cpp.hpp`](raylib-cpp/include/raylib-cpp.hpp).

include/raymath.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
extern "C" {
99
#endif
1010
#ifndef RAYLIB_CPP_NO_MATH
11+
#ifndef BUILD_RAYLIB_CPP_MODULES
1112
#ifndef RAYMATH_STATIC_INLINE
1213
#define RAYMATH_STATIC_INLINE
1314
#endif
15+
#endif
1416
#ifdef __GNUC__
1517
#pragma GCC diagnostic push // These throw a warnings on visual studio, need to check if __GNUC__ is defined to use it.
1618
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"

modules/CMakeLists.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
file(GLOB_RECURSE RAYLIB_CPP_MODULES raylib.cppm)
2+
3+
add_library(raylib_cpp_modules)
4+
5+
cmake_minimum_required(VERSION 3.28)
6+
7+
if(NOT COMMAND configure_cpp_module_target)
8+
function(configure_cpp_module_target target)
9+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28)
10+
target_sources(${target} PUBLIC FILE_SET CXX_MODULES FILES ${RAYLIB_CPP_MODULES})
11+
else()
12+
message(WARNING "C++ modules require CMake 3.28+. Using standard compilation.")
13+
target_sources(${target} PRIVATE ${RAYLIB_CPP_MODULES})
14+
endif()
15+
endfunction()
16+
endif()
17+
18+
configure_cpp_module_target(raylib_cpp_modules)
19+
20+
target_link_libraries(raylib_cpp_modules
21+
PUBLIC
22+
raylib_cpp
23+
)
24+
25+
target_include_directories(raylib_cpp_modules
26+
PRIVATE
27+
${PROJECT_SOURCE_DIR}/include
28+
)
29+
30+
target_compile_features(raylib_cpp_modules PUBLIC cxx_std_20)

modules/raylib.cppm

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
/**
2+
* @file raylib.cppm
3+
* @brief Module file exporting all symbols in raylib-cpp.
4+
*/
5+
6+
module;
7+
8+
#define BUILD_RAYLIB_CPP_MODULES
9+
#define RLCPPAPI
10+
#define RAYMATH_IMPLEMENTATION
11+
#include "../include/raylib-cpp.hpp"
12+
13+
export module raylib;
14+
15+
/**
16+
* @namespace raylib
17+
* @brief All raylib-cpp classes and functions appear in the raylib namespace.
18+
*/
19+
export namespace raylib {
20+
// Classes
21+
using raylib::AudioDevice;
22+
using raylib::AudioStream;
23+
using raylib::AutomationEventList;
24+
using raylib::BoundingBox;
25+
using raylib::Camera; // Alias for Camera3D
26+
using raylib::Camera2D;
27+
using raylib::Camera3D;
28+
using raylib::Color;
29+
using raylib::FileData;
30+
using raylib::FileText;
31+
using raylib::Font;
32+
using raylib::Gamepad;
33+
using raylib::Image;
34+
using raylib::Material;
35+
using raylib::Matrix;
36+
using raylib::Mesh;
37+
using raylib::Model;
38+
using raylib::ModelAnimation;
39+
using raylib::Music;
40+
using raylib::Ray;
41+
using raylib::RayCollision;
42+
using raylib::RaylibException;
43+
using raylib::Rectangle;
44+
using raylib::RenderTexture;
45+
using raylib::RenderTexture2D; // Alias for RenderTexture
46+
using raylib::Shader;
47+
using raylib::Sound;
48+
using raylib::Text;
49+
using raylib::Texture;
50+
using raylib::Texture2D; // Alias for Texture
51+
using raylib::TextureCubemap; // Alias for Texture
52+
using raylib::TextureUnmanaged;
53+
using raylib::Texture2DUnmanaged; // Alias for TextureUnmanaged
54+
using raylib::TextureCubemapUnmanaged; // Alias for TextureUnmanaged
55+
using raylib::Vector2;
56+
using raylib::Vector3;
57+
using raylib::Vector4;
58+
using raylib::Quaternion; // Alias for Vector4
59+
using raylib::VrStereoConfig;
60+
using raylib::Wave;
61+
using raylib::Window;
62+
63+
// From Functions.hpp
64+
using raylib::InitWindow;
65+
using raylib::SetWindowTitle;
66+
using raylib::GetMonitorName;
67+
using raylib::SetClipboardText;
68+
using raylib::GetClipboardText;
69+
using raylib::TakeScreenshot;
70+
using raylib::GetGamepadName;
71+
using raylib::LoadFileText;
72+
using raylib::SaveFileText;
73+
using raylib::FileExists;
74+
using raylib::DirectoryExists;
75+
using raylib::IsFileExtension;
76+
using raylib::GetFileExtension;
77+
using raylib::GetFileName;
78+
using raylib::GetFileNameWithoutExt;
79+
using raylib::GetDirectoryPath;
80+
using raylib::GetPrevDirectoryPath;
81+
using raylib::GetWorkingDirectory;
82+
using raylib::LoadDirectoryFiles;
83+
using raylib::ChangeDirectory;
84+
using raylib::LoadDroppedFiles;
85+
using raylib::GetFileModTime;
86+
using raylib::OpenURL;
87+
using raylib::LoadImage;
88+
using raylib::LoadImageRaw;
89+
using raylib::LoadImageAnim;
90+
using raylib::LoadImageFromMemory;
91+
using raylib::ExportImage;
92+
using raylib::ExportImageAsCode;
93+
using raylib::DrawText;
94+
using raylib::DrawTextEx;
95+
using raylib::DrawTextPro;
96+
using raylib::LoadFont;
97+
using raylib::LoadFontEx;
98+
using raylib::MeasureText;
99+
using raylib::TextIsEqual;
100+
using raylib::TextLength;
101+
using raylib::TextSubtext;
102+
using raylib::TextReplace;
103+
using raylib::TextInsert;
104+
using raylib::TextSplit;
105+
using raylib::TextFindIndex;
106+
using raylib::TextToUpper;
107+
using raylib::TextToLower;
108+
using raylib::TextToPascal;
109+
using raylib::TextToInteger;
110+
111+
/**
112+
* @namespace raylib::Keyboard
113+
* @brief Input-related functions: keyboard
114+
*/
115+
namespace Keyboard {
116+
using raylib::Keyboard::IsKeyPressed;
117+
using raylib::Keyboard::IsKeyPressedRepeat;
118+
using raylib::Keyboard::IsKeyDown;
119+
using raylib::Keyboard::IsKeyReleased;
120+
using raylib::Keyboard::IsKeyUp;
121+
using raylib::Keyboard::GetKeyPressed;
122+
using raylib::Keyboard::GetCharPressed;
123+
}
124+
125+
/**
126+
* @namespace raylib::Mouse
127+
* @brief Input-related functions: mouse
128+
*/
129+
namespace Mouse {
130+
using raylib::Mouse::IsButtonPressed;
131+
using raylib::Mouse::IsButtonDown;
132+
using raylib::Mouse::IsButtonReleased;
133+
using raylib::Mouse::IsButtonUp;
134+
using raylib::Mouse::GetX;
135+
using raylib::Mouse::GetY;
136+
using raylib::Mouse::SetX;
137+
using raylib::Mouse::SetY;
138+
using raylib::Mouse::GetPosition;
139+
using raylib::Mouse::SetPosition;
140+
using raylib::Mouse::GetDelta;
141+
using raylib::Mouse::SetOffset;
142+
using raylib::Mouse::SetScale;
143+
using raylib::Mouse::GetWheelMove;
144+
using raylib::Mouse::GetWheelMoveV;
145+
using raylib::Mouse::SetCursor;
146+
using raylib::Mouse::GetTouchX;
147+
using raylib::Mouse::GetTouchY;
148+
using raylib::Mouse::GetTouchPosition;
149+
using raylib::Mouse::GetRay;
150+
}
151+
152+
/**
153+
* @namespace raylib::Touch
154+
* @brief Input-related functions: touch
155+
*/
156+
namespace Touch {
157+
using raylib::Touch::GetX;
158+
using raylib::Touch::GetY;
159+
using raylib::Touch::GetPosition;
160+
using raylib::Touch::GetPointId;
161+
using raylib::Touch::GetPointCount;
162+
}
163+
164+
165+
} // namespace raylib
166+
167+
#ifdef RAYLIB_CPP_R_PREFIXES
168+
export {
169+
using RAudioDevice = raylib::AudioDevice;
170+
using RAudioStream = raylib::AudioStream;
171+
using RAutomationEventList = raylib::AutomationEventList;
172+
using RBoundingBox = raylib::BoundingBox;
173+
using RCamera = raylib::Camera; // Alias for Camera3D
174+
using RCamera2D = raylib::Camera2D;
175+
using RCamera3D = raylib::Camera3D;
176+
using RColor = raylib::Color;
177+
using RFileData = raylib::FileData;
178+
using RFileText = raylib::FileText;
179+
using RFont = raylib::Font;
180+
using RGamepad = raylib::Gamepad;
181+
using RImage = raylib::Image;
182+
using RMaterial = raylib::Material;
183+
using RMatrix = raylib::Matrix;
184+
using RMesh = raylib::Mesh;
185+
using RModel = raylib::Model;
186+
using RModelAnimation = raylib::ModelAnimation;
187+
using RMusic = raylib::Music;
188+
using RRay = raylib::Ray;
189+
using RRayCollision = raylib::RayCollision;
190+
using RRaylibException = raylib::RaylibException;
191+
using RRectangle = raylib::Rectangle;
192+
using RRenderTexture = raylib::RenderTexture;
193+
using RRenderTexture2D = raylib::RenderTexture2D; // Alias for RenderTexture
194+
using RShader = raylib::Shader;
195+
using RSound = raylib::Sound;
196+
using RText = raylib::Text;
197+
using RTexture = raylib::Texture;
198+
using RTexture2D = raylib::Texture2D; // Alias for Texture
199+
using RTextureCubemap = raylib::TextureCubemap; // Alias for Texture
200+
using RTextureUnmanaged = raylib::TextureUnmanaged;
201+
using RTexture2DUnmanaged = raylib::Texture2DUnmanaged; // Alias for TextureUnmanaged
202+
using RTextureCubemapUnmanaged = raylib::TextureCubemapUnmanaged; // Alias for TextureUnmanaged
203+
using RVector2 = raylib::Vector2;
204+
using RVector3 = raylib::Vector3;
205+
using RVector4 = raylib::Vector4;
206+
using RQuaternion = raylib::Quaternion; // Alias for Vector4
207+
using RVrStereoConfig = raylib::VrStereoConfig;
208+
using RWave = raylib::Wave;
209+
using RWindow = raylib::Window;
210+
}
211+
#endif

0 commit comments

Comments
 (0)