mirror of
https://github.com/raysan5/raylib.git
synced 2026-05-26 14:40:27 -04:00
Compare commits
24 Commits
96e30549f5
...
6.0
| Author | SHA1 | Date | |
|---|---|---|---|
| dbc56a87da | |||
| 932558ca7a | |||
| 7495a77a79 | |||
| a4680fc677 | |||
| d6445b55d6 | |||
| d87bf55607 | |||
| a32b53f4d6 | |||
| cc752037b9 | |||
| 90e9145978 | |||
| 9060ac7c95 | |||
| 4ced756474 | |||
| 88f8ca42f5 | |||
| 9a3283f698 | |||
| f0a043bb75 | |||
| dde8c8e07e | |||
| 1cbe438f93 | |||
| 7c96c24cf9 | |||
| d116c92f13 | |||
| 14fe0cbfd8 | |||
| 94f3c094e7 | |||
| be768e27f9 | |||
| 6ef36c0a17 | |||
| 49f88dc6ed | |||
| 86aa0950bd |
@ -17,7 +17,7 @@ KEY CHANGES:
|
||||
- New File System API
|
||||
- New Text Management API
|
||||
- New tool: [rexm] raylib examples manager
|
||||
- Added +50 new examples to learn from
|
||||
- Added +70 new examples to learn from
|
||||
|
||||
Detailed changes:
|
||||
|
||||
@ -115,6 +115,7 @@ Detailed changes:
|
||||
[rcore][GLFW] REVIEWED: `GetGamepadButtonPressed()`, return GAMEPAD_BUTTON_*_TRIGGER_2 if pressed (#4742) by @whaleymar
|
||||
[rcore][GLFW] REVIEWED: Update `mappings.h` using `GenerateMappings.cmake` by @sleeptightAnsiC
|
||||
[rcore][RGFW] ADDED: New backend option: `PLATFORM_WEB_RGFW` and update RGFW (#4480) by @colleagueRiley
|
||||
[rcore][RGFW] ADDED: Support for software rendering (#5773) by @CrackedPixel
|
||||
[rcore][RGFW] REVIEWED: Added missing Right Control key by @M374LX
|
||||
[rcore][RGFW] REVIEWED: Changed `RGFW_window_eventWait` timeout to -1 by @doggymangc
|
||||
[rcore][RGFW] REVIEWED: Duplicate entries removed from `keyMappingRGFW` (#5242) by @iamahuman1395
|
||||
@ -326,6 +327,7 @@ Detailed changes:
|
||||
[rmodels] REVIEWED: `DrawSphereEx()`, normals support (#4926) by @karl-zylinski
|
||||
[rmodels] REVIEWED: `ExportMesh()`, improve OBJ vertex data precision and lower memory usage (#4496) by @mikeemm
|
||||
[rmodels] REVIEWED: `CheckCollisionSpheres()`, simplified using `Vector3DistanceSqr()` (#5695) by @Bigfoot71
|
||||
[rmodels] REVIEWED: `CheckCollisionBoxSphere()`, improved performance and consistency (#5776) by @maiconpintoabreu
|
||||
[raudio] REVIEWED: Fix a glitch at the end of a sound (#5578) by @mackron
|
||||
[raudio] REVIEWED: Improvements to device configuration (#5577) by @mackron
|
||||
[raudio] REVIEWED: Initialize sound alias properties as if it was a new sound (#5123) by @JeffM2501
|
||||
@ -410,11 +412,12 @@ Detailed changes:
|
||||
[build][CMake] REVIEWED: Set `libm` as public so it can be linked by consumer (#5193) by @brccabral
|
||||
[build][Cmake] REVIEWED: Expose PLATFORM_WEB_RGFW (#5579) by @crisserpl2
|
||||
[build][Zig] ADDED: Android target to build by @lumenkeyes
|
||||
[build][Zig] REDESIGNED: Complete refactor of build.zig to support Zig 0.16.0 (#5764) by @HaxSam
|
||||
[build][Zig] REVIEWED: Link EGL for Android by @lumenkeyes
|
||||
[build][Zig] REVIEWED: Approach to build for web with zig-build (#5157) by @haxsam
|
||||
[build][Zig] REVIEWED: Fix build accessing env vars (#5490) by @iisakki
|
||||
[build][Zig] REVIEWED: Fix emscripten building by @johnnymarler
|
||||
[build][Zig] REVIWED: Move examples/build.zig into main build.zig by @johnnymarler
|
||||
[build][Zig] REVIEWED: Move examples/build.zig into main build.zig by @johnnymarler
|
||||
[build][Zig] REVIEWED: Fix raygui inclusion in windows crosscompilation (#4489) by @kimierik
|
||||
[build][Zig] REVIEWED: Issue on emscripten run if the user has not installed emsdk by @emilhakimov415
|
||||
[build][Zig] REVIEWED: Make X11 the default display backend instead of choosing at runtime (#5168) by @Not-Nik
|
||||
@ -462,6 +465,7 @@ Detailed changes:
|
||||
[examples] ADDED: `shapes_rlgl_triangle` example (#5353) by @robinsaviary
|
||||
[examples] ADDED: `shapes_starfield` (#5255) by @themushroompirates
|
||||
[examples] ADDED: `shapes_triangle_strip` (#5240) by @Jopestpe
|
||||
[examples] ADDED: `shapes_collision_ellipses` (#5722) by @Monjaris
|
||||
[examples] ADDED: `text_inline_styling` by @raysan5
|
||||
[examples] ADDED: `text_strings_management` (#5379) by @davidbuzatto
|
||||
[examples] ADDED: `text_words_alignment` (#5254) by @themushroompirates
|
||||
|
||||
12
HISTORY.md
12
HISTORY.md
@ -530,10 +530,10 @@ A new `raylib` release is finally ready and, again, this is the **biggest `rayli
|
||||
|
||||
Some astonishing numbers for this release:
|
||||
|
||||
- **+320** closed issues (for a TOTAL of **+2140**!)
|
||||
- **+1950** commits since previous RELEASE (for a TOTAL of **+9700**!)
|
||||
- **+330** closed issues (for a TOTAL of **+2150**!)
|
||||
- **+2000** commits since previous RELEASE (for a TOTAL of **+9760**!)
|
||||
- **+20** new functions ADDED to raylib API (for a TOTAL of **600**!)
|
||||
- **+50** new examples to learn from (for a TOTAL of **+210**!)
|
||||
- **+70** new examples to learn from (for a TOTAL of **+215**!)
|
||||
- **+210** new contributors (for a TOTAL of **+850**!)
|
||||
|
||||
Highlights for `raylib 6.0`:
|
||||
@ -591,14 +591,14 @@ COMMANDS:
|
||||
update : Validate and update examples collection, generates report
|
||||
```
|
||||
|
||||
- **`NEW` +50 new examples**: Thanks to `rexm` and the simplification on examples management, this new raylib release includes +50 new examples to leearn from, most of them contributed by community.
|
||||
- **`NEW` +70 new examples**: Thanks to `rexm` and the simplification on examples management, this new raylib release includes +70 new examples to learn from, most of them contributed by community. Multiple examples have also been renamed for consistency and all examples header and structure have been reviewed and unified.
|
||||
|
||||
Make sure to check raylib [CHANGELOG](https://github.com/raysan5/raylib/blob/master/CHANGELOG) for a detailed list of changes!
|
||||
|
||||
I want to **thank all the contributors (+850!**) that along the years have **greatly improved raylib** and pushed it further and better day after day. And **many thanks to raylib community and all raylib users** for supporting the library along those many years.
|
||||
|
||||
Finally, I want to thank [puffer.ai](https://puffer.ai/) and [comma.ai](https://comma.ai/) for **supporting and sponsoring the project** as platinum sponsors, along many others individuals that have been sponsoring raylib along the years. Thanks to all of you for allowing me to keep working on this library!
|
||||
Finally, I want to thank [puffer.ai](https://puffer.ai/) and [comma.ai](https://comma.ai/) for **using raylib and supporting the project** as platinum sponsors, along many others individuals that have been sponsoring raylib along the years. Thanks to all of you for allowing me to keep working on this library!
|
||||
|
||||
**After +12 years of development, `raylib 6.0` is today one of the bests libraries to enjoy games/tools/graphic programming!**
|
||||
**After +12 years of development, `raylib 6.0` is today one of the bests libraries to enjoy games/tools/graphics programming!**
|
||||
|
||||
**Enjoy graphics programming with raylib!** :)
|
||||
|
||||
@ -11,6 +11,11 @@
|
||||
.hash = "N-V-__8AALShqgXkvqYU6f__FrA22SMWmi2TXCJjNTO1m8XJ",
|
||||
.lazy = true,
|
||||
},
|
||||
.raygui = .{
|
||||
.url = "git+https://github.com/raysan5/raygui#3b2855842ab578a034f827c38cf8f62c042fc983",
|
||||
.hash = "N-V-__8AAHvybwBw1kyBGn0BW_s1RqIpycNjLf_XbE-fpLUF",
|
||||
.lazy = true,
|
||||
},
|
||||
.emsdk = .{
|
||||
.url = "git+https://github.com/emscripten-core/emsdk#4.0.9",
|
||||
.hash = "N-V-__8AAJl1DwBezhYo_VE6f53mPVm00R-Fk28NPW7P14EQ",
|
||||
|
||||
@ -510,7 +510,7 @@ ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_WIN32)
|
||||
# Libraries for Windows desktop compilation
|
||||
LDFLAGS += -L..\src
|
||||
LDLIBS = -lraylib -lgdi32 -lwinmm -lshcore
|
||||
ifneq ($(GRAPHICS),GRAPHICS_API_OPENGL_11_SOFTWARE)
|
||||
ifneq ($(GRAPHICS),GRAPHICS_API_OPENGL_SOFTWARE)
|
||||
LDLIBS += -lopengl32
|
||||
endif
|
||||
endif
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||
* BSD-like license that allows static linking with closed source software
|
||||
*
|
||||
* Copyright (c) 2013-2025 Ramon Santamaria (@raysan5)
|
||||
* Copyright (c) 2013-2026 Ramon Santamaria (@raysan5)
|
||||
*
|
||||
********************************************************************************************/
|
||||
|
||||
|
||||
133
examples/shapes/shapes_ellipse_collision.c
Normal file
133
examples/shapes/shapes_ellipse_collision.c
Normal file
@ -0,0 +1,133 @@
|
||||
/*******************************************************************************************
|
||||
*
|
||||
* raylib [shapes] example - ellipse collision
|
||||
*
|
||||
* Example complexity rating: [★★☆☆] 2/4
|
||||
*
|
||||
* Example originally created with raylib 5.5, last time updated with raylib 5.5
|
||||
*
|
||||
* Example contributed by Ziya (@Monjaris)
|
||||
*
|
||||
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||
* BSD-like license that allows static linking with closed source software
|
||||
*
|
||||
* Copyright (c) 2025 Ziya (@Monjaris)
|
||||
*
|
||||
********************************************************************************************/
|
||||
|
||||
#include "raylib.h"
|
||||
#include <math.h>
|
||||
|
||||
// Check if point is inside ellipse
|
||||
static bool CheckCollisionPointEllipse(Vector2 point, Vector2 center, float rx, float ry)
|
||||
{
|
||||
float dx = (point.x - center.x)/rx;
|
||||
float dy = (point.y - center.y)/ry;
|
||||
return (dx*dx + dy*dy) <= 1.0f;
|
||||
}
|
||||
|
||||
// Check if two ellipses collide
|
||||
// Uses radial boundary distance in the direction between centers — scales correctly with radii
|
||||
static bool CheckCollisionEllipses(Vector2 c1, float rx1, float ry1, Vector2 c2, float rx2, float ry2)
|
||||
{
|
||||
float dx = c2.x - c1.x;
|
||||
float dy = c2.y - c1.y;
|
||||
float dist = sqrtf(dx*dx + dy*dy);
|
||||
|
||||
// Ellipses are on top of each other
|
||||
if (dist == 0.0f) return true;
|
||||
|
||||
float theta = atan2f(dy, dx);
|
||||
float cosT = cosf(theta);
|
||||
float sinT = sinf(theta);
|
||||
|
||||
// Radial distance from center to ellipse boundary in direction theta
|
||||
// r(theta) = (rx * ry) / sqrt((ry*cos)^2 + (rx*sin)^2)
|
||||
float r1 = (rx1*ry1)/sqrtf((ry1*cosT)*(ry1*cosT) + (rx1*sinT)*(rx1*sinT));
|
||||
float r2 = (rx2*ry2)/sqrtf((ry2*cosT)*(ry2*cosT) + (rx2*sinT)*(rx2*sinT));
|
||||
|
||||
return dist <= (r1 + r2);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
// Program main entry point
|
||||
//------------------------------------------------------------------------------------
|
||||
int main(void)
|
||||
{
|
||||
// Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
const int screenWidth = 800;
|
||||
const int screenHeight = 450;
|
||||
|
||||
InitWindow(screenWidth, screenHeight, "raylib [shapes] example - collision ellipses");
|
||||
SetTargetFPS(60);
|
||||
|
||||
Vector2 ellipseACenter = { (float)screenWidth/4, (float)screenHeight/2 };
|
||||
float ellipseARx = 120.0f;
|
||||
float ellipseARy = 70.0f;
|
||||
|
||||
Vector2 ellipseBCenter = { (float)screenWidth*3/4, (float)screenHeight/2 };
|
||||
float ellipseBRx = 90.0f;
|
||||
float ellipseBRy = 140.0f;
|
||||
|
||||
// 0 = controlling A, 1 = controlling B
|
||||
int controlled = 0;
|
||||
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
// Main game loop
|
||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||
{
|
||||
// Update
|
||||
//----------------------------------------------------------------------------------
|
||||
if (IsKeyPressed(KEY_A)) controlled = 0;
|
||||
if (IsKeyPressed(KEY_B)) controlled = 1;
|
||||
|
||||
if (controlled == 0) ellipseACenter = GetMousePosition();
|
||||
else ellipseBCenter = GetMousePosition();
|
||||
|
||||
bool ellipsesCollide = CheckCollisionEllipses(
|
||||
ellipseACenter, ellipseARx, ellipseARy,
|
||||
ellipseBCenter, ellipseBRx, ellipseBRy
|
||||
);
|
||||
|
||||
bool mouseInA = CheckCollisionPointEllipse(GetMousePosition(), ellipseACenter, ellipseARx, ellipseARy);
|
||||
bool mouseInB = CheckCollisionPointEllipse(GetMousePosition(), ellipseBCenter, ellipseBRx, ellipseBRy);
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
|
||||
ClearBackground(RAYWHITE);
|
||||
|
||||
DrawEllipse((int)ellipseACenter.x, (int)ellipseACenter.y, ellipseARx, ellipseARy, ellipsesCollide ? RED : BLUE);
|
||||
|
||||
DrawEllipse((int)ellipseBCenter.x, (int)ellipseBCenter.y, ellipseBRx, ellipseBRy, ellipsesCollide ? RED : GREEN);
|
||||
|
||||
DrawEllipseLines((int)ellipseACenter.x, (int)ellipseACenter.y, ellipseARx, ellipseARy, WHITE);
|
||||
|
||||
DrawEllipseLines((int)ellipseBCenter.x, (int)ellipseBCenter.y, ellipseBRx, ellipseBRy, WHITE);
|
||||
|
||||
DrawCircleV(ellipseACenter, 4, WHITE);
|
||||
DrawCircleV(ellipseBCenter, 4, WHITE);
|
||||
|
||||
if (ellipsesCollide) DrawText("ELLIPSES COLLIDE", screenWidth/2 - 120, 40, 28, RED);
|
||||
else DrawText("NO COLLISION", screenWidth/2 - 80, 40, 28, DARKGRAY);
|
||||
|
||||
DrawText(controlled == 0 ? "Controlling: A" : "Controlling: B", 20, screenHeight - 40, 20, YELLOW);
|
||||
|
||||
if (mouseInA && controlled != 0) DrawText("Mouse inside ellipse A", 20, screenHeight - 70, 20, BLUE);
|
||||
if (mouseInB && controlled != 1) DrawText("Mouse inside ellipse B", 20, screenHeight - 70, 20, GREEN);
|
||||
|
||||
DrawText("Press [A] or [B] to switch control", 20, 20, 20, GRAY);
|
||||
|
||||
EndDrawing();
|
||||
//----------------------------------------------------------------------------------
|
||||
}
|
||||
|
||||
// De-Initialization
|
||||
CloseWindow();
|
||||
|
||||
return 0;
|
||||
}
|
||||
BIN
examples/shapes/shapes_ellipse_collision.png
Normal file
BIN
examples/shapes/shapes_ellipse_collision.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
@ -13,6 +13,7 @@ IDE | Platform(s) | Source | Example(s)
|
||||
[SublimeText](https://www.sublimetext.com/) | Windows, Linux, macOS | ✔️ | ✔️
|
||||
[VS2019](https://www.visualstudio.com) | Windows | ✔️ | ✔️
|
||||
[VSCode](https://code.visualstudio.com/) | Windows, macOS | ❌ | ✔️
|
||||
[Zig](https://ziglang.org) | Windows, Linux, macOS, Web | ✔️ | ✔️
|
||||
scripts | Windows, Linux, macOS | ✔️ | ✔️
|
||||
|
||||
*New IDEs config files are welcome!*
|
||||
|
||||
84
projects/Zig/README.md
Normal file
84
projects/Zig/README.md
Normal file
@ -0,0 +1,84 @@
|
||||
# Starting your raylib project with Zig (0.16.0)
|
||||
|
||||
## How to compile and run it
|
||||
|
||||
To compile the project:
|
||||
|
||||
```sh
|
||||
zig build
|
||||
```
|
||||
|
||||
To run the project:
|
||||
|
||||
```sh
|
||||
zig build run
|
||||
```
|
||||
|
||||
## Compile with different optimization
|
||||
|
||||
To change from debug to release build you can do it with the `-Doptimze=` flag.
|
||||
|
||||
```
|
||||
Debug
|
||||
ReleaseSafe
|
||||
ReleaseFast
|
||||
ReleaseSmall
|
||||
```
|
||||
|
||||
## Choose a different platform
|
||||
|
||||
To compile with a different platform you can use the `-Dplatform=` flag.
|
||||
Here all the options:
|
||||
|
||||
```
|
||||
glfw
|
||||
rgfw
|
||||
sdl
|
||||
sdl2
|
||||
sdl3
|
||||
memory
|
||||
win32
|
||||
drm
|
||||
android
|
||||
```
|
||||
|
||||
In this example the platform `sdl` and `sdl2` are not supported
|
||||
|
||||
Important for the android platform you also have to compile for the right target
|
||||
|
||||
## Compile for a different target
|
||||
|
||||
To compile for a different [target](https://ziglang.org/download/0.16.0/release-notes.html#Support-Table) you can use the `-Dtarget=` flag.
|
||||
Not all targets are supported
|
||||
|
||||
## Example: Compile for web and run it
|
||||
|
||||
To compile for the web we use emscripten and you run it like that:
|
||||
|
||||
```sh
|
||||
zig build -Dtarget=wasm32-emscripten
|
||||
```
|
||||
|
||||
To run it we do:
|
||||
|
||||
```sh
|
||||
zig build run -Dtarget=wasm32-emscripten
|
||||
```
|
||||
|
||||
And to make a relase build we do:
|
||||
|
||||
```sh
|
||||
zig build -Dtarget=wasm32-emscripten -Doptimize=ReleaseFast
|
||||
```
|
||||
|
||||
If we want to use rgfw for the web build we could do:
|
||||
|
||||
```sh
|
||||
zig build -Dplatform=rgfw -Dtarget=wasm32-emscripten -Doptimize=ReleaseFast
|
||||
```
|
||||
|
||||
## Compiling the Zig code? Just add `-Dzig` and try out zig ;)
|
||||
|
||||
## More Resources
|
||||
|
||||
See [Zig Build System](https://ziglang.org/learn/build-system/)
|
||||
87
projects/Zig/build.zig
Normal file
87
projects/Zig/build.zig
Normal file
@ -0,0 +1,87 @@
|
||||
const std = @import("std");
|
||||
const rl = @import("raylib");
|
||||
|
||||
pub fn build(b: *std.Build) !void {
|
||||
const target = b.standardTargetOptions(.{});
|
||||
const optimize = b.standardOptimizeOption(.{});
|
||||
const platform = b.option(rl.PlatformBackend, "platform", "select the platform") orelse rl.PlatformBackend.glfw;
|
||||
const zig = b.option(bool, "zig", "compile zig code") orelse false;
|
||||
|
||||
const raylib_dep = b.dependency("raylib", .{
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
.platform = platform,
|
||||
});
|
||||
const raylib_artifact = raylib_dep.artifact("raylib");
|
||||
|
||||
if (platform == .sdl3) {
|
||||
if (b.lazyDependency("sdl3", .{ .optimize = optimize, .target = target })) |dep| {
|
||||
raylib_artifact.root_module.linkLibrary(dep.artifact("SDL3"));
|
||||
}
|
||||
}
|
||||
|
||||
var exe_mod: *std.Build.Module = undefined;
|
||||
|
||||
if (zig) {
|
||||
exe_mod = b.createModule(.{
|
||||
.root_source_file = b.path("src/core_basic_window.zig"),
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
});
|
||||
exe_mod.addImport("raylib", raylib_dep.module("raylib"));
|
||||
} else {
|
||||
exe_mod = b.createModule(.{
|
||||
.target = target,
|
||||
.optimize = optimize,
|
||||
.link_libc = true,
|
||||
});
|
||||
exe_mod.addCSourceFile(.{ .file = b.path("src/core_basic_window.c") });
|
||||
exe_mod.linkLibrary(raylib_artifact);
|
||||
}
|
||||
|
||||
const run_step = b.step("run", "Run the app");
|
||||
|
||||
// web exports are completely separate
|
||||
if (target.query.os_tag == .emscripten) {
|
||||
const emsdk = rl.emsdk;
|
||||
const wasm = b.addLibrary(.{
|
||||
.name = "core_basic_window_web",
|
||||
.root_module = exe_mod,
|
||||
});
|
||||
|
||||
const install_dir: std.Build.InstallDir = .{ .custom = "web" };
|
||||
const emcc_flags = emsdk.emccDefaultFlags(b.allocator, .{ .optimize = optimize });
|
||||
const emcc_settings = emsdk.emccDefaultSettings(b.allocator, .{ .optimize = optimize });
|
||||
|
||||
const emcc_step = emsdk.emccStep(b, raylib_artifact, wasm, .{
|
||||
.optimize = optimize,
|
||||
.flags = emcc_flags,
|
||||
.settings = emcc_settings,
|
||||
.shell_file_path = emsdk.shell(raylib_dep),
|
||||
.install_dir = install_dir,
|
||||
});
|
||||
b.getInstallStep().dependOn(emcc_step);
|
||||
|
||||
const html_filename = try std.fmt.allocPrint(b.allocator, "{s}.html", .{wasm.name});
|
||||
const emrun_step = emsdk.emrunStep(
|
||||
b,
|
||||
b.getInstallPath(install_dir, html_filename),
|
||||
&.{},
|
||||
);
|
||||
|
||||
emrun_step.dependOn(emcc_step);
|
||||
run_step.dependOn(emrun_step);
|
||||
} else {
|
||||
const exe = b.addExecutable(.{
|
||||
.name = "core_basic_window",
|
||||
.root_module = exe_mod,
|
||||
.use_lld = target.result.os.tag == .windows,
|
||||
});
|
||||
b.installArtifact(exe);
|
||||
|
||||
const run_cmd = b.addRunArtifact(exe);
|
||||
run_cmd.step.dependOn(b.getInstallStep());
|
||||
|
||||
run_step.dependOn(&run_cmd.step);
|
||||
}
|
||||
}
|
||||
23
projects/Zig/build.zig.zon
Normal file
23
projects/Zig/build.zig.zon
Normal file
@ -0,0 +1,23 @@
|
||||
.{
|
||||
.name = .example,
|
||||
.version = "0.0.1",
|
||||
.minimum_zig_version = "0.16.0",
|
||||
.paths = .{""},
|
||||
|
||||
.dependencies = .{
|
||||
.raylib = .{
|
||||
.path = "../../",
|
||||
},
|
||||
.emsdk = .{
|
||||
.url = "git+https://github.com/emscripten-core/emsdk?ref=4.0.9#3bcf1dcd01f040f370e10fe673a092d9ed79ebb5",
|
||||
.hash = "N-V-__8AAJl1DwBezhYo_VE6f53mPVm00R-Fk28NPW7P14EQ",
|
||||
},
|
||||
.sdl3 = .{
|
||||
.url = "git+https://codeberg.org/7Games/zig-sdl3?ref=master#6d418ef3ddae99098414a96a88bf5e5fdb41785e",
|
||||
.hash = "sdl3-0.1.9-NmT1QwiEJwByePqkmArtppCHQn8Y7kiSWcncT_Mop8ie",
|
||||
.lazy = true,
|
||||
},
|
||||
},
|
||||
|
||||
.fingerprint = 0x6eec9b9f1a9d7aca,
|
||||
}
|
||||
83
projects/Zig/src/core_basic_window.c
Normal file
83
projects/Zig/src/core_basic_window.c
Normal file
@ -0,0 +1,83 @@
|
||||
/*******************************************************************************************
|
||||
*
|
||||
* raylib [core] example - Basic window (adapted for HTML5 platform)
|
||||
*
|
||||
* This example is prepared to compile for PLATFORM_WEB and PLATFORM_DESKTOP
|
||||
* As you will notice, code structure is slightly different to the other examples...
|
||||
* To compile it for PLATFORM_WEB just uncomment #define PLATFORM_WEB at beginning
|
||||
*
|
||||
* This example has been created using raylib 1.3 (www.raylib.com)
|
||||
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
||||
*
|
||||
* Copyright (c) 2015 Ramon Santamaria (@raysan5)
|
||||
*
|
||||
********************************************************************************************/
|
||||
|
||||
#include "raylib.h"
|
||||
|
||||
#if defined(PLATFORM_WEB)
|
||||
#include <emscripten/emscripten.h>
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Global Variables Definition
|
||||
//----------------------------------------------------------------------------------
|
||||
int screenWidth = 800;
|
||||
int screenHeight = 450;
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Module Functions Declaration
|
||||
//----------------------------------------------------------------------------------
|
||||
void UpdateDrawFrame(void); // Update and Draw one frame
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Program main entry point
|
||||
//----------------------------------------------------------------------------------
|
||||
int main()
|
||||
{
|
||||
// Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window");
|
||||
|
||||
#if defined(PLATFORM_WEB)
|
||||
emscripten_set_main_loop(UpdateDrawFrame, 0, 1);
|
||||
#else
|
||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
// Main game loop
|
||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||
{
|
||||
UpdateDrawFrame();
|
||||
}
|
||||
#endif
|
||||
|
||||
// De-Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
CloseWindow(); // Close window and OpenGL context
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Module Functions Definition
|
||||
//----------------------------------------------------------------------------------
|
||||
void UpdateDrawFrame(void)
|
||||
{
|
||||
// Update
|
||||
//----------------------------------------------------------------------------------
|
||||
// TODO: Update your variables here
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
|
||||
ClearBackground(RAYWHITE);
|
||||
|
||||
DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY);
|
||||
|
||||
EndDrawing();
|
||||
//----------------------------------------------------------------------------------
|
||||
}
|
||||
73
projects/Zig/src/core_basic_window.zig
Normal file
73
projects/Zig/src/core_basic_window.zig
Normal file
@ -0,0 +1,73 @@
|
||||
//*******************************************************************************************
|
||||
//*
|
||||
//* raylib [core] example - Basic window (adapted for HTML5 platform)
|
||||
//*
|
||||
//* This example is prepared to compile for PLATFORM_WEB and PLATFORM_DESKTOP
|
||||
//* As you will notice, code structure is slightly different to the other examples...
|
||||
//* To compile it for PLATFORM_WEB just uncomment #define PLATFORM_WEB at beginning
|
||||
//*
|
||||
//* This example has been created using raylib 6.0 (www.raylib.com)
|
||||
//* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
||||
//*
|
||||
//* Copyright (c) 2015 Ramon Santamaria (@raysan5)
|
||||
//* Rewrite in Zig by HaxSam (@haxsam)
|
||||
//*
|
||||
//*******************************************************************************************
|
||||
|
||||
const rl = @import("raylib");
|
||||
const std = @import("std");
|
||||
const builtin = @import("builtin");
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Global Variables Definition
|
||||
//----------------------------------------------------------------------------------
|
||||
const screenWidth: c_int = 800;
|
||||
const screenHeight: c_int = 450;
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Program main entry point
|
||||
//----------------------------------------------------------------------------------
|
||||
pub fn main() void {
|
||||
// Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
rl.InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window");
|
||||
|
||||
if (builtin.os.tag == .emscripten) {
|
||||
std.os.emscripten.emscripten_set_main_loop(UpdateDrawFrame, 0, 1);
|
||||
} else {
|
||||
rl.SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
// Main game loop
|
||||
while (!rl.WindowShouldClose()) // Detect window close button or ESC key
|
||||
{
|
||||
UpdateDrawFrame();
|
||||
}
|
||||
}
|
||||
|
||||
// De-Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
rl.CloseWindow(); // Close window and OpenGL context
|
||||
//--------------------------------------------------------------------------------------
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Module Functions Definition
|
||||
//----------------------------------------------------------------------------------
|
||||
fn UpdateDrawFrame() callconv(.c) void {
|
||||
// Update
|
||||
//----------------------------------------------------------------------------------
|
||||
// TODO: Update your variables here
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
rl.BeginDrawing();
|
||||
|
||||
rl.ClearBackground(rl.RAYWHITE);
|
||||
|
||||
rl.DrawText("Congrats! You created your first window!", 190, 200, 20, rl.LIGHTGRAY);
|
||||
|
||||
rl.EndDrawing();
|
||||
//----------------------------------------------------------------------------------
|
||||
}
|
||||
@ -26,13 +26,13 @@ REM Checks if cl is available and skips to the argument loop if it is
|
||||
REM (Prevents calling vcvarsall every time you run this script)
|
||||
WHERE cl >nul 2>nul
|
||||
IF %ERRORLEVEL% == 0 goto READ_ARGS
|
||||
|
||||
REM Activate the msvc build environment if cl isn't available yet
|
||||
IF EXIST "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" (
|
||||
set VC_INIT="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
) ELSE IF EXIST "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" (
|
||||
set VC_INIT="C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
) ELSE IF EXIST "C:\Program Files (x86)\Microsoft Visual C++ Build Tools\vcbuildtools.bat" (
|
||||
set VC_INIT="C:\Program Files (x86)\Microsoft Visual C++ Build Tools\vcbuildtools.bat"
|
||||
for /f "tokens=*" %%i in (
|
||||
'"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath 2^>nul'
|
||||
) do set VS_PATH=%%i
|
||||
IF defined VS_PATH (
|
||||
set VC_INIT="%VS_PATH%\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
) ELSE (
|
||||
REM Initialize your vc environment here if the defaults don't work
|
||||
REM set VC_INIT="C:\your\path\here\vcvarsall.bat"
|
||||
@ -167,7 +167,7 @@ IF NOT EXIST !TEMP_DIR!\ (
|
||||
cd !TEMP_DIR!
|
||||
REM raylib source folder
|
||||
set "RAYLIB_DEFINES=/D_DEFAULT_SOURCE /DPLATFORM_DESKTOP /DGRAPHICS_API_OPENGL_33"
|
||||
set RAYLIB_C_FILES="!RAYLIB_SRC!\rcore.c" "!RAYLIB_SRC!\rshapes.c" "!RAYLIB_SRC!\rtextures.c" "!RAYLIB_SRC!\rtext.c" "!RAYLIB_SRC!\rmodels.c" "!RAYLIB_SRC!\utils.c" "!RAYLIB_SRC!\raudio.c" "!RAYLIB_SRC!\rglfw.c"
|
||||
set RAYLIB_C_FILES="!RAYLIB_SRC!\rcore.c" "!RAYLIB_SRC!\rshapes.c" "!RAYLIB_SRC!\rtextures.c" "!RAYLIB_SRC!\rtext.c" "!RAYLIB_SRC!\rmodels.c" "!RAYLIB_SRC!\raudio.c" "!RAYLIB_SRC!\rglfw.c"
|
||||
set RAYLIB_INCLUDE_FLAGS=/I"!RAYLIB_SRC!" /I"!RAYLIB_SRC!\external\glfw\include"
|
||||
|
||||
IF DEFINED REALLY_QUIET (
|
||||
|
||||
11
src/Makefile
11
src/Makefile
@ -275,11 +275,20 @@ ifeq ($(TARGET_PLATFORM),PLATFORM_DRM)
|
||||
GRAPHICS ?= GRAPHICS_API_OPENGL_ES2
|
||||
#GRAPHICS = GRAPHICS_API_OPENGL_SOFTWARE # Uncomment to use software rendering
|
||||
endif
|
||||
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW))
|
||||
ifeq ($(TARGET_PLATFORM),PLATFORM_WEB)
|
||||
# On HTML5 OpenGL ES 2.0 is used, emscripten translates it to WebGL 1.0
|
||||
GRAPHICS ?= GRAPHICS_API_OPENGL_ES2
|
||||
#GRAPHICS = GRAPHICS_API_OPENGL_ES3
|
||||
endif
|
||||
ifeq ($(TARGET_PLATFORM),PLATFORM_WEB_RGFW)
|
||||
# On HTML5 OpenGL ES 2.0 is used, emscripten translates it to WebGL 1.0
|
||||
GRAPHICS ?= GRAPHICS_API_OPENGL_ES2
|
||||
#GRAPHICS = GRAPHICS_API_OPENGL_ES3
|
||||
|
||||
ifeq ($(GRAPHICS),GRAPHICS_API_OPENGL_SOFTWARE)
|
||||
$(error WEB_RGFW: Software rendering not supported!)
|
||||
endif
|
||||
endif
|
||||
ifeq ($(TARGET_PLATFORM),PLATFORM_ANDROID)
|
||||
# By default use OpenGL ES 2.0 on Android
|
||||
GRAPHICS ?= GRAPHICS_API_OPENGL_ES2
|
||||
|
||||
@ -252,7 +252,7 @@
|
||||
#ifndef SUPPORT_FILEFORMAT_PIC
|
||||
#define SUPPORT_FILEFORMAT_PIC 0 // Disabled by default
|
||||
#endif
|
||||
#ifdef SUPPORT_FILEFORMAT_PNM
|
||||
#ifndef SUPPORT_FILEFORMAT_PNM
|
||||
#define SUPPORT_FILEFORMAT_PNM 0 // Disabled by default
|
||||
#endif
|
||||
#ifndef SUPPORT_FILEFORMAT_KTX
|
||||
|
||||
@ -177,6 +177,13 @@ typedef struct {
|
||||
RGFW_window *window; // Native display device (physical screen connection)
|
||||
RGFW_monitor *monitor;
|
||||
mg_gamepads minigamepad;
|
||||
|
||||
#if defined(GRAPHICS_API_OPENGL_SOFTWARE)
|
||||
RGFW_surface *surface;
|
||||
u8 *surfacePixels;
|
||||
i32 surfaceWidth;
|
||||
i32 surfaceHeight;
|
||||
#endif
|
||||
} PlatformData;
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
@ -1121,7 +1128,35 @@ void DisableCursor(void)
|
||||
// Swap back buffer with front buffer (screen drawing)
|
||||
void SwapScreenBuffer(void)
|
||||
{
|
||||
RGFW_window_swapBuffers_OpenGL(platform.window);
|
||||
#if defined(GRAPHICS_API_OPENGL_SOFTWARE)
|
||||
{
|
||||
if (platform.surface)
|
||||
{
|
||||
// copy rlsw pixel data to the surface framebuffer
|
||||
swReadPixels(0, 0, platform.surfaceWidth, platform.surfaceHeight, SW_RGBA, SW_UNSIGNED_BYTE, platform.surfacePixels);
|
||||
|
||||
// Mac wants a different pixel order. I cant seem to get this to work any other way
|
||||
#if defined(__APPLE__)
|
||||
unsigned char temp = 0;
|
||||
unsigned char *p = NULL;
|
||||
for (int i = 0; i < (platform.surfaceWidth * platform.surfaceHeight); i += 1)
|
||||
{
|
||||
p = platform.surfacePixels + (i * 4);
|
||||
temp = p[0];
|
||||
p[0] = p[2];
|
||||
p[2] = temp;
|
||||
}
|
||||
#endif
|
||||
|
||||
// blit surface to the window
|
||||
RGFW_window_blitSurface(platform.window, platform.surface);
|
||||
}
|
||||
}
|
||||
#else
|
||||
{
|
||||
RGFW_window_swapBuffers_OpenGL(platform.window);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
@ -1131,7 +1166,9 @@ void SwapScreenBuffer(void)
|
||||
// Get elapsed time measure in seconds since InitTimer()
|
||||
double GetTime(void)
|
||||
{
|
||||
double time = get_time_seconds() - CORE.Time.base;
|
||||
// CORE.Time.base is nanoseconds as integer
|
||||
double baseTime = (double)CORE.Time.base*1e-9;
|
||||
double time = get_time_seconds() - baseTime;
|
||||
|
||||
return time;
|
||||
}
|
||||
@ -1313,6 +1350,9 @@ void PollInputEvents(void)
|
||||
// Window events are also polled (Minimized, maximized, close...)
|
||||
case RGFW_windowResized:
|
||||
{
|
||||
// set flag that the window was resized
|
||||
CORE.Window.resizedLastFrame = true;
|
||||
|
||||
#if defined(__APPLE__)
|
||||
if (FLAG_IS_SET(CORE.Window.flags, FLAG_WINDOW_HIGHDPI))
|
||||
{
|
||||
@ -1361,7 +1401,42 @@ void PollInputEvents(void)
|
||||
CORE.Window.currentFbo.width = CORE.Window.screen.width;
|
||||
CORE.Window.currentFbo.height = CORE.Window.screen.height;
|
||||
#endif
|
||||
CORE.Window.resizedLastFrame = true;
|
||||
|
||||
#if defined(GRAPHICS_API_OPENGL_SOFTWARE)
|
||||
#if defined(__APPLE__)
|
||||
RGFW_monitor* currentMonitor = RGFW_window_getMonitor(platform.window);
|
||||
CORE.Window.screenScale = MatrixScale(currentMonitor->pixelRatio, currentMonitor->pixelRatio, 1.0f);
|
||||
SetupViewport(platform.window->w * currentMonitor->pixelRatio, platform.window->h * currentMonitor->pixelRatio);
|
||||
|
||||
CORE.Window.render.width = CORE.Window.screen.width * currentMonitor->pixelRatio;
|
||||
CORE.Window.render.height = CORE.Window.screen.height * currentMonitor->pixelRatio;
|
||||
CORE.Window.currentFbo.width = CORE.Window.render.width;
|
||||
CORE.Window.currentFbo.height = CORE.Window.render.height;
|
||||
#endif
|
||||
platform.surfaceWidth = CORE.Window.currentFbo.width;
|
||||
platform.surfaceHeight = CORE.Window.currentFbo.height;
|
||||
|
||||
// in software mode we dont have the viewport so we need to reverse the highdpi changes
|
||||
if (FLAG_IS_SET(CORE.Window.flags, FLAG_WINDOW_HIGHDPI))
|
||||
{
|
||||
Vector2 scaleDpi = GetWindowScaleDPI();
|
||||
platform.surfaceWidth *= scaleDpi.x;
|
||||
platform.surfaceHeight *= scaleDpi.y;
|
||||
}
|
||||
|
||||
if (platform.surfacePixels != NULL)
|
||||
{
|
||||
RL_FREE(platform.surfacePixels);
|
||||
platform.surfacePixels = RL_MALLOC(platform.surfaceWidth * platform.surfaceHeight * 4);
|
||||
}
|
||||
|
||||
if (platform.surface != NULL)
|
||||
{
|
||||
RGFW_surface_free(platform.surface);
|
||||
platform.surface = RGFW_window_createSurface(platform.window, platform.surfacePixels, platform.surfaceWidth, platform.surfaceHeight, RGFW_formatBGRA8);
|
||||
swResize(platform.surfaceWidth, platform.surfaceHeight);
|
||||
}
|
||||
#endif
|
||||
} break;
|
||||
case RGFW_windowMaximized:
|
||||
{
|
||||
@ -1639,6 +1714,12 @@ int InitPlatform(void)
|
||||
hints->major = 4;
|
||||
hints->minor = 3;
|
||||
}
|
||||
else if (rlGetVersion() == RL_OPENGL_SOFTWARE)
|
||||
{
|
||||
hints->major = 1;
|
||||
hints->minor = 1;
|
||||
hints->renderer = RGFW_glSoftware;
|
||||
}
|
||||
|
||||
if (FLAG_IS_SET(CORE.Window.flags, FLAG_MSAA_4X_HINT)) hints->samples = 4;
|
||||
|
||||
@ -1654,7 +1735,6 @@ int InitPlatform(void)
|
||||
|
||||
RGFW_setGlobalHints_OpenGL(hints);
|
||||
platform.window = RGFW_createWindow((CORE.Window.title != 0)? CORE.Window.title : " ", 0, 0, CORE.Window.screen.width, CORE.Window.screen.height, flags | RGFW_windowOpenGL);
|
||||
CORE.Time.base = get_time_seconds();
|
||||
|
||||
#ifndef PLATFORM_WEB_RGFW
|
||||
i32 screenSizeWidth;
|
||||
@ -1719,6 +1799,39 @@ int InitPlatform(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(GRAPHICS_API_OPENGL_SOFTWARE)
|
||||
// apple always scales for retina
|
||||
#if defined(__APPLE__)
|
||||
RGFW_monitor* currentMonitor = RGFW_window_getMonitor(platform.window);
|
||||
CORE.Window.screenScale = MatrixScale(currentMonitor->pixelRatio, currentMonitor->pixelRatio, 1.0f);
|
||||
|
||||
CORE.Window.render.width = CORE.Window.screen.width * currentMonitor->pixelRatio;
|
||||
CORE.Window.render.height = CORE.Window.screen.height * currentMonitor->pixelRatio;
|
||||
CORE.Window.currentFbo.width = CORE.Window.render.width;
|
||||
CORE.Window.currentFbo.height = CORE.Window.render.height;
|
||||
#endif
|
||||
|
||||
platform.surfaceWidth = CORE.Window.currentFbo.width;
|
||||
platform.surfaceHeight = CORE.Window.currentFbo.height;
|
||||
|
||||
platform.surfacePixels = RL_MALLOC(platform.surfaceWidth * platform.surfaceHeight * 4);
|
||||
if (platform.surfacePixels == NULL)
|
||||
{
|
||||
TRACELOG(LOG_FATAL, "PLATFORM: Failed to initialize software pixel buffer");
|
||||
return -1;
|
||||
}
|
||||
|
||||
platform.surface = RGFW_window_createSurface(platform.window, platform.surfacePixels, platform.surfaceWidth, platform.surfaceHeight, RGFW_formatBGRA8);
|
||||
|
||||
if (platform.surface == NULL)
|
||||
{
|
||||
RL_FREE(platform.surfacePixels);
|
||||
|
||||
TRACELOG(LOG_FATAL, "PLATFORM: Failed to initialize software surface");
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
TRACELOG(LOG_INFO, "DISPLAY: Device initialized successfully %s",
|
||||
FLAG_IS_SET(CORE.Window.flags, FLAG_WINDOW_HIGHDPI)? "(HighDPI)" : "");
|
||||
TRACELOG(LOG_INFO, " > Display size: %i x %i", CORE.Window.display.width, CORE.Window.display.height);
|
||||
@ -1749,20 +1862,63 @@ int InitPlatform(void)
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
#if defined(RGFW_WAYLAND)
|
||||
if (RGFW_usingWayland()) TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - Wayland): Initialized successfully");
|
||||
else TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - X11 (fallback)): Initialized successfully");
|
||||
if (rlGetVersion() == RL_OPENGL_SOFTWARE)
|
||||
{
|
||||
if (RGFW_usingWayland()) TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - Wayland, Software): Initialized successfully");
|
||||
else TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - X11, Software (fallback)): Initialized successfully");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (RGFW_usingWayland()) TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - Wayland): Initialized successfully");
|
||||
else TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - X11 (fallback)): Initialized successfully");
|
||||
}
|
||||
#elif defined(RGFW_X11)
|
||||
#if defined(__APPLE__)
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - X11 (MacOS)): Initialized successfully");
|
||||
if (rlGetVersion() == RL_OPENGL_SOFTWARE)
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - X11, Software, (MacOS)): Initialized successfully");
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - X11, (MacOS)): Initialized successfully");
|
||||
}
|
||||
#else
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - X11): Initialized successfully");
|
||||
if (rlGetVersion() == RL_OPENGL_SOFTWARE)
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - X11, Software): Initialized successfully");
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - X11): Initialized successfully");
|
||||
}
|
||||
#endif
|
||||
#elif defined (RGFW_WINDOWS)
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - Win32): Initialized successfully");
|
||||
if (rlGetVersion() == RL_OPENGL_SOFTWARE)
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - Win32, Software): Initialized successfully");
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - Win32): Initialized successfully");
|
||||
}
|
||||
#elif defined(RGFW_WASM)
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - WASMs): Initialized successfully");
|
||||
if (rlGetVersion() == RL_OPENGL_SOFTWARE)
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - WASMs, Software): Initialized successfully");
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - WASMs): Initialized successfully");
|
||||
}
|
||||
#elif defined(RGFW_MACOS)
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - MacOS): Initialized successfully");
|
||||
if (rlGetVersion() == RL_OPENGL_SOFTWARE)
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - MacOS, Software): Initialized successfully");
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (RGFW - MacOS): Initialized successfully");
|
||||
}
|
||||
#endif
|
||||
|
||||
mg_gamepads_init(&platform.minigamepad);
|
||||
@ -1775,6 +1931,18 @@ void ClosePlatform(void)
|
||||
{
|
||||
mg_gamepads_free(&platform.minigamepad);
|
||||
RGFW_window_close(platform.window);
|
||||
|
||||
#if defined(GRAPHICS_API_OPENGL_SOFTWARE)
|
||||
if (platform.surfacePixels != NULL)
|
||||
{
|
||||
RL_FREE(platform.surfacePixels);
|
||||
}
|
||||
|
||||
if (platform.surface != NULL)
|
||||
{
|
||||
RGFW_surface_free(platform.surface);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Keycode mapping
|
||||
@ -1792,34 +1960,36 @@ double get_time_seconds(void)
|
||||
|
||||
#if defined(_WIN32)
|
||||
static LARGE_INTEGER freq = { 0 };
|
||||
static int freq_init = 0;
|
||||
LARGE_INTEGER counter;
|
||||
if (!freq_init) {
|
||||
static bool freqInitialized = false;
|
||||
LARGE_INTEGER counter = { 0 };
|
||||
if (!freqInitialized)
|
||||
{
|
||||
// Lazy initialization
|
||||
QueryPerformanceFrequency(&freq);
|
||||
freq_init = 1;
|
||||
freqInitialized = true;
|
||||
}
|
||||
QueryPerformanceCounter(&counter);
|
||||
currentTime = (double)counter.QuadPart / (double)freq.QuadPart;
|
||||
currentTime = (double)counter.QuadPart/(double)freq.QuadPart;
|
||||
#elif defined(__EMSCRIPTEN__)
|
||||
currentTime = emscripten_get_now() / 1000.0;
|
||||
currentTime = emscripten_get_now()/1000.0;
|
||||
#elif defined(__APPLE__)
|
||||
static mach_timebase_info_data_t tb;
|
||||
static int tb_initialized = 0;
|
||||
|
||||
if (!tb_initialized) {
|
||||
static mach_timebase_info_data_t tb = { 0 };
|
||||
static bool tbInitialized = false;
|
||||
if (!tbInitialized)
|
||||
{
|
||||
mach_timebase_info(&tb);
|
||||
tb_initialized = 1;
|
||||
tbInitialized = true;
|
||||
}
|
||||
uint64_t ticks = mach_absolute_time();
|
||||
|
||||
currentTime = (double)ticks * (double)tb.numer / (double)tb.denom / 1e9;
|
||||
currentTime = (double)ticks*(double)tb.numer/(double)tb.denom/1e9;
|
||||
#elif defined(__linux__)
|
||||
struct timespec ts;
|
||||
struct timespec ts = { 0 };
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
currentTime = (double)ts.tv_sec + (double)ts.tv_nsec / 1e9;
|
||||
currentTime = (double)ts.tv_sec + (double)ts.tv_nsec/1e9;
|
||||
#else
|
||||
// fallback to cstd
|
||||
currentTime = (double)clock() / (double)CLOCKS_PER_SEC;
|
||||
// Fallback to cstd
|
||||
currentTime = (double)clock()/(double)CLOCKS_PER_SEC;
|
||||
#endif
|
||||
|
||||
return currentTime;
|
||||
|
||||
@ -1426,7 +1426,7 @@ int InitPlatform(void)
|
||||
if (eglGetPlatformDisplayEXT != NULL) platform.device = eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_KHR, platform.gbmDevice, NULL);
|
||||
}
|
||||
|
||||
// In case extension not found or display could not be retrieved, try useing legacy version
|
||||
// In case extension not found or display could not be retrieved, try using legacy version
|
||||
if (platform.device == EGL_NO_DISPLAY) platform.device = eglGetDisplay((EGLNativeDisplayType)platform.gbmDevice);
|
||||
#endif
|
||||
if (platform.device == EGL_NO_DISPLAY)
|
||||
|
||||
@ -1702,8 +1702,7 @@ Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data,
|
||||
|
||||
// Copy data to allocated memory for default UnloadMusicStream
|
||||
unsigned char *newData = (unsigned char *)RL_MALLOC(dataSize);
|
||||
int it = dataSize/sizeof(unsigned char);
|
||||
for (int i = 0; i < it; i++) newData[i] = data[i];
|
||||
for (int i = 0; i < dataSize; i++) newData[i] = data[i];
|
||||
|
||||
// Memory loaded version for jar_mod_load_file()
|
||||
if (dataSize && (dataSize < 32*1024*1024))
|
||||
|
||||
@ -2505,19 +2505,14 @@ RMAPI Quaternion QuaternionFromAxisAngle(Vector3 axis, float angle)
|
||||
{
|
||||
Quaternion result = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||
|
||||
float axisLength = sqrtf(axis.x*axis.x + axis.y*axis.y + axis.z*axis.z);
|
||||
float length = sqrtf(axis.x*axis.x + axis.y*axis.y + axis.z*axis.z);
|
||||
|
||||
if (axisLength != 0.0f)
|
||||
if (length != 0.0f)
|
||||
{
|
||||
angle *= 0.5f;
|
||||
|
||||
float length = 0.0f;
|
||||
float ilength = 0.0f;
|
||||
|
||||
// Vector3Normalize(axis)
|
||||
length = axisLength;
|
||||
if (length == 0.0f) length = 1.0f;
|
||||
ilength = 1.0f/length;
|
||||
float ilength = 1.0f/length;
|
||||
axis.x *= ilength;
|
||||
axis.y *= ilength;
|
||||
axis.z *= ilength;
|
||||
|
||||
20
src/rcore.c
20
src/rcore.c
@ -379,14 +379,14 @@ typedef struct CoreData {
|
||||
} Gamepad;
|
||||
} Input;
|
||||
struct {
|
||||
double current; // Current time measure
|
||||
double previous; // Previous time measure
|
||||
double update; // Time measure for frame update
|
||||
double draw; // Time measure for frame draw
|
||||
double frame; // Time measure for one frame
|
||||
double target; // Desired time for one frame, if 0 not applied
|
||||
unsigned long long int base; // Base time measure for hi-res timer (PLATFORM_ANDROID, PLATFORM_DRM)
|
||||
unsigned int frameCounter; // Frame counter
|
||||
double current; // Current time measure (seconds)
|
||||
double previous; // Previous time measure (seconds)
|
||||
double update; // Time measure for frame update (seconds)
|
||||
double draw; // Time measure for frame draw (seconds)
|
||||
double frame; // Time measure for one frame (seconds)
|
||||
double target; // Desired time for one frame, if 0 not applied (seconds)
|
||||
unsigned long long int base; // Base time measure for hi-res timer (ticks or nanoseconds)
|
||||
unsigned int frameCounter; // Frame counter (frames)
|
||||
|
||||
} Time;
|
||||
} CoreData;
|
||||
@ -4125,8 +4125,8 @@ Vector2 GetMouseDelta(void)
|
||||
{
|
||||
Vector2 delta = { 0 };
|
||||
|
||||
delta.x = CORE.Input.Mouse.currentPosition.x - CORE.Input.Mouse.previousPosition.x;
|
||||
delta.y = CORE.Input.Mouse.currentPosition.y - CORE.Input.Mouse.previousPosition.y;
|
||||
delta.x = (CORE.Input.Mouse.currentPosition.x - CORE.Input.Mouse.previousPosition.x)*CORE.Input.Mouse.scale.x;
|
||||
delta.y = (CORE.Input.Mouse.currentPosition.y - CORE.Input.Mouse.previousPosition.y)*CORE.Input.Mouse.scale.y;
|
||||
|
||||
return delta;
|
||||
}
|
||||
|
||||
@ -1139,21 +1139,23 @@ typedef struct rlglData {
|
||||
//----------------------------------------------------------------------------------
|
||||
// Global Variables Definition
|
||||
//----------------------------------------------------------------------------------
|
||||
static bool isGpuReady = false;
|
||||
static double rlCullDistanceNear = RL_CULL_DISTANCE_NEAR;
|
||||
static double rlCullDistanceFar = RL_CULL_DISTANCE_FAR;
|
||||
|
||||
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
||||
static rlglData RLGL = { 0 };
|
||||
#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
|
||||
static bool isGpuReady = false;
|
||||
#endif
|
||||
|
||||
#if defined(GRAPHICS_API_OPENGL_ES2) && !defined(GRAPHICS_API_OPENGL_ES3)
|
||||
// VAO functions entry points
|
||||
// NOTE: VAO functionality is exposed through extensions (OES)
|
||||
static PFNGLGENVERTEXARRAYSOESPROC glGenVertexArrays = NULL;
|
||||
static PFNGLBINDVERTEXARRAYOESPROC glBindVertexArray = NULL;
|
||||
static PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArrays = NULL;
|
||||
|
||||
// NOTE: Instancing functionality could also be available through extension
|
||||
// Instancing functionality entry points
|
||||
// NOTE: Instancing functionality could be available through extensions
|
||||
static PFNGLDRAWARRAYSINSTANCEDEXTPROC glDrawArraysInstanced = NULL;
|
||||
static PFNGLDRAWELEMENTSINSTANCEDEXTPROC glDrawElementsInstanced = NULL;
|
||||
static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL;
|
||||
|
||||
@ -4105,7 +4105,7 @@ bool CheckCollisionSpheres(Vector3 center1, float radius1, Vector3 center2, floa
|
||||
|
||||
// Check for distances squared to avoid sqrtf()
|
||||
float radSum = radius1 + radius2;
|
||||
if (Vector3DistanceSqr(center1, center2) <= radSum*radSum) collision = true;
|
||||
if (Vector3DistanceSqr(center1, center2) <= (radSum*radSum)) collision = true;
|
||||
|
||||
return collision;
|
||||
}
|
||||
@ -4131,18 +4131,13 @@ bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius)
|
||||
{
|
||||
bool collision = false;
|
||||
|
||||
float dmin = 0;
|
||||
Vector3 closestPoint = {
|
||||
Clamp(center.x, box.min.x, box.max.x),
|
||||
Clamp(center.y, box.min.y, box.max.y),
|
||||
Clamp(center.z, box.min.z, box.max.z)
|
||||
};
|
||||
|
||||
if (center.x < box.min.x) dmin += powf(center.x - box.min.x, 2);
|
||||
else if (center.x > box.max.x) dmin += powf(center.x - box.max.x, 2);
|
||||
|
||||
if (center.y < box.min.y) dmin += powf(center.y - box.min.y, 2);
|
||||
else if (center.y > box.max.y) dmin += powf(center.y - box.max.y, 2);
|
||||
|
||||
if (center.z < box.min.z) dmin += powf(center.z - box.min.z, 2);
|
||||
else if (center.z > box.max.z) dmin += powf(center.z - box.max.z, 2);
|
||||
|
||||
if (dmin <= (radius*radius)) collision = true;
|
||||
if (Vector3DistanceSqr(center, closestPoint) <= (radius*radius)) collision = true;
|
||||
|
||||
return collision;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user