# sola-raylib Changelog ## UNRELEASED ### BREAKING - **`RaylibHandle::set_gamepad_mappings` now takes `&str`** instead of `&[c_char]`. The old signature required building a NUL-terminated `c_char` slice by hand and had no terminator guarantee. Pass the text of a `gamecontrollerdb.txt` directly, e.g. `rl.set_gamepad_mappings(include_str!("my_gamepads.txt"))`. ### Added - `set_blend_factors` and `set_blend_factors_separate` wrapper functions - Bundled gamepad mappings. sola-raylib now vendors a recent [SDL_GameControllerDB](https://github.com/mdqinc/SDL_GameControllerDB) and, by default, loads it over raylib's built-in table when the window is created, so games recognize controllers added since raylib was built. Opt out with `init().bundled_gamepad_mappings(false)`. Provide your own at init with `init().gamepad_mappings(include_str!("my_gamepads.txt"))`, or at runtime with `RaylibHandle::load_gamepad_mappings_from_file(path)`. The bundled database is exposed as `core::gamepad_db::BUNDLED`. See https://github.com/brettchalupa/sola-raylib/issues/63 ### Fixes - Don't show non-gamepad joysticks on Linux as gamepads. Previous versions were showing some keyboards, some mainboard sensors, etc. as gamepads which was wrong and confusing. While the issue is upstream in Raylib and GLFW, there's seemingly little appetite or momentum in fixing this, so sola-raylb now applies a check for gamepad mapping. This means that controllers without a mapping won't show up as detected, but that's better than showing up and not working. See https://github.com/brettchalupa/sola-raylib/issues/62 - Fix segfault due to OOB read when using certain characters; see https://github.com/brettchalupa/sola-raylib/pull/67 - Fix window monitor functions panicing with SDL backend; see https://github.com/brettchalupa/sola-raylib/issues/65 ## 6.2.0 - June 2, 2026 ### BREAKING - **`RaylibHandle::load_shader` and `load_shader_from_memory` are now fallible** ([#51]). Both return `Result` instead of `Shader`. raylib silently logs a warning and substitutes the default shader when a file is missing or a shader fails to compile, so the old signatures made those failures look like success. `load_shader` now also checks each provided path exists before calling raylib, necessary because a missing file comes back as the (valid, non-zero) default shader id and is otherwise undetectable. This is a breaking signature change, but a loud, compile-time one: add `?` or `.unwrap()` at the call site. ```rust // before let shader = rl.load_shader(&thread, None, Some("grayscale.fs")); // after let shader = rl.load_shader(&thread, None, Some("grayscale.fs"))?; ``` Caveat: a vertex/fragment pair that compiles individually but fails to _link_ still slips through, since raylib reassigns the default shader id internally and the failure can't be observed from the binding. - **`Image::load_image_anim` and `load_image_anim_from_memory` are now fallible** ([#51]). Both return `Result` instead of `Image`, checking for the null `data` raylib hands back on failure. This brings them in line with their non-animated siblings (`load_image`, `load_image_raw`, `load_image_from_mem`), which already returned `Result`. Add `?` or `.unwrap()` at the call site. [#51]: https://github.com/brettchalupa/sola-raylib/issues/51 ### Added - **`RaylibHandle::request_quit`.** Programmatic quit for the `sola_raylib::core::game_loop::run` helper (and any hand-rolled `while !rl.window_should_close()` loop). Wire it up to a quit menu item, gamepad button, "game over" transition, etc. `window_should_close` returns true on the next check; on emscripten the registered main loop is cancelled on the next frame. The default ESC / window-close-button paths still work exactly as before. The existing `set_exit_key` API remains the way to change or disable the default exit key. ### Fixed - **Windows MSVC builds now work from a plain shell** ([#56]). When `configure_windows_cmake_generator` picked Ninja (auto-selected when `ninja` is on `PATH`), cmake invoked `cl.exe` directly and failed to find `` unless you'd launched cargo from a Developer Command Prompt or run `vcvars*.bat` first. The build script now uses `cc::windows_registry::find_tool` to locate the MSVC toolchain and injects its `INCLUDE` / `LIB` / `PATH` into the build env. No-op if you're already in a vcvars shell (`INCLUDE` is set) or targeting a non-msvc target. Thanks to @lofcz. - **The `sdl` feature now links the correct SDL version on Windows** ([#57]). The build script decided between SDL2 and SDL3 by probing `pkg-config`, which Windows does not ship, so it always fell through to linking SDL2 regardless of what raylib's CMake actually compiled against. It now reads raylib's resolved choice from the generated `raylib-config.cmake` (`find_dependency(SDL3 ...)` vs `SDL2`) and links the matching library, on every platform and with no pkg-config dependency. [#56]: https://github.com/brettchalupa/sola-raylib/pull/56 [#57]: https://github.com/brettchalupa/sola-raylib/issues/57 ## 6.1.0 - May 7, 2026 ### Removed - **`nogif` Cargo feature.** raylib 6.0 dropped its built-in GIF recorder upstream (the rcore module no longer references `SUPPORT_GIF_RECORDING`), so the feature had no functional effect since the 6.0 bump. Drop the feature from your `Cargo.toml`; nothing replaces it. [Raylib C example for recording.](https://www.raylib.com/examples/core/loader.html?name=core_screen_recording) ### Fixed - **`noscreenshot` feature now actually works on Linux** ([#40]). The 6.0 build routed it through raylib's `CUSTOMIZE_BUILD=ON` CMake switch, which also defines `EXTERNAL_CONFIG_FLAGS` and makes raylib's `config.h` skip its entire defaults block. Every `SUPPORT_*` macro then went undefined (rtextures, partialbusy wait, gestures, etc.), so the window mapped but never rendered on X11/XWayland and failed to appear at all on native Wayland. The fix pre-defines `SUPPORT_SCREEN_CAPTURE=0` directly on the C compile line via `cflag`, so `config.h`'s `#ifndef` guard short-circuits while every other default flows through normally. The F12 keybind is gone from the compiled `libraylib.a`, rendering and Wayland init are unaffected. - **`custom_frame_control` feature was a no-op since the 6.0 bump.** The build used `builder.define("SUPPORT_CUSTOM_FRAME_CONTROL", "ON")`, which sets a CMake variable that only reaches the C compiler when `CUSTOMIZE_BUILD=ON` is also set (and that path is the same one that broke `noscreenshot`). Switched to the same `cflag("-DSUPPORT_CUSTOM_FRAME_CONTROL=1")` approach so the feature actually flips the `#if SUPPORT_CUSTOM_FRAME_CONTROL` guards in `rcore.c` (`SwapScreenBuffer`, `PollInputEvents`, frame-time wait become user-driven, as documented). [#40]: https://github.com/brettchalupa/sola-raylib/issues/40 ### Documentation - New canonical "Cargo features" section in the top-level README listing every feature, its default state, and platform notes. The `sola-raylib-sys` README's table now points here. - New [mdBook](https://rust-lang.github.io/mdBook/) under `book/` for long-form recipes. First chapter [`book/src/web.md`](book/src/web.md) walks through wasm builds end to end: toolchain, the canonical `.cargo/config.toml`, the `game_loop::run` vs Asyncify tradeoff, asset bundling, save data, audio, deploy, pitfalls. Top-level README and the `lib.rs` crate docs link to it. Closes [#34]. [#34]: https://github.com/brettchalupa/sola-raylib/issues/34 ### Added - **Cross-platform game-loop helper `sola_raylib::core::game_loop::run`.** Native: drives the standard `while !rl.window_should_close()` loop. On `wasm32-unknown-emscripten`: registers the per-frame closure with `emscripten_set_main_loop_arg` so you don't need `-sASYNCIFY=1` just for the loop. Same source for both. `examples/hello_raylib.rs` demonstrates it. - **Wasm build recipe is now in-tree.** Cargo silently drops `cargo:rustc-link-arg` from rlib build scripts, so `raylib-sys` cannot inject linker flags into a downstream binary's link step. The flags raylib needs (`-sUSE_GLFW=3`, `-sASYNCIFY=1`, `-sFORCE_FILESYSTEM=1`, `-sSUPPORT_LONGJMP=wasm`, `-sEXPORTED_RUNTIME_METHODS=...`, `-sALLOW_MEMORY_GROWTH=1`) live in the consumer's `.cargo/config.toml`. See [`book/src/web.md`](book/src/web.md) and the copyable [`examples/.cargo/config.toml`](examples/.cargo/config.toml). raylib's own C compiles cleanly under rustc 1.93+'s default link ABI; if you have your own C/C++ deps via cc-rs, add `CFLAGS_wasm32_unknown_emscripten = "-fwasm-exceptions -sSUPPORT_LONGJMP=wasm"` to your `[env]` block. - `RaylibBuilder` now exposes every raylib 6.0 `ConfigFlags` value as a dedicated builder method, so callers don't need to drop to `SetConfigFlags` for options the builder didn't cover. New methods: - `borderless_windowed()` (`FLAG_BORDERLESS_WINDOWED_MODE`) for a fullscreen-sized chromeless window. Friendlier than exclusive `fullscreen()` on modern desktops (no mode switch, fast Alt+Tab, plays well with multi-monitor and notifications). - `hidden()`, `minimized()`, `maximized()`, `unfocused()`, `topmost()`, `always_run()`, `mouse_passthrough()` covering the rest of the `FLAG_WINDOW_*` family. - `interlaced()` (`FLAG_INTERLACED_HINT`) for 3D TV setups. - Improve Emscripten support for building for WASM from Windows. - Doc note on `fullscreen()` recommending `borderless_windowed()` on modern platforms. ## 6.0.0 - Apr 24, 2026 Upgrade to **raylib 6.0** and **raygui 5**. sola-raylib's major version tracks raylib's, so 6.x binds raylib 6.0. See raylib's [6.0 release notes][raylib-6] for the full upstream story. ### Breaking - raylib 6.0 — upstream redesigned skeletal animation, fullscreen modes, the build-config system, and more. Most safe wrappers are unchanged; the exceptions are below. - `RaylibModel::bind_pose` and `bind_pose_mut` now return `Option<&[Transform]>` (was `Option<&Transform>`). The underlying field is an array sized by `boneCount`, so the old signature read garbage past the first bone. - Removed `RaylibMesh::indicies` / `indicies_mut`. The typo'd aliases were deprecated in 5.5.3 with a "removed in 6.0" note — use `indices` / `indices_mut`. - `DrawModelPoints` / `DrawModelPointsEx` removed — raylib 6.0 dropped these from its public API. - **Removed the rlImGui / imgui integration.** The `imgui` feature, the `raylib::imgui` module, the `RayImGUITrait` and friends, the rlImGui submodule, and the `imgui` example are all gone. sola-raylib is focused on raylib + raygui; if you want imgui-in-raylib, use a community bridge crate or roll a small integration crate against `sola-raylib-sys`. - **Removed the physac status row from the README.** There was no actual physac binding in the safe crate; the row was aspirational. Physac itself is a separate raylib-extras library — a real binding would live in its own crate. ### Added New API wrappers for raylib 6.0 additions: - Models: `update_model_animation_ex` (animation blending). - Input: `get_key_name`. - Hashing: `compute_sha256`, `compute_sha1`, `compute_md5`, `compute_crc32`. - Shapes (`RaylibDraw`): `draw_line_dashed`, `draw_ellipse_v`, `draw_ellipse_lines_v`. - Text: `measure_text_codepoints`. - Math: `Vector2::cross_product`, `Matrix::multiply_value`, `Matrix::compose`. - Pixel helpers in `core::texture`: `get_pixel_color` and `set_pixel_color` (take a `PixelFormat` enum and byte slice, validate slice length). ### Fixed - **`RaylibMesh::tangents` / `tangents_mut` return `&[Vector4]` / `&mut [Vector4]`** (was `Vector3`). Raylib stores tangents as `float[4 * vertexCount]` (XYZW where W is the bitangent sign), but the previous cast sliced 3 of every 4 floats and produced misaligned reads. Covered by a new unit test in `raylib/src/core/models.rs`. - **CMake `USE_WAYLAND` flag updated to `GLFW_BUILD_WAYLAND`.** Upstream renamed the knob in 6.0; our `wayland` feature was silently a no-op until this fix. - Removed two long-silent no-op CMake defines (`SUPPORT_BUSY_WAIT_LOOP=OFF`, `SUPPORT_FILEFORMAT_JPG=ON`). raylib 6.0 ignores `SUPPORT_*` overrides unless `CUSTOMIZE_BUILD=ON` is also set; experimentally turning that on caused unresponsive windows (black screen + "window is not responding") on Linux/X11. Keeping raylib's config.h defaults is the safe choice for 6.0.0. `custom_frame_control`, `noscreenshot`, and `nogif` features still activate `CUSTOMIZE_BUILD=ON` locally when enabled, so those paths keep working. - Audio: `Wave::export_as_code`. Raw audio-thread processor hooks as `unsafe fn`s that take `extern "C" fn(*mut c_void, u32)` pointers: `AudioStream::attach_audio_stream_processor` / `detach_audio_stream_processor`, and `RaylibAudio::attach_audio_mixed_processor` / `detach_audio_mixed_processor`. Ergonomic closure wrapping is future work; the raw pointer interface is honest about the audio-thread risk. New examples exercising the new surface: `animation_blending`, `shapes_new`, `borderless_fullscreen`, `pixel_color` (HSV wheel painted via `set_pixel_color`, read back under the cursor with `get_pixel_color`). The `input` example now also displays `get_key_name`. ### Other - `raylib-sys/README.md` rewritten to reflect the current build-time bindgen flow; the old doc described a workflow that no longer exists. - `DEVELOPING.md` gains a "Bumping raylib" checklist. - New opt-in feature flags for raylib 6.0's new platform backends. **All three are experimental upstream and may not work well yet.** Raylib 6.0 shipped them as new backends with known gaps. We expose the flags so you can opt in; what actually renders or links is whatever upstream supports today. - `software_render`: build raylib with the CPU `rlsw` backend (`OPENGL_VERSION=Software`). rlsw is **not compatible with the default GLFW desktop backend** per upstream (raylib#5664), so use it via `--features "sdl,software_render"` on Linux/macOS (requires SDL2 dev headers). `just example-sw ` and `just examples-sw` wire that combo for you. Windows would need the `rcore_desktop_win32` native backend, which sola-raylib does not wire yet. - `platform_memory`: build raylib with the headless `PLATFORM=Memory` backend. The feature compiles the backend, but reading the framebuffer requires `rlsw.h` APIs (e.g. `swGetColorBuffer`) that are **not yet wrapped** in the safe crate. Post-release work. - `platform_web_rgfw`: use raylib's RGFW-based web backend (`PLATFORM=WebRGFW`) when cross-compiling to `wasm32-unknown-emscripten`. No local demo path. Requires an emscripten build loop. ### Dependencies - Bumped `thiserror` from `1.x` to `2.x` in the public dep graph. Our public `Error` type still implements `std::error::Error`, so no API change for users. Only matters if you pin `thiserror = "1"` elsewhere in your `Cargo.toml`; cargo will resolve both versions side by side, or you can bump your own pin. - Dev-deps (`rand 0.8 → 0.10`) and build-deps (`cmake`, `cc`, `bindgen` patch updates) refreshed to current versions. These are not in the downstream user's dep graph. - Patch/minor refresh via `cargo update` across `cfg-if`, `paste`, `seq-macro`, `serde`, `serde_json`, `ringbuf`. [rlsw-pr]: https://github.com/raysan5/raylib/pull/4832 [raylib-6]: https://github.com/raysan5/raylib/releases/tag/6.0 ## 5.5.3 - Apr 24, 2026 Doc improvements and bug fixes ported from upstream raylib-rs, scoped to soundness and correctness. Thanks to all the original authors linked below. ### Breaking - `Image::export_image_to_memory` now returns `Result, Error>` instead of `Result<&[u8], Error>`. The previous signature leaked on every call (raylib's buffer was never freed) and had an unsound lifetime. Adapted from raylib-rs [#250][rr-250] / [#247][rr-247]. ### Deprecated - `RaylibMesh::indicies` / `indicies_mut` — use `indices` / `indices_mut`. The typo'd names stay through 5.x and are removed in 6.0. ### Fixed - **Soundness:** `RaylibMesh` accessors return an empty slice when the underlying buffer is null instead of invoking UB via `slice::from_raw_parts(null, _)` ([raylib-rs#257][rr-257]). - **Soundness:** `RaylibMesh::indices` length is now `triangleCount * 3` (what raylib allocates) rather than `vertexCount` ([raylib-rs#257][rr-257]). - **Soundness:** `Sound::alias` lifetimes correctly bind the sound's lifetime to the receiver ([`4d53bd4`][rr-4d53bd4]). - **Use-after-free:** `load_model_animations` frees only the outer array via `MemFree`, rather than `UnloadModelAnimations` which also tore down the animations the `Vec` had just taken ownership of ([`ccc0827`][rr-ccc0827]). - **Data corruption:** `AudioStream::update` passes element count (not byte size) to `ffi::UpdateAudioStream`, matching the C API ([raylib-rs#212][rr-212]). - `Texture2D::update_texture_rec` validates the destination rectangle and sizes the expected pixel buffer from rect dimensions ([`cb0c004`][rr-cb0c004]). - Closure-based draw helpers (`draw`, `draw_mode2D`, etc.) no longer call `ffi::End*()` twice — the handle's `Drop` already does ([`aadf1a7`][rr-aadf1a7]). - `gui_text_box` and `gui_text_input_box` grow the buffer and round-trip the null terminator, so text input works ([`e2be94b`][rr-e2be94b]). - `gui_panel` passes a null pointer for empty strings, matching `GuiPanel`'s C API ([`95234d1`][rr-95234d1]). ### Other - Add docs to README on drop ordering. - CI and `just ok` build with `--all-targets` so examples are exercised alongside the library crates. - Examples look better on High DPI screens. - `just examples` to quickly run a bunch of different examples. [rr-212]: https://github.com/raylib-rs/raylib-rs/pull/212 [rr-247]: https://github.com/raylib-rs/raylib-rs/issues/247 [rr-250]: https://github.com/raylib-rs/raylib-rs/pull/250 [rr-257]: https://github.com/raylib-rs/raylib-rs/pull/257 [rr-4d53bd4]: https://github.com/raylib-rs/raylib-rs/commit/4d53bd49af9a437433b7dff92b38cb06831351df [rr-95234d1]: https://github.com/raylib-rs/raylib-rs/commit/95234d17a1943e00b06e30f8323a63b78323880c [rr-aadf1a7]: https://github.com/raylib-rs/raylib-rs/commit/aadf1a76be022f197460d061c17570803010df58 [rr-cb0c004]: https://github.com/raylib-rs/raylib-rs/commit/cb0c0048b6c80ec8e487fafad2b07da1886007c8 [rr-ccc0827]: https://github.com/raylib-rs/raylib-rs/commit/ccc0827b9667578476c67b6c9d3b37a1b167034e [rr-e2be94b]: https://github.com/raylib-rs/raylib-rs/commit/e2be94bab26db3a30bca7226e5f03a4b15c54b0e ## 5.5.2 - Apr 23, 2026 - Renamed to sola-raylib and sola-raylib-sys - Fixed incorrect param ordering for `gui_list_view_ex` - Added `window_highdpi` to `RaylibBuilder` and associated `highdpi` builder function - Expanded CI - Formatting and linter fixes - Clean up files in repo --- Incomplete changelog below from raylib-rs. Keeping around for posterity's sake. ## 3.7.0 - [core] ADDED: LoadVrStereoConfig() - [core] ADDED: UnloadVrStereoConfig() - [core] ADDED: BeginVrStereoMode() - [core] ADDED: EndVrStereoMode() - [core] ADDED: GetCurrentMonitor() (#1485) by @object71 [core] ADDED: SetGamepadMappings() (#1506) - [core] RENAMED: struct Camera: camera.type to camera.projection - [core] RENAMED: LoadShaderCode() to LoadShaderFromMemory() (#1690) - [core] RENAMED: SetMatrixProjection() to rlSetMatrixProjection() - [core] RENAMED: SetMatrixModelview() to rlSetMatrixModelview() - [core] RENAMED: GetMatrixModelview() to rlGetMatrixModelview() - [core] RENAMED: GetMatrixProjection() to rlGetMatrixProjection() - [core] RENAMED: GetShaderDefault() to rlGetShaderDefault() [core] RENAMED: GetTextureDefault() to rlGetTextureDefault() [core] REMOVED: GetShapesTexture() [core] REMOVED: GetShapesTextureRec() [core] REMOVED: GetMouseCursor() - [core] REMOVED: SetTraceLogExit() [core] REVIEWED: GetFileName() and GetDirectoryPath() (#1534) by @gilzoide [core] REVIEWED: Wait() to support FreeBSD (#1618) [core] REVIEWED: HighDPI support on macOS retina (#1510) [core] REDESIGNED: GetFileExtension(), includes the .dot [core] REDESIGNED: IsFileExtension(), includes the .dot [core] REDESIGNED: Compresion API to use sdefl/sinfl libs - [rlgl] ADDED: SUPPORT_GL_DETAILS_INFO config flag [rlgl] REMOVED: GenTexture\*() functions (#721) [rlgl] REVIEWED: rlLoadShaderDefault() [rlgl] REDESIGNED: rlLoadExtensions(), more details exposed [raymath] REVIEWED: QuaternionFromEuler() (#1651) [raymath] REVIEWED: MatrixRotateZYX() (#1642) - [shapes] ADDED: DrawLineBezierQuad() (#1468) by @epsilon-phase [shapes] ADDED: CheckCollisionLines() - [shapes] ADDED: CheckCollisionPointLine() by @mkupiec1 [shapes] REVIEWED: CheckCollisionPointTriangle() by @mkupiec1 [shapes] REDESIGNED: SetShapesTexture() - [shapes] REDESIGNED: DrawCircleSector(), to use float params - [shapes] REDESIGNED: DrawCircleSectorLines(), to use float params - [shapes] REDESIGNED: DrawRing(), to use float params - [shapes] REDESIGNED: DrawRingLines(), to use float params - [textures] ADDED: DrawTexturePoly() and example (#1677) by @chriscamacho - [textures] ADDED: UnloadImageColors() for allocs consistency [textures] RENAMED: GetImageData() to LoadImageColors() [textures] REVIEWED: ImageClearBackground() and ImageDrawRectangleRec() (#1487) by @JeffM2501 [textures] REVIEWED: DrawTexturePro() and DrawRectanglePro() transformations (#1632) by @ChrisDill [text] REDESIGNED: DrawFPS() - [models] ADDED: UploadMesh() (#1529) [models] ADDED: UpdateMeshBuffer() [models] ADDED: DrawMesh() [models] ADDED: DrawMeshInstanced() [models] ADDED: UnloadModelAnimations() (#1648) by @object71 :( [models] REMOVED: DrawGizmo() - [models] REMOVED: LoadMeshes() [models] REMOVED: MeshNormalsSmooth() - [models] REVIEWED: DrawLine3D() (#1643) [audio] REVIEWED: Multichannel sound system (#1548) [audio] REVIEWED: jar_xm library (#1701) by @jmorel33 [utils] ADDED: SetLoadFileDataCallback() [utils] ADDED: SetSaveFileDataCallback() [utils] ADDED: SetLoadFileTextCallback() [utils] ADDED: SetSaveFileTextCallback() [examples] ADDED: text_draw_3d (#1689) by @Demizdor [examples] ADDED: textures_poly (#1677) by @chriscamacho [examples] ADDED: models_gltf_model (#1551) by @object71 [examples] RENAMED: shaders_rlgl_mesh_instanced to shaders_mesh_intancing [examples] REDESIGNED: shaders_rlgl_mesh_instanced by @moliad [examples] REDESIGNED: core_vr_simulator [examples] REDESIGNED: models_yaw_pitch_roll [build] ADDED: Config flag: SUPPORT_STANDARD_FILEIO [build] ADDED: Config flag: SUPPORT_WINMM_HIGHRES_TIMER (#1641) [build] ADDED: Config flag: SUPPORT_GL_DETAILS_INFO [build] ADDED: Examples projects to VS2019 solution [build] REVIEWED: Makefile to support PLATFORM_RPI (#1580) [build] REVIEWED: Multiple typecast warnings by @JeffM2501 [build] REDESIGNED: VS2019 project build paths [build] REDESIGNED: CMake build system by @object71 [_] RENAMED: Several functions parameters for consistency [_] UPDATED: Multiple bindings to latest version [_] UPDATED: All external libraries to latest versions [_] Multiple code improvements and fixes by multiple contributors! ## 3.5.0 (Done) Added: SetWindowState Added: ClearW‌indowState Added: IsWindowFocused Added: GetWindowScaleDPI Added: GetMonitorRefreshRate Added: IsCursorOnScreen Added: SetMouseCursor/GetMouseCursor Added: Normalize Added: Remap Added: Vector2Reflect Added: Vector2LengthSqr Added: Vector2MoveTowards Added: UnloadFontData Added: LoadFontFromMemmory(ttf) Added: ColorAlphaBlend Added: GetPixelColor Added: SetPixelColor Added: LoadImageFromMemory Added: LoadImageAnim Added: DrawTextureTiled Added: UpdateTextureRec Added: UnloadImageColors, Added: UnloadImagePallet, Added: UnloadWaveSample Added: DrawTriangle3D Added: DrawTriangleStrip3D Added: LoadWaveFromMemory Added: MemAlloc() / MemFree() Added: UnloadFileData Added: UnloadFileText ## 0.10.0 (WIP) - Basic macOS support. Currently untested. - Improved ergonomics across the board: - Copied over and tweaked many FFI structs so that fields use proper types instead of FFI types. - Added `vec2`, `vec3`, `quat`, `rgb`, and `rgba` convenience functions for a middle ground between `From` conversion and `new` methods. - Changed several key and gamepad functions to use `u32`, making it more ergonomic with key/gamepad constants. - Added optional `prelude` module for conveniently bringing in all the common types and definitions. - Fixed unnecessary `&mut` in `load_image_ex` and `draw_poly_ex`. - Fixed linking on MSVC toolchains by including `user32`. - Prevent `RaylibHandle` from being manually constructed. Fixes a safety soundness hole. ## 0.9.1 - Fixed docs.rs build by removing use of a uniform module path. This also keeps the crate compatible with Rust 1.31+. ## 0.9.0 - Initial crates.io release