From 17cbc75aa710ed629560580e8105d637b3124653 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 30 Jun 2024 11:07:38 +0200 Subject: [PATCH] REVIEWED: Formatting, follow raylib coding conventions --- examples/examples.rc | 27 ++++ examples/raylib.ico | Bin 0 -> 9752 bytes src/platforms/rcore_android.c | 2 +- src/platforms/rcore_desktop_rgfw.c | 219 ++++++++++++++--------------- src/platforms/rcore_desktop_sdl.c | 3 +- src/platforms/rcore_drm.c | 13 +- src/raudio.c | 4 +- src/raylib.h | 2 +- src/raymath.h | 29 ++-- src/rmodels.c | 10 +- src/rshapes.c | 4 +- src/rtextures.c | 136 +++++++----------- 12 files changed, 221 insertions(+), 228 deletions(-) create mode 100644 examples/examples.rc create mode 100644 examples/raylib.ico diff --git a/examples/examples.rc b/examples/examples.rc new file mode 100644 index 000000000..4767ad480 --- /dev/null +++ b/examples/examples.rc @@ -0,0 +1,27 @@ +GLFW_ICON ICON "raylib.ico" + +1 VERSIONINFO +FILEVERSION 1,0,0,0 +PRODUCTVERSION 1,0,0,0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + //BLOCK "080904E4" // English UK + BLOCK "040904E4" // English US + BEGIN + VALUE "CompanyName", "raylib technologies" + VALUE "FileDescription", "raylib example" + VALUE "FileVersion", "1.0" + VALUE "InternalName", "raylib-example" + VALUE "LegalCopyright", "(c) 2024 raylib technologies (@raylibtech)" + //VALUE "OriginalFilename", "raylib_app.exe" + VALUE "ProductName", "raylib-example" + VALUE "ProductVersion", "1.0" + END + END + BLOCK "VarFileInfo" + BEGIN + //VALUE "Translation", 0x809, 1252 // English UK + VALUE "Translation", 0x409, 1252 // English US + END +END diff --git a/examples/raylib.ico b/examples/raylib.ico new file mode 100644 index 0000000000000000000000000000000000000000..0cedcc55cee7da0e5784256078a93f2901e5d734 GIT binary patch literal 9752 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 literal 0 HcmV?d00001 diff --git a/src/platforms/rcore_android.c b/src/platforms/rcore_android.c index d8568d929..dc8724d8f 100644 --- a/src/platforms/rcore_android.c +++ b/src/platforms/rcore_android.c @@ -660,7 +660,7 @@ void PollInputEvents(void) CORE.Input.Gamepad.previousButtonState[i][k] = CORE.Input.Gamepad.currentButtonState[i][k]; } } - + // Register previous touch states for (int i = 0; i < MAX_TOUCH_POINTS; i++) CORE.Input.Touch.previousTouchState[i] = CORE.Input.Touch.currentTouchState[i]; diff --git a/src/platforms/rcore_desktop_rgfw.c b/src/platforms/rcore_desktop_rgfw.c index e85f7a0eb..dbbbe10cc 100644 --- a/src/platforms/rcore_desktop_rgfw.c +++ b/src/platforms/rcore_desktop_rgfw.c @@ -104,9 +104,7 @@ __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int CodePage, // Types and Structures Definition //---------------------------------------------------------------------------------- typedef struct { - // TODO: Define the platform specific variables required - - RGFW_window* window; // Native display device (physical screen connection) + RGFW_window *window; // Native display device (physical screen connection) } PlatformData; //---------------------------------------------------------------------------------- @@ -114,9 +112,9 @@ typedef struct { //---------------------------------------------------------------------------------- extern CoreData CORE; // Global CORE state context -static PlatformData platform = { NULL }; // Platform specific +static PlatformData platform = { NULL }; // Platform specific -static const unsigned short RGFWKeyToRayKey[] = { +static const unsigned short keyMappingRGFW[] = { [RGFW_KEY_NULL] = KEY_NULL, [RGFW_Quote] = KEY_APOSTROPHE, [RGFW_Comma] = KEY_COMMA, @@ -157,7 +155,7 @@ static const unsigned short RGFWKeyToRayKey[] = { [RGFW_SuperL] = KEY_LEFT_SUPER, #ifndef RGFW_MACOS [RGFW_ShiftR] = KEY_RIGHT_SHIFT, - + [RGFW_AltR] = KEY_RIGHT_ALT, #endif [RGFW_Space] = KEY_SPACE, @@ -237,7 +235,7 @@ bool InitGraphicsDevice(void); // Initialize graphics device // Check if application should close bool WindowShouldClose(void) -{ +{ if (CORE.Window.shouldClose == false) CORE.Window.shouldClose = RGFW_window_shouldClose(platform.window); if (CORE.Window.ready) return CORE.Window.shouldClose; @@ -246,7 +244,7 @@ bool WindowShouldClose(void) // Toggle fullscreen mode void ToggleFullscreen(void) -{ +{ RGFW_window_maximize(platform.window); ToggleBorderlessWindowed(); } @@ -255,7 +253,7 @@ void ToggleFullscreen(void) void ToggleBorderlessWindowed(void) { CORE.Window.flags & FLAG_WINDOW_UNDECORATED; - + if (platform.window != NULL) TRACELOG(LOG_WARNING, "ToggleBorderlessWindowed() after window creation not available on target platform"); } @@ -430,33 +428,34 @@ void ClearWindowState(unsigned int flags) // Set icon for window void SetWindowIcon(Image image) { - i32 channels = 4; + i32 channels = 4; - switch (image.format) { + switch (image.format) + { case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: case PIXELFORMAT_UNCOMPRESSED_R16: // 16 bpp (1 channel - half float) case PIXELFORMAT_UNCOMPRESSED_R32: // 32 bpp (1 channel - float) + { channels = 1; - break; - + } break; case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: // 8*2 bpp (2 channels) case PIXELFORMAT_UNCOMPRESSED_R5G6B5: // 16 bpp case PIXELFORMAT_UNCOMPRESSED_R8G8B8: // 24 bpp case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: // 16 bpp (1 bit alpha) case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: // 16 bpp (4 bit alpha) case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: // 32 bpp + { channels = 2; - break; - + } break; case PIXELFORMAT_UNCOMPRESSED_R32G32B32: // 32*3 bpp (3 channels - float) case PIXELFORMAT_UNCOMPRESSED_R16G16B16: // 16*3 bpp (3 channels - half float) case PIXELFORMAT_COMPRESSED_DXT1_RGB: // 4 bpp (no alpha) case PIXELFORMAT_COMPRESSED_ETC1_RGB: // 4 bpp case PIXELFORMAT_COMPRESSED_ETC2_RGB: // 4 bpp case PIXELFORMAT_COMPRESSED_PVRT_RGB: // 4 bpp + { channels = 3; - break; - + } break; case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: // 32*4 bpp (4 channels - float) case PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: // 16*4 bpp (4 channels - half float) case PIXELFORMAT_COMPRESSED_DXT1_RGBA: // 4 bpp (1 bit alpha) @@ -465,10 +464,10 @@ void SetWindowIcon(Image image) case PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA: // 8 bpp case PIXELFORMAT_COMPRESSED_PVRT_RGBA: // 4 bpp case PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA: // 8 bpp - case PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: // 2 bpp + case PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA: // 2 bpp + { channels = 4; - break; - + } break; default: break; } @@ -537,65 +536,70 @@ void SetWindowFocused(void) // Get native window handle void *GetWindowHandle(void) { - #ifndef RGFW_WINDOWS - return (void*)platform.window->src.window; - #else +#ifndef RGFW_WINDOWS + return (void *)platform.window->src.window; +#else return platform.window->src.hwnd; - #endif +#endif } // Get number of monitors int GetMonitorCount(void) { - RGFW_monitor* mons = RGFW_getMonitors(); - size_t i; - for (i = 0; i < 6; i++) { + #define MAX_MONITORS_SUPPORTED 6 + + int count = MAX_MONITORS_SUPPORTED; + RGFW_monitor *mons = RGFW_getMonitors(); + + for (int i = 0; i < 6; i++) + { if (!mons[i].rect.x && !mons[i].rect.y && !mons[i].rect.w && mons[i].rect.h) - return i; + { + count = i; + break; + } } - return 6; + return count; } // Get number of monitors int GetCurrentMonitor(void) { - RGFW_monitor* mons = RGFW_getMonitors(); + int current = 0; + RGFW_monitor *mons = RGFW_getMonitors(); RGFW_monitor mon = RGFW_window_getMonitor(platform.window); - size_t i; - for (i = 0; i < 6; i++) { - if (mons[i].rect.x == mon.rect.x && - mons[i].rect.y == mon.rect.y) - return i; + for (int i = 0; i < 6; i++) + { + if ((mons[i].rect.x == mon.rect.x) && (mons[i].rect.y == mon.rect.y)) current = i; } - return 0; + return current; } // Get selected monitor position Vector2 GetMonitorPosition(int monitor) { - RGFW_monitor* mons = RGFW_getMonitors(); + RGFW_monitor *mons = RGFW_getMonitors(); - return (Vector2){mons[monitor].rect.x, mons[monitor].rect.y}; + return (Vector2){mons[monitor].rect.x, mons[monitor].rect.y}; } // Get selected monitor width (currently used by monitor) int GetMonitorWidth(int monitor) { - RGFW_monitor* mons = RGFW_getMonitors(); + RGFW_monitor *mons = RGFW_getMonitors(); - return mons[monitor].rect.w; + return mons[monitor].rect.w; } // Get selected monitor height (currently used by monitor) int GetMonitorHeight(int monitor) { - RGFW_monitor* mons = RGFW_getMonitors(); + RGFW_monitor *mons = RGFW_getMonitors(); - return mons[monitor].rect.h; - return 0; + return mons[monitor].rect.h; } // Get selected monitor physical width in millimetres @@ -603,15 +607,15 @@ int GetMonitorPhysicalWidth(int monitor) { RGFW_monitor* mons = RGFW_getMonitors(); - return mons[monitor].physW; + return mons[monitor].physW; } // Get selected monitor physical height in millimetres int GetMonitorPhysicalHeight(int monitor) { - RGFW_monitor* mons = RGFW_getMonitors(); + RGFW_monitor *mons = RGFW_getMonitors(); - return mons[monitor].physH; + return mons[monitor].physH; } // Get selected monitor refresh rate @@ -624,7 +628,7 @@ int GetMonitorRefreshRate(int monitor) // Get the human-readable, UTF-8 encoded name of the selected monitor const char *GetMonitorName(int monitor) { - RGFW_monitor* mons = RGFW_getMonitors(); + RGFW_monitor *mons = RGFW_getMonitors(); return mons[monitor].name; } @@ -640,7 +644,7 @@ Vector2 GetWindowScaleDPI(void) { RGFW_monitor monitor = RGFW_window_getMonitor(platform.window); - return (Vector2){((u32)monitor.scaleX) * platform.window->r.w, ((u32) monitor.scaleX) * platform.window->r.h}; + return (Vector2){((u32)monitor.scaleX)*platform.window->r.w, ((u32) monitor.scaleX)*platform.window->r.h}; } // Set clipboard text content @@ -757,7 +761,7 @@ void SetMouseCursor(int cursor) static KeyboardKey ConvertScancodeToKey(u32 keycode); // Register all input events -void PollInputEvents(void) +void PollInputEvents(void) { #if defined(SUPPORT_GESTURES_SYSTEM) // NOTE: Gestures update must be called every frame to reset gestures correctly @@ -774,7 +778,7 @@ void PollInputEvents(void) CORE.Input.Mouse.currentWheelMove.y = 0; // Register previous mouse position - + // Reset last gamepad button/axis registered state for (int i = 0; (i < 4) && (i < MAX_GAMEPADS); i++) @@ -808,7 +812,7 @@ void PollInputEvents(void) } // Register previous mouse states - for (int i = 0; i < MAX_MOUSE_BUTTONS; i++) + for (int i = 0; i < MAX_MOUSE_BUTTONS; i++) CORE.Input.Mouse.previousButtonState[i] = CORE.Input.Mouse.currentButtonState[i]; // Poll input events for current platform @@ -818,7 +822,7 @@ void PollInputEvents(void) #define RGFW_HOLD_MOUSE (1L<<2) #if defined(RGFW_X11) //|| defined(RGFW_MACOS) - if (platform.window->src.winArgs & RGFW_HOLD_MOUSE) + if (platform.window->src.winArgs & RGFW_HOLD_MOUSE) { CORE.Input.Mouse.previousPosition = (Vector2){ 0.0f, 0.0f }; CORE.Input.Mouse.currentPosition = (Vector2){ 0.0f, 0.0f }; @@ -831,7 +835,8 @@ void PollInputEvents(void) while (RGFW_window_checkEvent(platform.window)) { - if (platform.window->event.type >= RGFW_jsButtonPressed && platform.window->event.type <= RGFW_jsAxisMove) { + if ((platform.window->event.type >= RGFW_jsButtonPressed) && (platform.window->event.type <= RGFW_jsAxisMove)) + { if (!CORE.Input.Gamepad.ready[platform.window->event.joystick]) { CORE.Input.Gamepad.ready[platform.window->event.joystick] = true; @@ -848,11 +853,10 @@ void PollInputEvents(void) switch (event->type) { case RGFW_quit: CORE.Window.shouldClose = true; break; - case RGFW_dnd: // Dropped file { - size_t i; - for (i = 0; i < event->droppedFilesCount; i++) { + for (int i = 0; i < event->droppedFilesCount; i++) + { if (CORE.Window.dropFileCount == 0) { // When a new file is dropped, we reserve a fixed number of slots for all possible dropped files @@ -862,7 +866,7 @@ void PollInputEvents(void) CORE.Window.dropFilepaths[CORE.Window.dropFileCount] = (char *)RL_CALLOC(MAX_FILEPATH_LENGTH, sizeof(char)); strcpy(CORE.Window.dropFilepaths[CORE.Window.dropFileCount], event->droppedFiles[i]); - + CORE.Window.dropFileCount++; } else if (CORE.Window.dropFileCount < 1024) @@ -896,8 +900,9 @@ void PollInputEvents(void) case RGFW_keyPressed: { KeyboardKey key = ConvertScancodeToKey(event->keyCode); - - if (key != KEY_NULL) { + + if (key != KEY_NULL) + { // If key was up, add it to the key pressed queue if ((CORE.Input.Keyboard.currentKeyState[key] == 0) && (CORE.Input.Keyboard.keyPressedQueueCount < MAX_KEY_PRESSED_QUEUE)) { @@ -923,7 +928,6 @@ void PollInputEvents(void) CORE.Input.Keyboard.charPressedQueueCount++; } } break; - case RGFW_keyReleased: { KeyboardKey key = ConvertScancodeToKey(event->keyCode); @@ -933,7 +937,8 @@ void PollInputEvents(void) // Check mouse events case RGFW_mouseButtonPressed: { - if (event->button == RGFW_mouseScrollUp || event->button == RGFW_mouseScrollDown) { + if ((event->button == RGFW_mouseScrollUp) || (event->button == RGFW_mouseScrollDown)) + { CORE.Input.Mouse.currentWheelMove.y = event->scroll; break; } @@ -951,11 +956,12 @@ void PollInputEvents(void) case RGFW_mouseButtonReleased: { - if (event->button == RGFW_mouseScrollUp || event->button == RGFW_mouseScrollDown) { + if ((event->button == RGFW_mouseScrollUp) || (event->button == RGFW_mouseScrollDown)) + { CORE.Input.Mouse.currentWheelMove.y = event->scroll; break; } - + int btn = event->button; if (btn == RGFW_mouseLeft) btn = 1; else if (btn == RGFW_mouseRight) btn = 2; @@ -968,20 +974,21 @@ void PollInputEvents(void) } break; case RGFW_mousePosChanged: { - if (platform.window->src.winArgs & RGFW_HOLD_MOUSE) { - + if (platform.window->src.winArgs & RGFW_HOLD_MOUSE) + { CORE.Input.Mouse.previousPosition = (Vector2){ 0.0f, 0.0f }; - - if ((event->point.x - (platform.window->r.w / 2)) * 2) - CORE.Input.Mouse.previousPosition.x = CORE.Input.Mouse.currentPosition.x; - if ((event->point.y - (platform.window->r.h / 2)) * 2) + + if ((event->point.x - (platform.window->r.w/2))*2) + CORE.Input.Mouse.previousPosition.x = CORE.Input.Mouse.currentPosition.x; + if ((event->point.y - (platform.window->r.h/2))*2) CORE.Input.Mouse.previousPosition.y = CORE.Input.Mouse.currentPosition.y; - CORE.Input.Mouse.currentPosition.x = (event->point.x - (platform.window->r.w / 2)) * 2; - CORE.Input.Mouse.currentPosition.y = (event->point.y - (platform.window->r.h / 2)) * 2; + CORE.Input.Mouse.currentPosition.x = (event->point.x - (platform.window->r.w/2))*2; + CORE.Input.Mouse.currentPosition.y = (event->point.y - (platform.window->r.h/2))*2; } - else { - CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition; + else + { + CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition; CORE.Input.Mouse.currentPosition.x = (float)event->point.x; CORE.Input.Mouse.currentPosition.y = (float)event->point.y; } @@ -989,7 +996,6 @@ void PollInputEvents(void) CORE.Input.Touch.position[0] = CORE.Input.Mouse.currentPosition; touchAction = 2; } break; - case RGFW_jsButtonPressed: { int button = -1; @@ -1061,25 +1067,30 @@ void PollInputEvents(void) case RGFW_jsAxisMove: { int axis = -1; - - size_t i; - for (i = 0; i < event->axisesCount; i++) + for (int i = 0; i < event->axisesCount; i++) { - switch(i) { - case 0: - if (abs(event->axis[i].x) > abs(event->axis[i].y)) { - axis = GAMEPAD_AXIS_LEFT_X; + switch(i) + { + case 0: + { + if (abs(event->axis[i].x) > abs(event->axis[i].y)) + { + axis = GAMEPAD_AXIS_LEFT_X; break; } - + axis = GAMEPAD_AXIS_LEFT_Y; - break; - case 1: - if (abs(event->axis[i].x) > abs(event->axis[i].y)) { - axis = GAMEPAD_AXIS_RIGHT_X; break; + } break; + case 1: + { + if (abs(event->axis[i].x) > abs(event->axis[i].y)) + { + axis = GAMEPAD_AXIS_RIGHT_X; + break; } - axis = GAMEPAD_AXIS_RIGHT_Y; break; + axis = GAMEPAD_AXIS_RIGHT_Y; + } break; case 2: axis = GAMEPAD_AXIS_LEFT_TRIGGER; break; case 3: axis = GAMEPAD_AXIS_RIGHT_TRIGGER; break; default: break; @@ -1137,9 +1148,7 @@ void PollInputEvents(void) #endif } - if (RGFW_disableCursor && platform.window->event.inFocus) - RGFW_window_mouseHold(platform.window, RGFW_AREA(0, 0)); - + if (RGFW_disableCursor && platform.window->event.inFocus) RGFW_window_mouseHold(platform.window, RGFW_AREA(0, 0)); //----------------------------------------------------------------------------- } @@ -1151,15 +1160,7 @@ void PollInputEvents(void) // Initialize platform: graphics, inputs and more int InitPlatform(void) { - // TODO: Initialize graphic device: display/window - // It usually requires setting up the platform display system configuration - // and connexion with the GPU through some system graphic API - // raylib uses OpenGL so, platform should create that kind of connection - // Below example illustrates that process using EGL library - //---------------------------------------------------------------------------- // Initialize RGFW internal global state, only required systems - // Initialize graphic device: display/window and graphic context - //---------------------------------------------------------------------------- unsigned int flags = RGFW_CENTER | RGFW_ALLOW_DND; // Check window creation flags @@ -1201,14 +1202,14 @@ int InitPlatform(void) if (CORE.Window.flags & FLAG_VSYNC_HINT) RGFW_window_swapInterval(platform.window, 1); - + RGFW_window_makeCurrent(platform.window); // Check surface and context activation if (platform.window != NULL) { CORE.Window.ready = true; - + CORE.Window.render.width = CORE.Window.screen.width; CORE.Window.render.height = CORE.Window.screen.height; CORE.Window.currentFbo.width = CORE.Window.render.width; @@ -1241,7 +1242,7 @@ int InitPlatform(void) TRACELOG(LOG_INFO, " > Render size: %i x %i", CORE.Window.render.width, CORE.Window.render.height); TRACELOG(LOG_INFO, " > Viewport offsets: %i, %i", CORE.Window.renderOffset.x, CORE.Window.renderOffset.y); - // TODO: Load OpenGL extensions + // Load OpenGL extensions // NOTE: GL procedures address loader is required to load extensions //---------------------------------------------------------------------------- rlLoadExtensions((void*)RGFW_getProcAddress); @@ -1255,12 +1256,12 @@ int InitPlatform(void) // ... //---------------------------------------------------------------------------- - // TODO: Initialize timing system + // Initialize timing system //---------------------------------------------------------------------------- InitTimer(); //---------------------------------------------------------------------------- - // TODO: Initialize storage system + // Initialize storage system //---------------------------------------------------------------------------- CORE.Storage.basePath = GetWorkingDirectory(); //---------------------------------------------------------------------------- @@ -1281,14 +1282,12 @@ int InitPlatform(void) void ClosePlatform(void) { RGFW_window_close(platform.window); - // TODO: De-initialize graphics, inputs and more } +// Keycode mapping +static KeyboardKey ConvertScancodeToKey(u32 keycode) +{ + if (keycode > sizeof(keyMappingRGFW)/sizeof(unsigned short)) return 0; -static KeyboardKey ConvertScancodeToKey(u32 keycode) { - if (keycode > sizeof(RGFWKeyToRayKey) / sizeof(unsigned short)) - return 0; - - return RGFWKeyToRayKey[keycode]; + return keyMappingRGFW[keycode]; } -// EOF \ No newline at end of file diff --git a/src/platforms/rcore_desktop_sdl.c b/src/platforms/rcore_desktop_sdl.c index c22150efb..8a0fea81a 100644 --- a/src/platforms/rcore_desktop_sdl.c +++ b/src/platforms/rcore_desktop_sdl.c @@ -1132,7 +1132,8 @@ void PollInputEvents(void) { KeyboardKey key = ConvertScancodeToKey(event.key.keysym.scancode); - if (key != KEY_NULL) { + if (key != KEY_NULL) + { // If key was up, add it to the key pressed queue if ((CORE.Input.Keyboard.currentKeyState[key] == 0) && (CORE.Input.Keyboard.keyPressedQueueCount < MAX_KEY_PRESSED_QUEUE)) { diff --git a/src/platforms/rcore_drm.c b/src/platforms/rcore_drm.c index ba6071460..17a8e4d00 100644 --- a/src/platforms/rcore_drm.c +++ b/src/platforms/rcore_drm.c @@ -398,7 +398,7 @@ int GetMonitorWidth(int monitor) { width = platform.connector->modes[platform.modeIndex].hdisplay; } - + return width; } @@ -415,7 +415,7 @@ int GetMonitorHeight(int monitor) { height = platform.connector->modes[platform.modeIndex].vdisplay; } - + return height; } @@ -479,7 +479,7 @@ const char *GetMonitorName(int monitor) { name = platform.connector->modes[platform.modeIndex].name; } - + return name; } @@ -1136,7 +1136,8 @@ void ClosePlatform(void) // Close the evdev devices - if (platform.mouseFd != -1) { + if (platform.mouseFd != -1) + { close(platform.mouseFd); platform.mouseFd = -1; } @@ -1924,9 +1925,7 @@ static int FindNearestConnectorMode(const drmModeConnector *connector, uint widt const int nearestHeightDiff = abs(platform.connector->modes[nearestIndex].vdisplay - height); const int nearestFpsDiff = abs(platform.connector->modes[nearestIndex].vrefresh - fps); - if ((widthDiff < nearestWidthDiff) || (heightDiff < nearestHeightDiff) || (fpsDiff < nearestFpsDiff)) { - nearestIndex = i; - } + if ((widthDiff < nearestWidthDiff) || (heightDiff < nearestHeightDiff) || (fpsDiff < nearestFpsDiff)) nearestIndex = i; } return nearestIndex; diff --git a/src/raudio.c b/src/raudio.c index 623984e1d..e33712978 100644 --- a/src/raudio.c +++ b/src/raudio.c @@ -1464,7 +1464,7 @@ Music LoadMusicStream(const char *fileName) jar_xm_reset(ctxXm); // Make sure we start at the beginning of the song musicLoaded = true; } - else + else { jar_xm_free_context(ctxXm); } @@ -1566,7 +1566,7 @@ Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data, music.looping = true; // Looping enabled by default musicLoaded = true; } - else + else { stb_vorbis_close(ctxOgg); } diff --git a/src/raylib.h b/src/raylib.h index 26cf03e85..3f6b61f8a 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1332,9 +1332,9 @@ RLAPI Image GenImageText(int width, int height, const char *text); // Image manipulation functions RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) RLAPI Image ImageFromImage(Image image, Rectangle rec); // Create an image from another image piece +RLAPI Image ImageFromChannel(Image image, int selectedChannel); // Create an image from a selected channel of another image (GRAYSCALE/R16/R32) RLAPI Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font) RLAPI Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint); // Create an image from text (custom sprite font) -RLAPI Image ImageFromChannel(Image image, int selectedChannel); // Create an image from a selected channel of another image RLAPI void ImageFormat(Image *image, int newFormat); // Convert image data to desired format RLAPI void ImageToPOT(Image *image, Color fill); // Convert image to POT (power-of-two) RLAPI void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle diff --git a/src/raymath.h b/src/raymath.h index 63947ee8d..0a0b05803 100644 --- a/src/raymath.h +++ b/src/raymath.h @@ -2221,9 +2221,9 @@ RMAPI Quaternion QuaternionCubicHermiteSpline(Quaternion q1, Quaternion outTange float t2 = t * t; float t3 = t2 * t; float h00 = 2 * t3 - 3 * t2 + 1; - float h10 = t3 - 2 * t2 + t; - float h01 = -2 * t3 + 3 * t2; - float h11 = t3 - t2; + float h10 = t3 - 2 * t2 + t; + float h01 = -2 * t3 + 3 * t2; + float h11 = t3 - t2; Quaternion p0 = QuaternionScale(q1, h00); Quaternion m0 = QuaternionScale(outTangent1, h10); @@ -2533,7 +2533,7 @@ RMAPI void MatrixDecompose(Matrix mat, Vector3 *translation, Quaternion *rotatio translation->y = mat.m13; translation->z = mat.m14; - // Extract upper-left for determinant computation. + // Extract upper-left for determinant computation const float a = mat.m0; const float b = mat.m4; const float c = mat.m8; @@ -2543,28 +2543,29 @@ RMAPI void MatrixDecompose(Matrix mat, Vector3 *translation, Quaternion *rotatio const float g = mat.m2; const float h = mat.m6; const float i = mat.m10; - const float A = e * i - f * h; - const float B = f * g - d * i; - const float C = d * h - e * g; + const float A = e*i - f*h; + const float B = f*g - d*i; + const float C = d*h - e*g; - // Extract scale. - const float det = a * A + b * B + c * C; - float scalex = Vector3Length((Vector3) {a, b, c}); - float scaley = Vector3Length((Vector3) {d, e, f}); - float scalez = Vector3Length((Vector3) {g, h, i}); - Vector3 s = {scalex, scaley, scalez}; + // Extract scale + const float det = a*A + b*B + c*C; + float scalex = Vector3Length((Vector3){ a, b, c }); + float scaley = Vector3Length((Vector3){ d, e, f }); + float scalez = Vector3Length((Vector3){ g, h, i }); + Vector3 s = { scalex, scaley, scalez }; if (det < 0) s = Vector3Negate(s); *scale = s; - // Remove scale from the matrix if it is not close to zero. + // Remove scale from the matrix if it is not close to zero Matrix clone = mat; if (!FloatEquals(det, 0)) { clone.m0 /= s.x; clone.m5 /= s.y; clone.m10 /= s.z; + // Extract rotation *rotation = QuaternionFromMatrix(clone); } diff --git a/src/rmodels.c b/src/rmodels.c index 5f061e2dd..432413cd0 100644 --- a/src/rmodels.c +++ b/src/rmodels.c @@ -4327,7 +4327,7 @@ static Model LoadIQM(const char *fileName) model.materials[i].maps[MATERIAL_MAP_ALBEDO].texture = LoadTexture(TextFormat("%s/%s", basePath, material)); model.meshMaterial[i] = i; - + TRACELOG(LOG_DEBUG, "MODEL: [%s] mesh name (%s), material (%s)", fileName, name, material); model.meshes[i].vertexCount = imesh[i].num_vertexes; @@ -4636,7 +4636,7 @@ static ModelAnimation *LoadModelAnimationsIQM(const char *fileName, int *animCou animations[a].boneCount = iqmHeader->num_poses; animations[a].bones = RL_MALLOC(iqmHeader->num_poses*sizeof(BoneInfo)); animations[a].framePoses = RL_MALLOC(anim[a].num_frames*sizeof(Transform *)); - memcpy(animations[a].name, fileDataPtr + iqmHeader->ofs_text + anim[a].name, 32); // I don't like this 32 here + memcpy(animations[a].name, fileDataPtr + iqmHeader->ofs_text + anim[a].name, 32); // I don't like this 32 here TraceLog(LOG_INFO, "IQM Anim %s", animations[a].name); // animations[a].framerate = anim.framerate; // TODO: Use animation framerate data? @@ -4913,7 +4913,7 @@ static Model LoadGLTF(const char *fileName) PBR specular/glossiness flow and extended texture flows not supported - Supports multiple meshes per model (every primitives is loaded as a separate mesh) - Supports basic animations - - Transforms, including parent-child relations, are applied on the mesh data, but the + - Transforms, including parent-child relations, are applied on the mesh data, but the hierarchy is not kept (as it can't be represented). - Mesh instances in the glTF file (i.e. same mesh linked from multiple nodes) are turned into separate raylib Meshes. @@ -5101,7 +5101,7 @@ static Model LoadGLTF(const char *fileName) // Each primitive within a glTF node becomes a Raylib Mesh. // The local-to-world transform of each node is used to transform the // points/normals/tangents of the created Mesh(es). - // Any glTF mesh linked from more than one Node (i.e. instancing) + // Any glTF mesh linked from more than one Node (i.e. instancing) // is turned into multiple Mesh's, as each Node will have its own // transform applied. // Note: the code below disregards the scenes defined in the file, all nodes are used. @@ -5262,7 +5262,7 @@ static Model LoadGLTF(const char *fileName) else TRACELOG(LOG_WARNING, "MODEL: [%s] Texcoords attribute data format not supported", fileName); } else TRACELOG(LOG_WARNING, "MODEL: [%s] Texcoords attribute data format not supported, use vec2 float", fileName); - + int index = mesh->primitives[p].attributes[j].index; if (index == 0) model.meshes[meshIndex].texcoords = texcoordPtr; else if (index == 1) model.meshes[meshIndex].texcoords2 = texcoordPtr; diff --git a/src/rshapes.c b/src/rshapes.c index b119f50ec..fd6ff7d23 100644 --- a/src/rshapes.c +++ b/src/rshapes.c @@ -1834,7 +1834,7 @@ void DrawSplineBezierQuadratic(const Vector2 *points, int pointCount, float thic if (pointCount >= 3) { for (int i = 0; i < pointCount - 2; i += 2) DrawSplineSegmentBezierQuadratic(points[i], points[i + 1], points[i + 2], thick, color); - + // Cap circle drawing at the end of every segment //for (int i = 2; i < pointCount - 2; i += 2) DrawCircleV(points[i], thick/2.0f, color); } @@ -1846,7 +1846,7 @@ void DrawSplineBezierCubic(const Vector2 *points, int pointCount, float thick, C if (pointCount >= 4) { for (int i = 0; i < pointCount - 3; i += 3) DrawSplineSegmentBezierCubic(points[i], points[i + 1], points[i + 2], points[i + 3], thick, color); - + // Cap circle drawing at the end of every segment //for (int i = 3; i < pointCount - 3; i += 3) DrawCircleV(points[i], thick/2.0f, color); } diff --git a/src/rtextures.c b/src/rtextures.c index 9d547cd0b..b6d331385 100644 --- a/src/rtextures.c +++ b/src/rtextures.c @@ -1636,19 +1636,18 @@ Image ImageFromChannel(Image image, int selectedChannel) Image result = { 0 }; // Security check to avoid program crash - if ((image.data == NULL) || (image.width == 0) || (image.height == 0)) - return result; + if ((image.data == NULL) || (image.width == 0) || (image.height == 0)) return result; - // Check selected channel + // Check selected channel is valid if (selectedChannel < 0) { TRACELOG(LOG_WARNING, "Channel cannot be negative. Setting channel to 0."); selectedChannel = 0; } - if (image.format == PIXELFORMAT_UNCOMPRESSED_GRAYSCALE - || image.format == PIXELFORMAT_UNCOMPRESSED_R32 - || image.format == PIXELFORMAT_UNCOMPRESSED_R16 - ) + + if (image.format == PIXELFORMAT_UNCOMPRESSED_GRAYSCALE || + image.format == PIXELFORMAT_UNCOMPRESSED_R32 || + image.format == PIXELFORMAT_UNCOMPRESSED_R16) { if (selectedChannel > 0) { @@ -1664,11 +1663,10 @@ Image ImageFromChannel(Image image, int selectedChannel) selectedChannel = 1; } } - else if (image.format == PIXELFORMAT_UNCOMPRESSED_R5G6B5 - || image.format == PIXELFORMAT_UNCOMPRESSED_R8G8B8 - || image.format == PIXELFORMAT_UNCOMPRESSED_R32G32B32 - || image.format == PIXELFORMAT_UNCOMPRESSED_R16G16B16 - ) + else if (image.format == PIXELFORMAT_UNCOMPRESSED_R5G6B5 || + image.format == PIXELFORMAT_UNCOMPRESSED_R8G8B8 || + image.format == PIXELFORMAT_UNCOMPRESSED_R32G32B32 || + image.format == PIXELFORMAT_UNCOMPRESSED_R16G16B16) { if (selectedChannel > 2) { @@ -1677,153 +1675,121 @@ Image ImageFromChannel(Image image, int selectedChannel) } } - // formats rgba + // Check for RGBA formats if (selectedChannel > 3) { TRACELOG(LOG_WARNING, "ImageFromChannel supports channels 0 to 3 (rgba). Setting channel to alpha."); selectedChannel = 3; } + // TODO: Consider other one-channel formats: R16, R32 result.format = PIXELFORMAT_UNCOMPRESSED_GRAYSCALE; result.height = image.height; result.width = image.width; result.mipmaps = 1; - unsigned char *pixels = (unsigned char *)RL_CALLOC(image.width * image.height, sizeof(unsigned char)); // values 0 to 255 + unsigned char *pixels = (unsigned char *)RL_CALLOC(image.width*image.height, sizeof(unsigned char)); // Values from 0 to 255 if (image.format >= PIXELFORMAT_COMPRESSED_DXT1_RGB) TRACELOG(LOG_WARNING, "IMAGE: Pixel data retrieval not supported for compressed image formats"); else { - for (int i = 0, k = 0; i < image.width * image.height; ++i) + for (int i = 0, k = 0; i < image.width*image.height; i++) { - float imageValue = -1; + float pixelValue = -1; switch (image.format) { case PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: { - imageValue = (float)((unsigned char *)image.data)[i + selectedChannel]/255.0f; + pixelValue = (float)((unsigned char *)image.data)[i + selectedChannel]/255.0f; } break; case PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA: { - imageValue = (float)((unsigned char *)image.data)[k + selectedChannel]/255.0f; - + pixelValue = (float)((unsigned char *)image.data)[k + selectedChannel]/255.0f; k += 2; + } break; case PIXELFORMAT_UNCOMPRESSED_R5G5B5A1: { unsigned short pixel = ((unsigned short *)image.data)[i]; - if (selectedChannel == 0) - { - imageValue = (float)((pixel & 0b1111100000000000) >> 11)*(1.0f/31); - } - else if (selectedChannel == 1) - { - imageValue = (float)((pixel & 0b0000011111000000) >> 6)*(1.0f/31); - } - else if (selectedChannel == 2) - { - imageValue = (float)((pixel & 0b0000000000111110) >> 1)*(1.0f/31); - } - else if (selectedChannel == 3) - { - imageValue = ((pixel & 0b0000000000000001) == 0)? 0.0f : 1.0f; - } + if (selectedChannel == 0) pixelValue = (float)((pixel & 0b1111100000000000) >> 11)*(1.0f/31); + else if (selectedChannel == 1) pixelValue = (float)((pixel & 0b0000011111000000) >> 6)*(1.0f/31); + else if (selectedChannel == 2) pixelValue = (float)((pixel & 0b0000000000111110) >> 1)*(1.0f/31); + else if (selectedChannel == 3) pixelValue = ((pixel & 0b0000000000000001) == 0)? 0.0f : 1.0f; } break; case PIXELFORMAT_UNCOMPRESSED_R5G6B5: { unsigned short pixel = ((unsigned short *)image.data)[i]; - if (selectedChannel == 0) - { - imageValue = (float)((pixel & 0b1111100000000000) >> 11)*(1.0f/31); - } - else if (selectedChannel == 1) - { - imageValue = (float)((pixel & 0b0000011111100000) >> 5)*(1.0f/63); - } - else if (selectedChannel == 2) - { - imageValue = (float)(pixel & 0b0000000000011111)*(1.0f/31); - } + if (selectedChannel == 0) pixelValue = (float)((pixel & 0b1111100000000000) >> 11)*(1.0f/31); + else if (selectedChannel == 1) pixelValue = (float)((pixel & 0b0000011111100000) >> 5)*(1.0f/63); + else if (selectedChannel == 2) pixelValue = (float)(pixel & 0b0000000000011111)*(1.0f/31); } break; case PIXELFORMAT_UNCOMPRESSED_R4G4B4A4: { unsigned short pixel = ((unsigned short *)image.data)[i]; - if (selectedChannel == 0) - { - imageValue = (float)((pixel & 0b1111000000000000) >> 12)*(1.0f/15); - } - else if (selectedChannel == 1) - { - imageValue = (float)((pixel & 0b0000111100000000) >> 8)*(1.0f/15); - } - else if (selectedChannel == 2) - { - imageValue = (float)((pixel & 0b0000000011110000) >> 4)*(1.0f/15); - } - else if (selectedChannel == 3) - { - imageValue = (float)(pixel & 0b0000000000001111)*(1.0f/15); - } + if (selectedChannel == 0) pixelValue = (float)((pixel & 0b1111000000000000) >> 12)*(1.0f/15); + else if (selectedChannel == 1) pixelValue = (float)((pixel & 0b0000111100000000) >> 8)*(1.0f/15); + else if (selectedChannel == 2) pixelValue = (float)((pixel & 0b0000000011110000) >> 4)*(1.0f/15); + else if (selectedChannel == 3) pixelValue = (float)(pixel & 0b0000000000001111)*(1.0f/15); } break; case PIXELFORMAT_UNCOMPRESSED_R8G8B8A8: { - imageValue = (float)((unsigned char *)image.data)[k + selectedChannel]/255.0f; - + pixelValue = (float)((unsigned char *)image.data)[k + selectedChannel]/255.0f; k += 4; + } break; case PIXELFORMAT_UNCOMPRESSED_R8G8B8: { - imageValue = (float)((unsigned char *)image.data)[k + selectedChannel]/255.0f; - + pixelValue = (float)((unsigned char *)image.data)[k + selectedChannel]/255.0f; k += 3; + } break; case PIXELFORMAT_UNCOMPRESSED_R32: { - imageValue = ((float *)image.data)[k]; - + pixelValue = ((float *)image.data)[k]; k += 1; + } break; case PIXELFORMAT_UNCOMPRESSED_R32G32B32: { - imageValue = ((float *)image.data)[k + selectedChannel]; - + pixelValue = ((float *)image.data)[k + selectedChannel]; k += 3; + } break; case PIXELFORMAT_UNCOMPRESSED_R32G32B32A32: { - imageValue = ((float *)image.data)[k + selectedChannel]; - + pixelValue = ((float *)image.data)[k + selectedChannel]; k += 4; + } break; case PIXELFORMAT_UNCOMPRESSED_R16: { - imageValue = HalfToFloat(((unsigned short *)image.data)[k]); - + pixelValue = HalfToFloat(((unsigned short *)image.data)[k]); k += 1; + } break; case PIXELFORMAT_UNCOMPRESSED_R16G16B16: { - imageValue = HalfToFloat(((unsigned short *)image.data)[k+selectedChannel]); - + pixelValue = HalfToFloat(((unsigned short *)image.data)[k+selectedChannel]); k += 3; + } break; case PIXELFORMAT_UNCOMPRESSED_R16G16B16A16: { - imageValue = HalfToFloat(((unsigned short *)image.data)[k + selectedChannel]); - + pixelValue = HalfToFloat(((unsigned short *)image.data)[k + selectedChannel]); k += 4; + } break; default: break; } - pixels[i] = imageValue * 255; + pixels[i] = (unsigned char)(pixelValue*255); } } @@ -4911,12 +4877,12 @@ Color Fade(Color color, float alpha) int ColorToInt(Color color) { int result = 0; - - result = (int)(((unsigned int)color.r << 24) | - ((unsigned int)color.g << 16) | - ((unsigned int)color.b << 8) | + + result = (int)(((unsigned int)color.r << 24) | + ((unsigned int)color.g << 16) | + ((unsigned int)color.b << 8) | (unsigned int)color.a); - + return result; }