瀏覽代碼

Merge pull request #20 from schveiguy/update42

Update42
Steven Schveighoffer 3 年之前
父節點
當前提交
d98db494ee
共有 16 個文件被更改,包括 3406 次插入3213 次删除
  1. 46 24
      README.md
  2. 10 8
      dub.json
  3. 11 30
      generating.md
  4. 3 242
      source/easings.d
  5. 2 0
      source/raygui.d
  6. 34 0
      source/raylib/binding.d
  7. 79 48
      source/raylib/package.d
  8. 99 0
      source/raylib/raylib_types.d
  9. 624 0
      source/raylib/raymath.d
  10. 320 0
      source/raylib/raymathext.d
  11. 244 0
      source/raylib/reasings.d
  12. 1926 0
      source/raylib/rlgl.d
  13. 2 97
      source/raylib_types.d
  14. 2 557
      source/raymath.d
  15. 2 323
      source/raymathext.d
  16. 2 1884
      source/rlgl.d

+ 46 - 24
README.md

@@ -3,13 +3,24 @@
 # raylib-d [![DUB](https://img.shields.io/dub/v/raylib-d?style=for-the-badge)](https://code.dlang.org/packages/raylib-d)
 # raylib-d [![DUB](https://img.shields.io/dub/v/raylib-d?style=for-the-badge)](https://code.dlang.org/packages/raylib-d)
 (static) D bindings for [raylib](https://www.raylib.com/), a simple and easy-to-use library to learn videogames programming.
 (static) D bindings for [raylib](https://www.raylib.com/), a simple and easy-to-use library to learn videogames programming.
 
 
-*Note: this is a resurrected copy of the original raylib-d. The original author, onroundit (Petro Romanovych) deleted his github acccount. Therefore, some links in this README are broken, and some of the history is lost for good. I will accept any PRs that fix broken links or replace original data, but the code history itself is intact.*
-
 # Installation
 # Installation
-`dub add raylib-d`
 
 
-## First, get a copy of Raylib
-You can get the library by compiling it from the [source](https://github.com/raysan5/raylib), download the [official precompiled binaries](https://github.com/raysan5/raylib/releases). The local copies of binaries are no longer available, as that history was lost.
+## Adding the dependency
+
+raylib-d is used via the [dub](https://code.dlang.org) build system.
+
+Use `dub add` to add raylib-d to the dependency list of an existing project:
+
+```sh
+> dub add raylib-d
+Adding dependency raylib-d ~>4.2.0
+>
+```
+
+Or you can add the dependency through the interactive prompts when creating your project with `dub init`
+
+## Get a copy of Raylib
+You can get the library by compiling it from the [source](https://github.com/raysan5/raylib), or download the [official precompiled binaries](https://github.com/raysan5/raylib/releases).
 
 
 *WARNING*: Make sure you get the correct copy of the raylib library based on the version of raylib-d! Getting the incorrect version will cause SILENT compatibility errors, including memory corruption. It is extremely important to match these together.
 *WARNING*: Make sure you get the correct copy of the raylib library based on the version of raylib-d! Getting the incorrect version will cause SILENT compatibility errors, including memory corruption. It is extremely important to match these together.
 
 
@@ -17,9 +28,23 @@ If you depend on raylib-d vX.Y.Z, then your raylib binary should be vX.Y.0. Note
 
 
 For example, if you depend on raylib-d version `v3.0.x`, then you should download raylib version `3.0.0`. If you depend on raylib-d version `3.7.x`, then you should download raylib version `3.7.0`.
 For example, if you depend on raylib-d version `v3.0.x`, then you should download raylib version `3.0.0`. If you depend on raylib-d version `3.7.x`, then you should download raylib version `3.7.0`.
 
 
-#### Linux/Mac:
+### Runtime validation of binding
+
+Starting with version 4.2.0, raylib-d includes a new module `raylib.binding`,
+which at the moment contains one function: `validateRaylibBinding`. @raysan5
+was kind enough to include a runtime-accessible version string for version
+4.2.0 of the library, so now we can validate the raylib binding mechanically
+without relying on proper environmental setup. So if you compile against one
+version, but link against another, you can call this function and it will exit
+the program with an error code if the binding is incorrect. This is better than
+creating memory corruption errors!
+
+If you link against an earlier verison of raylib, it should fail to link if
+this symbol doesn't exist.
 
 
-You must make raylib visible to the linkage binder. CD into the extracted raylib folder.
+### Linux/Mac:
+
+You must make raylib visible to the linker. `cd` into the extracted raylib folder (e.g. `raylib-4.2.0_macos`).
 
 
 Now we must make raylib visible to the compiler and linker system wide. Simply run the following.
 Now we must make raylib visible to the compiler and linker system wide. Simply run the following.
 ```
 ```
@@ -31,28 +56,23 @@ Linux users must also update the linker with this command:
 sudo ldconfig
 sudo ldconfig
 ```
 ```
 
 
-#### Windows:
+### Windows:
 On Windows you must drag and drop all the required library files into the root directory of your project. These are `raylib.dll`, `raylib.lib`, and `raylibdll.lib`.
 On Windows you must drag and drop all the required library files into the root directory of your project. These are `raylib.dll`, `raylib.lib`, and `raylibdll.lib`.
 
 
 ## In order to link against raylib, add it to your dub.json.
 ## In order to link against raylib, add it to your dub.json.
-#### Using version 4.0.0 as an example.
-### On Linux/Mac:
-```json
-"dependencies": { "raylib-d": "~>4.0.0" },
-"libs": [ "raylib" ],
-```
 
 
-### On Windows:
-Starting with `4.0.0`, raylib includes 2 windows linker files, `raylib.lib` for static linking (not recommended) and `raylibdll.lib` for dynamic linking. Even though the dll is called `raylib.dll`, use the `raylibdll` for the linker file to link dynamically.
-```json
-"dependencies": { "raylib-d": "~>4.0.0" },
-"libs": [ "raylibdll" ],
-```
 
 
+Starting with `4.0.0`, raylib on windows includes 2 windows linker files, `raylib.lib` for static linking (not recommended) and `raylibdll.lib` for dynamic linking. Even though the dll is called `raylib.dll`, use the `raylibdll` for the linker file to link dynamically.
+
+You can link against all oses correctly by using os-specific `libs` keys.
 
 
-(*Note: this is missing, but may be available from wayback machine*)
+Using version 4.2.0 as an example:
 
 
-For more information look into the [wiki](https://github.com/onroundit/raylib-d/wiki/Installation).
+```json
+"dependencies": { "raylib-d": "~>4.2.0" },
+"libs-posix": [ "raylib" ],
+"libs-windows": [ "raylibdll" ],
+```
 
 
 # Example
 # Example
 ```D
 ```D
@@ -60,6 +80,8 @@ import raylib;
 
 
 void main()
 void main()
 {
 {
+        // call this before using raylib
+        validateRaylibBinding();
 	InitWindow(800, 600, "Hello, Raylib-D!");
 	InitWindow(800, 600, "Hello, Raylib-D!");
 	while (!WindowShouldClose())
 	while (!WindowShouldClose())
 	{
 	{
@@ -72,9 +94,9 @@ void main()
 }
 }
 ```
 ```
 
 
-*Note: this is missing, but may be available from wayback machine*
+# Docs/Cheatsheet
 
 
-# [Docs / cheatsheet](https://github.com/onroundit/raylib-d/wiki/Docs-(cheatsheet))
+At the moment, we do not properly ddoc the binding. This may change in the near future. However, all documentation is valid from the raylib [online cheatsheet](https://www.raylib.com/cheatsheet/cheatsheet.html), or you can view the binding source files directly.
 
 
 # License
 # License
 raylib-d is licensed under an unmodified zlib/libpng license. View [LICENSE](LICENSE).
 raylib-d is licensed under an unmodified zlib/libpng license. View [LICENSE](LICENSE).

+ 10 - 8
dub.json

@@ -5,14 +5,16 @@
 	"authors": [
 	"authors": [
 		"ONROUNDIT"
 		"ONROUNDIT"
 	],
 	],
-	"copyright": "Copyright (c) Ramon Santamaria (@raysan5), Petro Romanovych (@onroundit), Jan Hoenig (@m3m0ry), Steven Schveighoffer (@schveiguy)",
-	"configurations": [
-        {
-            "name": "unittest",
-            "dependencies": {
-                "fluent-asserts": "~>0.13.0"
+        "configurations" : [
+            {
+                "name": "library"
+            },
+            {
+                "name": "unittest",
+                "versions" : ["raylib_test"]
             }
             }
-        }
-    ],	
+        ],
+	"copyright": "Copyright (c) Ramon Santamaria (@raysan5), Petro Romanovych (@onroundit), Jan Hoenig (@m3m0ry), Steven Schveighoffer (@schveiguy)",
+        "excludedSourceFiles": ["source/rlgl.d", "source/raymath.d", "source/easings.d", "source/raygui.d", "source/raymathext.d", "source/raylib_types.d"],
 	"targetType": "sourceLibrary"
 	"targetType": "sourceLibrary"
 }
 }

+ 11 - 30
generating.md

@@ -7,7 +7,7 @@ Three modules should be regenerated: `raylib`, `raymath` and `rlgl`.
 Run the following command from the `raylib/src` directory. Note: path/to/raylib-d should be the path to the raylib-d repository that you have on your system.
 Run the following command from the `raylib/src` directory. Note: path/to/raylib-d should be the path to the raylib-d repository that you have on your system.
 
 
 ```
 ```
-dstep raylib.h raymath.h rlgl.h -o path/to/raylib-d/source --space-after-function-name=false --skip Vector2 \
+dstep raylib.h raymath.h rlgl.h -o path/to/raylib-d/source/raylib --space-after-function-name=false --skip Vector2 \
     --skip Vector3 --skip Vector4 --skip Quaternion --skip Matrix --skip Rectangle --skip RL_MALLOC --skip RL_CALLOC \
     --skip Vector3 --skip Vector4 --skip Quaternion --skip Matrix --skip Rectangle --skip RL_MALLOC --skip RL_CALLOC \
     --skip RL_REALLOC --skip RL_FREE
     --skip RL_REALLOC --skip RL_FREE
 ```
 ```
@@ -15,6 +15,8 @@ dstep raylib.h raymath.h rlgl.h -o path/to/raylib-d/source --space-after-functio
 Note: we're skipping a couple symbols because we define them manually in `raylib_types`. We also skip memory functions
 Note: we're skipping a couple symbols because we define them manually in `raylib_types`. We also skip memory functions
 because they only have effect when compiling Raylib in C.
 because they only have effect when compiling Raylib in C.
 
 
+Finally, the `raylib.h` file will export as `raylib.d`, but it should be moved to `raylib/package.d`.
+
 After you regenerate them, they won't be ready to use yet. We need to add module declarations and imports at the top
 After you regenerate them, they won't be ready to use yet. We need to add module declarations and imports at the top
 of each module:
 of each module:
 
 
@@ -23,22 +25,23 @@ module raylib;
 
 
 public
 public
 {
 {
-    import rlgl;
-    import easings;
-    import raymath;
-    import raymathext;
-    import raylib_types;
+    import raylib.rlgl;
+    import raylib.reasings;
+    import raylib.raymath;
+    import raylib.raymathext;
+    import raylib.raylib_types;
+    import raylib.binding;
 }
 }
 ```
 ```
 
 
 ```d
 ```d
-module raymath;
+module raylib.raymath;
 
 
 import raylib;
 import raylib;
 ```
 ```
 
 
 ```d
 ```d
-module rlgl;
+module raylib.rlgl;
 
 
 import raylib;
 import raylib;
 ```
 ```
@@ -46,28 +49,6 @@ import raylib;
 Additionally, each of those modules will have an automatically generated `extern (C):` line. We need to find it and
 Additionally, each of those modules will have an automatically generated `extern (C):` line. We need to find it and
 edit it to `extern (C) @nogc nothrow:`.
 edit it to `extern (C) @nogc nothrow:`.
 
 
-## For version 3.7.0 and possibly earlier versions
-
-dstep will also make a mistake in `raylib.d` and incorrectly define a few `alias`es as `enum`s. Those must be fixed.
-Look for a block of code similar to this:
-
-```d
-// Temporal hacks to avoid breaking old codebases using
-// deprecated raylib implementation or definitions
-enum FormatText = TextFormat;
-enum LoadText = LoadFileText;
-enum GetExtension = GetFileExtension;
-enum GetImageData = LoadImageColors;
-enum FILTER_POINT = TextureFilter.TEXTURE_FILTER_POINT;
-enum FILTER_BILINEAR = TextureFilter.TEXTURE_FILTER_BILINEAR;
-enum MAP_DIFFUSE = MATERIAL_MAP_DIFFUSE;
-enum PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 = PixelFormat.PIXELFORMAT_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8;
-```
-
-Change `enum` for each of the functions `FormatText`, `LoadText`, `GetExtension`, and `GetImageData` to `alias`. The others can remain `enum`s.
-
-These definitions are not present since 4.0.0
-
 This should be enough. Run `dub test` and see if it compiles.
 This should be enough. Run `dub test` and see if it compiles.
 
 
 [dstep]: https://github.com/jacob-carlborg/dstep
 [dstep]: https://github.com/jacob-carlborg/dstep

+ 3 - 242
source/easings.d

@@ -1,243 +1,4 @@
-/*******************************************************************************************
-*
-*   raylib easings (header only file)
-*
-*   Useful easing functions for values animation
-*
-*   This header uses:
-*       #define EASINGS_STATIC_INLINE       // Inlines all functions code, so it runs faster.
-*                                           // This requires lots of memory on system.
-*   How to use:
-*   The four inputs t,b,c,d are defined as follows:
-*   t = current time (in any unit measure, but same unit as duration)
-*   b = starting value to interpolate
-*   c = the total change in value of b that needs to occur
-*   d = total time it should take to complete (duration)
-*
-*   Example:
-*
-*   int currentTime = 0;
-*   int duration = 100;
-*   float startPositionX = 0.0f;
-*   float finalPositionX = 30.0f;
-*   float currentPositionX = startPositionX;
-*
-*   while (currentPositionX < finalPositionX)
-*   {
-*       currentPositionX = EaseSineIn(currentTime, startPositionX, finalPositionX - startPositionX, duration);
-*       currentTime++;
-*   }
-*
-*   A port of Robert Penner's easing equations to C (http://robertpenner.com/easing/)
-*
-*   Robert Penner License
-*   ---------------------------------------------------------------------------------
-*   Open source under the BSD License.
-*
-*   Copyright (c) 2001 Robert Penner. All rights reserved.
-*
-*   Redistribution and use in source and binary forms, with or without modification,
-*   are permitted provided that the following conditions are met:
-*
-*       - Redistributions of source code must retain the above copyright notice,
-*         this list of conditions and the following disclaimer.
-*       - Redistributions in binary form must reproduce the above copyright notice,
-*         this list of conditions and the following disclaimer in the documentation
-*         and/or other materials provided with the distribution.
-*       - Neither the name of the author nor the names of contributors may be used
-*         to endorse or promote products derived from this software without specific
-*         prior written permission.
-*
-*   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-*   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-*   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-*   IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-*   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-*   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-*   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-*   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-*   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-*   OF THE POSSIBILITY OF SUCH DAMAGE.
-*   ---------------------------------------------------------------------------------
-*
-*   Copyright (c) 2015 Ramon Santamaria
-*
-*   This software is provided "as-is", without any express or implied warranty. In no event
-*   will the authors be held liable for any damages arising from the use of this software.
-*
-*   Permission is granted to anyone to use this software for any purpose, including commercial
-*   applications, and to alter it and redistribute it freely, subject to the following restrictions:
-*
-*     1. The origin of this software must not be misrepresented; you must not claim that you
-*     wrote the original software. If you use this software in a product, an acknowledgment
-*     in the product documentation would be appreciated but is not required.
-*
-*     2. Altered source versions must be plainly marked as such, and must not be misrepresented
-*     as being the original software.
-*
-*     3. This notice may not be removed or altered from any source distribution.
-*
-**********************************************************************************************/
+deprecated("module easings is deprecated, import raylib.reasings instead")
+module easings;
 
 
-extern (C):
-pragma(inline, true): // NOTE: By default, compile functions as static inline
-
-import core.stdc.math; // Required for: sinf(), cosf(), sqrt(), pow()
-
-enum PI = 3.14159265358979323846f; //Required as PI is not always defined in math.h
-
-// Linear Easing functions
-static float EaseLinearNone(float t, float b, float c, float d) { return (c*t/d + b); }
-static float EaseLinearIn(float t, float b, float c, float d) { return (c*t/d + b); }
-static float EaseLinearOut(float t, float b, float c, float d) { return (c*t/d + b); }
-static float EaseLinearInOut(float t,float b, float c, float d) { return (c*t/d + b); }
-
-// Sine Easing functions
-static float EaseSineIn(float t, float b, float c, float d) { return (-c*cosf(t/d*(PI/2.0f)) + c + b); }
-static float EaseSineOut(float t, float b, float c, float d) { return (c*sinf(t/d*(PI/2.0f)) + b); }
-static float EaseSineInOut(float t, float b, float c, float d) { return (-c/2.0f*(cosf(PI*t/d) - 1.0f) + b); }
-
-// Circular Easing functions
-static float EaseCircIn(float t, float b, float c, float d) { t /= d; return (-c*(sqrtf(1.0f - t*t) - 1.0f) + b); }
-static float EaseCircOut(float t, float b, float c, float d) { t = t/d - 1.0f; return (c*sqrtf(1.0f - t*t) + b); }
-static float EaseCircInOut(float t, float b, float c, float d)
-{
-    if ((t/=d/2.0f) < 1.0f) return (-c/2.0f*(sqrtf(1.0f - t*t) - 1.0f) + b);
-    t -= 2.0f; return (c/2.0f*(sqrtf(1.0f - t*t) + 1.0f) + b);
-}
-
-// Cubic Easing functions
-static float EaseCubicIn(float t, float b, float c, float d) { t /= d; return (c*t*t*t + b); }
-static float EaseCubicOut(float t, float b, float c, float d) { t = t/d - 1.0f; return (c*(t*t*t + 1.0f) + b); }
-static float EaseCubicInOut(float t, float b, float c, float d)
-{
-    if ((t/=d/2.0f) < 1.0f) return (c/2.0f*t*t*t + b);
-    t -= 2.0f; return (c/2.0f*(t*t*t + 2.0f) + b);
-}
-
-// Quadratic Easing functions
-static float EaseQuadIn(float t, float b, float c, float d) { t /= d; return (c*t*t + b); }
-static float EaseQuadOut(float t, float b, float c, float d) { t /= d; return (-c*t*(t - 2.0f) + b); }
-static float EaseQuadInOut(float t, float b, float c, float d)
-{
-    if ((t/=d/2) < 1) return (((c/2)*(t*t)) + b);
-    return (-c/2.0f*(((t - 1.0f)*(t - 3.0f)) - 1.0f) + b);
-}
-
-// Exponential Easing functions
-static float EaseExpoIn(float t, float b, float c, float d) { return (t == 0.0f) ? b : (c*powf(2.0f, 10.0f*(t/d - 1.0f)) + b); }
-static float EaseExpoOut(float t, float b, float c, float d) { return (t == d) ? (b + c) : (c*(-powf(2.0f, -10.0f*t/d) + 1.0f) + b);    }
-static float EaseExpoInOut(float t, float b, float c, float d)
-{
-    if (t == 0.0f) return b;
-    if (t == d) return (b + c);
-    if ((t/=d/2.0f) < 1.0f) return (c/2.0f*powf(2.0f, 10.0f*(t - 1.0f)) + b);
-
-    return (c/2.0f*(-powf(2.0f, -10.0f*(t - 1.0f)) + 2.0f) + b);
-}
-
-// Back Easing functions
-static float EaseBackIn(float t, float b, float c, float d)
-{
-    float s = 1.70158f;
-    float postFix = t/=d;
-    return (c*(postFix)*t*((s + 1.0f)*t - s) + b);
-}
-
-static float EaseBackOut(float t, float b, float c, float d)
-{
-    float s = 1.70158f;
-    t = t/d - 1.0f;
-    return (c*(t*t*((s + 1.0f)*t + s) + 1.0f) + b);
-}
-
-static float EaseBackInOut(float t, float b, float c, float d)
-{
-    float s = 1.70158f;
-    if ((t/=d/2.0f) < 1.0f)
-    {
-        s *= 1.525f;
-        return (c/2.0f*(t*t*((s + 1.0f)*t - s)) + b);
-    }
-
-    float postFix = t-=2.0f;
-    s *= 1.525f;
-    return (c/2.0f*((postFix)*t*((s + 1.0f)*t + s) + 2.0f) + b);
-}
-
-// Bounce Easing functions
-static float EaseBounceOut(float t, float b, float c, float d)
-{
-    if ((t/=d) < (1.0f/2.75f))
-    {
-        return (c*(7.5625f*t*t) + b);
-    }
-    else if (t < (2.0f/2.75f))
-    {
-        float postFix = t-=(1.5f/2.75f);
-        return (c*(7.5625f*(postFix)*t + 0.75f) + b);
-    }
-    else if (t < (2.5/2.75))
-    {
-        float postFix = t-=(2.25f/2.75f);
-        return (c*(7.5625f*(postFix)*t + 0.9375f) + b);
-    }
-    else
-    {
-        float postFix = t-=(2.625f/2.75f);
-        return (c*(7.5625f*(postFix)*t + 0.984375f) + b);
-    }
-}
-
-static float EaseBounceIn(float t, float b, float c, float d) { return (c - EaseBounceOut(d - t, 0.0f, c, d) + b); }
-static float EaseBounceInOut(float t, float b, float c, float d)
-{
-    if (t < d/2.0f) return (EaseBounceIn(t*2.0f, 0.0f, c, d)*0.5f + b);
-    else return (EaseBounceOut(t*2.0f - d, 0.0f, c, d)*0.5f + c*0.5f + b);
-}
-
-// Elastic Easing functions
-static float EaseElasticIn(float t, float b, float c, float d)
-{
-    if (t == 0.0f) return b;
-    if ((t/=d) == 1.0f) return (b + c);
-
-    float p = d*0.3f;
-    float a = c;
-    float s = p/4.0f;
-    float postFix = a*powf(2.0f, 10.0f*(t-=1.0f));
-
-    return (-(postFix*sinf((t*d-s)*(2.0f*PI)/p )) + b);
-}
-
-static float EaseElasticOut(float t, float b, float c, float d)
-{
-    if (t == 0.0f) return b;
-    if ((t/=d) == 1.0f) return (b + c);
-
-    float p = d*0.3f;
-    float a = c;
-    float s = p/4.0f;
-
-    return (a*powf(2.0f,-10.0f*t)*sinf((t*d-s)*(2.0f*PI)/p) + c + b);
-}
-
-static float EaseElasticInOut(float t, float b, float c, float d)
-{
-    if (t == 0.0f) return b;
-    if ((t/=d/2.0f) == 2.0f) return (b + c);
-
-    float p = d*(0.3f*1.5f);
-    float a = c;
-    float s = p/4.0f;
-
-    if (t < 1.0f)
-    {
-        float postFix = a*powf(2.0f, 10.0f*(t-=1.0f));
-        return -0.5f*(postFix*sinf((t*d-s)*(2.0f*PI)/p)) + b;
-    }
-
-    float postFix = a*powf(2.0f, -10.0f*(t-=1.0f));
-
-    return (postFix*sinf((t*d-s)*(2.0f*PI)/p)*0.5f + c + b);
-}
+public import raylib.reasings;

+ 2 - 0
source/raygui.d

@@ -1,3 +1,5 @@
+deprecated("raygui is not up to date and will be removed in a future version of raylib-d")
+module raygui;
 /*******************************************************************************************
 /*******************************************************************************************
 *
 *
 *   raygui v2.7 - A simple and easy-to-use immediate-mode gui library
 *   raygui v2.7 - A simple and easy-to-use immediate-mode gui library

+ 34 - 0
source/raylib/binding.d

@@ -0,0 +1,34 @@
+/**
+ * D-specialized raylib functions. These functions help the D experience on
+ * raylib.
+ */
+module raylib.binding;
+import raylib;
+
+// stored inside raylib to validate the binding
+private extern(C) extern __gshared const(char)* raylibVersion;
+
+/**
+ * Call this function before using any raylib functions to validate the binding
+ * matches what the header information says. If you don't call this, it's
+ * possible your binding will fail with such fun issues as memory corruption.
+ *
+ * If the binding is not valid, then the program will exit with a -1 error code.
+ *
+ * The function is not included when running raylib unittests, so there are no
+ * linker errors. (raylib-d unittests do not test the C binding)
+ */
+version(raylib_test) {} else
+void validateRaylibBinding() @nogc nothrow {
+    import core.stdc.stdio;
+    import core.stdc.stdlib;
+    import core.stdc.string;
+    auto rlv = raylibVersion[0 .. strlen(raylibVersion)];
+    if(rlv != RAYLIB_VERSION)
+    {
+        printf("FATAL ERROR: Raylib binding expected version %.*s, library version is %.*s\n",
+               cast(int)RAYLIB_VERSION.length, RAYLIB_VERSION.ptr,
+               cast(int)rlv.length, rlv.ptr);
+        exit(-1);
+    }
+}

+ 79 - 48
source/raylib.d → source/raylib/package.d

@@ -1,16 +1,6 @@
-module raylib;
-
-public
-{
-    import rlgl;
-    import easings;
-    import raymath;
-    import raymathext;
-    import raylib_types;
-}
 /**********************************************************************************************
 /**********************************************************************************************
 *
 *
-*   raylib v4.0 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com)
+*   raylib v4.2 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com)
 *
 *
 *   FEATURES:
 *   FEATURES:
 *       - NO external dependencies, all required libraries included with raylib
 *       - NO external dependencies, all required libraries included with raylib
@@ -43,8 +33,8 @@ public
 *
 *
 *   OPTIONAL DEPENDENCIES (included):
 *   OPTIONAL DEPENDENCIES (included):
 *       [rcore] msf_gif (Miles Fogle) for GIF recording
 *       [rcore] msf_gif (Miles Fogle) for GIF recording
-*       [rcore] sinfl (Micha Mettke) for DEFLATE decompression algorythm
-*       [rcore] sdefl (Micha Mettke) for DEFLATE compression algorythm
+*       [rcore] sinfl (Micha Mettke) for DEFLATE decompression algorithm
+*       [rcore] sdefl (Micha Mettke) for DEFLATE compression algorithm
 *       [rtextures] stb_image (Sean Barret) for images loading (BMP, TGA, PNG, JPEG, HDR...)
 *       [rtextures] stb_image (Sean Barret) for images loading (BMP, TGA, PNG, JPEG, HDR...)
 *       [rtextures] stb_image_write (Sean Barret) for image writing (BMP, TGA, PNG, JPG)
 *       [rtextures] stb_image_write (Sean Barret) for image writing (BMP, TGA, PNG, JPG)
 *       [rtextures] stb_image_resize (Sean Barret) for image resizing algorithms
 *       [rtextures] stb_image_resize (Sean Barret) for image resizing algorithms
@@ -66,7 +56,7 @@ public
 *   raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified,
 *   raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified,
 *   BSD-like license that allows static linking with closed source software:
 *   BSD-like license that allows static linking with closed source software:
 *
 *
-*   Copyright (c) 2013-2021 Ramon Santamaria (@raysan5)
+*   Copyright (c) 2013-2022 Ramon Santamaria (@raysan5)
 *
 *
 *   This software is provided "as-is", without any express or implied warranty. In no event
 *   This software is provided "as-is", without any express or implied warranty. In no event
 *   will the authors be held liable for any damages arising from the use of this software.
 *   will the authors be held liable for any damages arising from the use of this software.
@@ -84,6 +74,17 @@ public
 *     3. This notice may not be removed or altered from any source distribution.
 *     3. This notice may not be removed or altered from any source distribution.
 *
 *
 **********************************************************************************************/
 **********************************************************************************************/
+module raylib;
+
+public
+{
+    import raylib.rlgl;
+    import raylib.reasings;
+    import raylib.raymath;
+    import raylib.raymathext;
+    import raylib.raylib_types;
+    import raylib.binding;
+}
 
 
 import core.stdc.config;
 import core.stdc.config;
 import core.stdc.stdarg;
 import core.stdc.stdarg;
@@ -92,7 +93,7 @@ extern (C) @nogc nothrow:
 
 
 // Required for: va_list - Only used by TraceLogCallback
 // Required for: va_list - Only used by TraceLogCallback
 
 
-enum RAYLIB_VERSION = "4.0";
+enum RAYLIB_VERSION = "4.2";
 
 
 // Function specifiers in case library is build/used as a shared library (Windows)
 // Function specifiers in case library is build/used as a shared library (Windows)
 // NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll
 // NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll
@@ -112,6 +113,7 @@ enum DEG2RAD = PI / 180.0f;
 enum RAD2DEG = 180.0f / PI;
 enum RAD2DEG = 180.0f / PI;
 
 
 // Allow custom memory allocators
 // Allow custom memory allocators
+// NOTE: Require recompiling raylib sources
 
 
 // NOTE: MSVC C++ compiler does not support compound literals (C99 feature)
 // NOTE: MSVC C++ compiler does not support compound literals (C99 feature)
 // Plain structures in C++ (without constructors) can be initialized with { }
 // Plain structures in C++ (without constructors) can be initialized with { }
@@ -276,7 +278,7 @@ struct Mesh
     // Vertex attributes data
     // Vertex attributes data
     float* vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0)
     float* vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0)
     float* texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)
     float* texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)
-    float* texcoords2; // Vertex second texture coordinates (useful for lightmaps) (shader-location = 5)
+    float* texcoords2; // Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5)
     float* normals; // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2)
     float* normals; // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2)
     float* tangents; // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4)
     float* tangents; // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4)
     ubyte* colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
     ubyte* colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
@@ -390,12 +392,16 @@ struct Wave
     void* data; // Buffer data pointer
     void* data; // Buffer data pointer
 }
 }
 
 
+// Opaque structs declaration
+// NOTE: Actual structs are defined internally in raudio module
 struct rAudioBuffer;
 struct rAudioBuffer;
+struct rAudioProcessor;
 
 
 // AudioStream, custom audio stream
 // AudioStream, custom audio stream
 struct AudioStream
 struct AudioStream
 {
 {
     rAudioBuffer* buffer; // Pointer to internal data used by the audio system
     rAudioBuffer* buffer; // Pointer to internal data used by the audio system
+    rAudioProcessor* processor; // Pointer to internal data processor, useful for audio effects
 
 
     uint sampleRate; // Frequency (samples per second)
     uint sampleRate; // Frequency (samples per second)
     uint sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported)
     uint sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported)
@@ -448,6 +454,14 @@ struct VrStereoConfig
     float[2] scaleIn; // VR distortion scale in
     float[2] scaleIn; // VR distortion scale in
 }
 }
 
 
+// File path list
+struct FilePathList
+{
+    uint capacity; // Filepaths max entries
+    uint count; // Filepaths entries count
+    char** paths; // Filepaths entries
+}
+
 //----------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------
 // Enumerators Definition
 // Enumerators Definition
 //----------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------
@@ -468,6 +482,7 @@ enum ConfigFlags
     FLAG_WINDOW_ALWAYS_RUN = 0x00000100, // Set to allow windows running while minimized
     FLAG_WINDOW_ALWAYS_RUN = 0x00000100, // Set to allow windows running while minimized
     FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer
     FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer
     FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI
     FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI
+    FLAG_WINDOW_MOUSE_PASSTHROUGH = 0x00004000, // Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED
     FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X
     FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X
     FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D)
     FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D)
 }
 }
@@ -787,7 +802,7 @@ enum PixelFormat
 // NOTE 2: Filter is accordingly set for minification and magnification
 // NOTE 2: Filter is accordingly set for minification and magnification
 enum TextureFilter
 enum TextureFilter
 {
 {
-    TEXTURE_FILTER_POINT = 0, // No filter, just pixel aproximation
+    TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation
     TEXTURE_FILTER_BILINEAR = 1, // Linear filtering
     TEXTURE_FILTER_BILINEAR = 1, // Linear filtering
     TEXTURE_FILTER_TRILINEAR = 2, // Trilinear filtering (linear with mipmaps)
     TEXTURE_FILTER_TRILINEAR = 2, // Trilinear filtering (linear with mipmaps)
     TEXTURE_FILTER_ANISOTROPIC_4X = 3, // Anisotropic filtering 4x
     TEXTURE_FILTER_ANISOTROPIC_4X = 3, // Anisotropic filtering 4x
@@ -831,7 +846,8 @@ enum BlendMode
     BLEND_MULTIPLIED = 2, // Blend textures multiplying colors
     BLEND_MULTIPLIED = 2, // Blend textures multiplying colors
     BLEND_ADD_COLORS = 3, // Blend textures adding colors (alternative)
     BLEND_ADD_COLORS = 3, // Blend textures adding colors (alternative)
     BLEND_SUBTRACT_COLORS = 4, // Blend textures subtracting colors (alternative)
     BLEND_SUBTRACT_COLORS = 4, // Blend textures subtracting colors (alternative)
-    BLEND_CUSTOM = 5 // Belnd textures using custom src/dst factors (use rlSetBlendMode())
+    BLEND_ALPHA_PREMULTIPLY = 5, // Blend premultiplied textures considering alpha
+    BLEND_CUSTOM = 6 // Blend textures using custom src/dst factors (use rlSetBlendMode())
 }
 }
 
 
 // Gesture
 // Gesture
@@ -907,7 +923,7 @@ bool IsWindowMaximized(); // Check if window is currently maximized (only PLATFO
 bool IsWindowFocused(); // Check if window is currently focused (only PLATFORM_DESKTOP)
 bool IsWindowFocused(); // Check if window is currently focused (only PLATFORM_DESKTOP)
 bool IsWindowResized(); // Check if window has been resized last frame
 bool IsWindowResized(); // Check if window has been resized last frame
 bool IsWindowState(uint flag); // Check if one specific window flag is enabled
 bool IsWindowState(uint flag); // Check if one specific window flag is enabled
-void SetWindowState(uint flags); // Set window configuration state using flags
+void SetWindowState(uint flags); // Set window configuration state using flags (only PLATFORM_DESKTOP)
 void ClearWindowState(uint flags); // Clear window configuration state flags
 void ClearWindowState(uint flags); // Clear window configuration state flags
 void ToggleFullscreen(); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
 void ToggleFullscreen(); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP)
 void MaximizeWindow(); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
 void MaximizeWindow(); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP)
@@ -919,14 +935,17 @@ void SetWindowPosition(int x, int y); // Set window position on screen (only PLA
 void SetWindowMonitor(int monitor); // Set monitor for the current window (fullscreen mode)
 void SetWindowMonitor(int monitor); // Set monitor for the current window (fullscreen mode)
 void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
 void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
 void SetWindowSize(int width, int height); // Set window dimensions
 void SetWindowSize(int width, int height); // Set window dimensions
+void SetWindowOpacity(float opacity); // Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP)
 void* GetWindowHandle(); // Get native window handle
 void* GetWindowHandle(); // Get native window handle
 int GetScreenWidth(); // Get current screen width
 int GetScreenWidth(); // Get current screen width
 int GetScreenHeight(); // Get current screen height
 int GetScreenHeight(); // Get current screen height
+int GetRenderWidth(); // Get current render width (it considers HiDPI)
+int GetRenderHeight(); // Get current render height (it considers HiDPI)
 int GetMonitorCount(); // Get number of connected monitors
 int GetMonitorCount(); // Get number of connected monitors
 int GetCurrentMonitor(); // Get current connected monitor
 int GetCurrentMonitor(); // Get current connected monitor
 Vector2 GetMonitorPosition(int monitor); // Get specified monitor position
 Vector2 GetMonitorPosition(int monitor); // Get specified monitor position
-int GetMonitorWidth(int monitor); // Get specified monitor width (max available by monitor)
-int GetMonitorHeight(int monitor); // Get specified monitor height (max available by monitor)
+int GetMonitorWidth(int monitor); // Get specified monitor width (current video mode used by monitor)
+int GetMonitorHeight(int monitor); // Get specified monitor height (current video mode used by monitor)
 int GetMonitorPhysicalWidth(int monitor); // Get specified monitor physical width in millimetres
 int GetMonitorPhysicalWidth(int monitor); // Get specified monitor physical width in millimetres
 int GetMonitorPhysicalHeight(int monitor); // Get specified monitor physical height in millimetres
 int GetMonitorPhysicalHeight(int monitor); // Get specified monitor physical height in millimetres
 int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate
 int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate
@@ -935,6 +954,8 @@ Vector2 GetWindowScaleDPI(); // Get window scale DPI factor
 const(char)* GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the primary monitor
 const(char)* GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the primary monitor
 void SetClipboardText(const(char)* text); // Set clipboard text content
 void SetClipboardText(const(char)* text); // Set clipboard text content
 const(char)* GetClipboardText(); // Get clipboard text content
 const(char)* GetClipboardText(); // Get clipboard text content
+void EnableEventWaiting(); // Enable waiting for events on EndDrawing(), no automatic event polling
+void DisableEventWaiting(); // Disable waiting for events on EndDrawing(), automatic events polling
 
 
 // Custom frame control functions
 // Custom frame control functions
 // NOTE: Those functions are intended for advance users that want full control over the frame processing
 // NOTE: Those functions are intended for advance users that want full control over the frame processing
@@ -942,7 +963,7 @@ const(char)* GetClipboardText(); // Get clipboard text content
 // To avoid that behaviour and control frame processes manually, enable in config.h: SUPPORT_CUSTOM_FRAME_CONTROL
 // To avoid that behaviour and control frame processes manually, enable in config.h: SUPPORT_CUSTOM_FRAME_CONTROL
 void SwapScreenBuffer(); // Swap back buffer with front buffer (screen drawing)
 void SwapScreenBuffer(); // Swap back buffer with front buffer (screen drawing)
 void PollInputEvents(); // Register all input events
 void PollInputEvents(); // Register all input events
-void WaitTime(float ms); // Wait for some milliseconds (halt program execution)
+void WaitTime(double seconds); // Wait for some time (halt program execution)
 
 
 // Cursor-related functions
 // Cursor-related functions
 void ShowCursor(); // Shows cursor
 void ShowCursor(); // Shows cursor
@@ -992,9 +1013,9 @@ Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Get a ray trace from m
 Matrix GetCameraMatrix(Camera camera); // Get camera transform matrix (view matrix)
 Matrix GetCameraMatrix(Camera camera); // Get camera transform matrix (view matrix)
 Matrix GetCameraMatrix2D(Camera2D camera); // Get camera 2d transform matrix
 Matrix GetCameraMatrix2D(Camera2D camera); // Get camera 2d transform matrix
 Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Get the screen space position for a 3d world space position
 Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Get the screen space position for a 3d world space position
+Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); // Get the world space position for a 2d camera screen space position
 Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); // Get size position for a 3d world space position
 Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); // Get size position for a 3d world space position
 Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Get the screen space position for a 2d camera world space position
 Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Get the screen space position for a 2d camera world space position
-Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); // Get the world space position for a 2d camera screen space position
 
 
 // Timing-related functions
 // Timing-related functions
 void SetTargetFPS(int fps); // Set target FPS (maximum)
 void SetTargetFPS(int fps); // Set target FPS (maximum)
@@ -1014,6 +1035,8 @@ void* MemAlloc(int size); // Internal memory allocator
 void* MemRealloc(void* ptr, int size); // Internal memory reallocator
 void* MemRealloc(void* ptr, int size); // Internal memory reallocator
 void MemFree(void* ptr); // Internal memory free
 void MemFree(void* ptr); // Internal memory free
 
 
+void OpenURL(const(char)* url); // Open URL with default system browser (if available)
+
 // Set custom callbacks
 // Set custom callbacks
 // WARNING: Callbacks setup is intended for advance users
 // WARNING: Callbacks setup is intended for advance users
 void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log
 void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log
@@ -1026,37 +1049,36 @@ void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom file
 ubyte* LoadFileData(const(char)* fileName, uint* bytesRead); // Load file data as byte array (read)
 ubyte* LoadFileData(const(char)* fileName, uint* bytesRead); // Load file data as byte array (read)
 void UnloadFileData(ubyte* data); // Unload file data allocated by LoadFileData()
 void UnloadFileData(ubyte* data); // Unload file data allocated by LoadFileData()
 bool SaveFileData(const(char)* fileName, void* data, uint bytesToWrite); // Save data to file from byte array (write), returns true on success
 bool SaveFileData(const(char)* fileName, void* data, uint bytesToWrite); // Save data to file from byte array (write), returns true on success
+bool ExportDataAsCode(const(char)* data, uint size, const(char)* fileName); // Export data to code (.h), returns true on success
 char* LoadFileText(const(char)* fileName); // Load text data from file (read), returns a '\0' terminated string
 char* LoadFileText(const(char)* fileName); // Load text data from file (read), returns a '\0' terminated string
 void UnloadFileText(char* text); // Unload file text data allocated by LoadFileText()
 void UnloadFileText(char* text); // Unload file text data allocated by LoadFileText()
 bool SaveFileText(const(char)* fileName, char* text); // Save text data to file (write), string must be '\0' terminated, returns true on success
 bool SaveFileText(const(char)* fileName, char* text); // Save text data to file (write), string must be '\0' terminated, returns true on success
 bool FileExists(const(char)* fileName); // Check if file exists
 bool FileExists(const(char)* fileName); // Check if file exists
 bool DirectoryExists(const(char)* dirPath); // Check if a directory path exists
 bool DirectoryExists(const(char)* dirPath); // Check if a directory path exists
 bool IsFileExtension(const(char)* fileName, const(char)* ext); // Check file extension (including point: .png, .wav)
 bool IsFileExtension(const(char)* fileName, const(char)* ext); // Check file extension (including point: .png, .wav)
+int GetFileLength(const(char)* fileName); // Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h)
 const(char)* GetFileExtension(const(char)* fileName); // Get pointer to extension for a filename string (includes dot: '.png')
 const(char)* GetFileExtension(const(char)* fileName); // Get pointer to extension for a filename string (includes dot: '.png')
 const(char)* GetFileName(const(char)* filePath); // Get pointer to filename for a path string
 const(char)* GetFileName(const(char)* filePath); // Get pointer to filename for a path string
 const(char)* GetFileNameWithoutExt(const(char)* filePath); // Get filename string without extension (uses static string)
 const(char)* GetFileNameWithoutExt(const(char)* filePath); // Get filename string without extension (uses static string)
 const(char)* GetDirectoryPath(const(char)* filePath); // Get full path for a given fileName with path (uses static string)
 const(char)* GetDirectoryPath(const(char)* filePath); // Get full path for a given fileName with path (uses static string)
 const(char)* GetPrevDirectoryPath(const(char)* dirPath); // Get previous directory path for a given path (uses static string)
 const(char)* GetPrevDirectoryPath(const(char)* dirPath); // Get previous directory path for a given path (uses static string)
 const(char)* GetWorkingDirectory(); // Get current working directory (uses static string)
 const(char)* GetWorkingDirectory(); // Get current working directory (uses static string)
-char** GetDirectoryFiles(const(char)* dirPath, int* count); // Get filenames in a directory path (memory should be freed)
-void ClearDirectoryFiles(); // Clear directory files paths buffers (free memory)
+const(char)* GetApplicationDirectory(); // Get the directory if the running application (uses static string)
 bool ChangeDirectory(const(char)* dir); // Change working directory, return true on success
 bool ChangeDirectory(const(char)* dir); // Change working directory, return true on success
+bool IsPathFile(const(char)* path); // Check if a given path is a file or a directory
+FilePathList LoadDirectoryFiles(const(char)* dirPath); // Load directory filepaths
+FilePathList LoadDirectoryFilesEx(const(char)* basePath, const(char)* filter, bool scanSubdirs); // Load directory filepaths with extension filtering and recursive directory scan
+void UnloadDirectoryFiles(FilePathList files); // Unload filepaths
 bool IsFileDropped(); // Check if a file has been dropped into window
 bool IsFileDropped(); // Check if a file has been dropped into window
-char** GetDroppedFiles(int* count); // Get dropped files names (memory should be freed)
-void ClearDroppedFiles(); // Clear dropped files paths buffer (free memory)
+FilePathList LoadDroppedFiles(); // Load dropped filepaths
+void UnloadDroppedFiles(FilePathList files); // Unload dropped filepaths
 c_long GetFileModTime(const(char)* fileName); // Get file modification time (last write time)
 c_long GetFileModTime(const(char)* fileName); // Get file modification time (last write time)
 
 
 // Compression/Encoding functionality
 // Compression/Encoding functionality
-ubyte* CompressData(ubyte* data, int dataLength, int* compDataLength); // Compress data (DEFLATE algorithm)
-ubyte* DecompressData(ubyte* compData, int compDataLength, int* dataLength); // Decompress data (DEFLATE algorithm)
-char* EncodeDataBase64(const(ubyte)* data, int dataLength, int* outputLength); // Encode data to Base64 string
-ubyte* DecodeDataBase64(ubyte* data, int* outputLength); // Decode Base64 string data
-
-// Persistent storage management
-bool SaveStorageValue(uint position, int value); // Save integer value to storage file (to defined position), returns true on success
-int LoadStorageValue(uint position); // Load integer value from storage file (from defined position)
-
-void OpenURL(const(char)* url); // Open URL with default system browser (if available)
+ubyte* CompressData(const(ubyte)* data, int dataSize, int* compDataSize); // Compress data (DEFLATE algorithm), memory must be MemFree()
+ubyte* DecompressData(const(ubyte)* compData, int compDataSize, int* dataSize); // Decompress data (DEFLATE algorithm), memory must be MemFree()
+char* EncodeDataBase64(const(ubyte)* data, int dataSize, int* outputSize); // Encode data to Base64 string, memory must be MemFree()
+ubyte* DecodeDataBase64(const(ubyte)* data, int* outputSize); // Decode Base64 string data, memory must be MemFree()
 
 
 //------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------
 // Input Handling Functions (Module: core)
 // Input Handling Functions (Module: core)
@@ -1095,7 +1117,8 @@ Vector2 GetMouseDelta(); // Get mouse delta between frames
 void SetMousePosition(int x, int y); // Set mouse position XY
 void SetMousePosition(int x, int y); // Set mouse position XY
 void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset
 void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset
 void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling
 void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling
-float GetMouseWheelMove(); // Get mouse wheel movement Y
+float GetMouseWheelMove(); // Get mouse wheel movement for X or Y, whichever is larger
+Vector2 GetMouseWheelMoveV(); // Get mouse wheel movement for both X and Y
 void SetMouseCursor(int cursor); // Set mouse cursor
 void SetMouseCursor(int cursor); // Set mouse cursor
 
 
 // Input-related functions: touch
 // Input-related functions: touch
@@ -1310,13 +1333,14 @@ int GetPixelDataSize(int width, int height, int format); // Get pixel data size
 // Font loading/unloading functions
 // Font loading/unloading functions
 Font GetFontDefault(); // Get the default Font
 Font GetFontDefault(); // Get the default Font
 Font LoadFont(const(char)* fileName); // Load font from file into GPU memory (VRAM)
 Font LoadFont(const(char)* fileName); // Load font from file into GPU memory (VRAM)
-Font LoadFontEx(const(char)* fileName, int fontSize, int* fontChars, int glyphCount); // Load font from file with extended parameters
+Font LoadFontEx(const(char)* fileName, int fontSize, int* fontChars, int glyphCount); // Load font from file with extended parameters, use NULL for fontChars and 0 for glyphCount to load the default character set
 Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style)
 Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style)
 Font LoadFontFromMemory(const(char)* fileType, const(ubyte)* fileData, int dataSize, int fontSize, int* fontChars, int glyphCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf'
 Font LoadFontFromMemory(const(char)* fileType, const(ubyte)* fileData, int dataSize, int fontSize, int* fontChars, int glyphCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf'
 GlyphInfo* LoadFontData(const(ubyte)* fileData, int dataSize, int fontSize, int* fontChars, int glyphCount, int type); // Load font data for further use
 GlyphInfo* LoadFontData(const(ubyte)* fileData, int dataSize, int fontSize, int* fontChars, int glyphCount, int type); // Load font data for further use
 Image GenImageFontAtlas(const(GlyphInfo)* chars, Rectangle** recs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info
 Image GenImageFontAtlas(const(GlyphInfo)* chars, Rectangle** recs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info
 void UnloadFontData(GlyphInfo* chars, int glyphCount); // Unload font chars info data (RAM)
 void UnloadFontData(GlyphInfo* chars, int glyphCount); // Unload font chars info data (RAM)
-void UnloadFont(Font font); // Unload Font from GPU memory (VRAM)
+void UnloadFont(Font font); // Unload font from GPU memory (VRAM)
+bool ExportFontAsCode(Font font, const(char)* fileName); // Export font as code file, returns true on success
 
 
 // Text drawing functions
 // Text drawing functions
 void DrawFPS(int posX, int posY); // Draw current FPS
 void DrawFPS(int posX, int posY); // Draw current FPS
@@ -1324,6 +1348,7 @@ void DrawText(const(char)* text, int posX, int posY, int fontSize, Color color);
 void DrawTextEx(Font font, const(char)* text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters
 void DrawTextEx(Font font, const(char)* text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters
 void DrawTextPro(Font font, const(char)* text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint); // Draw text using Font and pro parameters (rotation)
 void DrawTextPro(Font font, const(char)* text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint); // Draw text using Font and pro parameters (rotation)
 void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint)
 void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint)
+void DrawTextCodepoints(Font font, const(int)* codepoints, int count, Vector2 position, float fontSize, float spacing, Color tint); // Draw multiple character (codepoint)
 
 
 // Text font info functions
 // Text font info functions
 int MeasureText(const(char)* text, int fontSize); // Measure string width for default font
 int MeasureText(const(char)* text, int fontSize); // Measure string width for default font
@@ -1338,7 +1363,7 @@ void UnloadCodepoints(int* codepoints); // Unload codepoints data from memory
 int GetCodepointCount(const(char)* text); // Get total number of codepoints in a UTF-8 encoded string
 int GetCodepointCount(const(char)* text); // Get total number of codepoints in a UTF-8 encoded string
 int GetCodepoint(const(char)* text, int* bytesProcessed); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure
 int GetCodepoint(const(char)* text, int* bytesProcessed); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure
 const(char)* CodepointToUTF8(int codepoint, int* byteSize); // Encode one codepoint into UTF-8 byte array (array length returned as parameter)
 const(char)* CodepointToUTF8(int codepoint, int* byteSize); // Encode one codepoint into UTF-8 byte array (array length returned as parameter)
-char* TextCodepointsToUTF8(int* codepoints, int length); // Encode text as codepoints array into UTF-8 text string (WARNING: memory must be freed!)
+char* TextCodepointsToUTF8(const(int)* codepoints, int length); // Encode text as codepoints array into UTF-8 text string (WARNING: memory must be freed!)
 
 
 // Text strings management functions (no UTF-8 strings, only byte chars)
 // Text strings management functions (no UTF-8 strings, only byte chars)
 // NOTE: Some strings allocate memory internally for returned strings, just be careful!
 // NOTE: Some strings allocate memory internally for returned strings, just be careful!
@@ -1408,14 +1433,13 @@ void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector
 
 
 // Mesh management functions
 // Mesh management functions
 void UploadMesh(Mesh* mesh, bool dynamic); // Upload mesh vertex data in GPU and provide VAO/VBO ids
 void UploadMesh(Mesh* mesh, bool dynamic); // Upload mesh vertex data in GPU and provide VAO/VBO ids
-void UpdateMeshBuffer(Mesh mesh, int index, void* data, int dataSize, int offset); // Update mesh vertex data in GPU for a specific buffer index
+void UpdateMeshBuffer(Mesh mesh, int index, const(void)* data, int dataSize, int offset); // Update mesh vertex data in GPU for a specific buffer index
 void UnloadMesh(Mesh mesh); // Unload mesh data from CPU and GPU
 void UnloadMesh(Mesh mesh); // Unload mesh data from CPU and GPU
 void DrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform
 void DrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform
-void DrawMeshInstanced(Mesh mesh, Material material, Matrix* transforms, int instances); // Draw multiple mesh instances with material and different transforms
+void DrawMeshInstanced(Mesh mesh, Material material, const(Matrix)* transforms, int instances); // Draw multiple mesh instances with material and different transforms
 bool ExportMesh(Mesh mesh, const(char)* fileName); // Export mesh data to file, returns true on success
 bool ExportMesh(Mesh mesh, const(char)* fileName); // Export mesh data to file, returns true on success
 BoundingBox GetMeshBoundingBox(Mesh mesh); // Compute mesh bounding box limits
 BoundingBox GetMeshBoundingBox(Mesh mesh); // Compute mesh bounding box limits
 void GenMeshTangents(Mesh* mesh); // Compute mesh tangents
 void GenMeshTangents(Mesh* mesh); // Compute mesh tangents
-void GenMeshBinormals(Mesh* mesh); // Compute mesh binormals
 
 
 // Mesh generation functions
 // Mesh generation functions
 Mesh GenMeshPoly(int sides, float radius); // Generate polygonal mesh
 Mesh GenMeshPoly(int sides, float radius); // Generate polygonal mesh
@@ -1450,7 +1474,6 @@ bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Check collision
 bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius); // Check collision between box and sphere
 bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius); // Check collision between box and sphere
 RayCollision GetRayCollisionSphere(Ray ray, Vector3 center, float radius); // Get collision info between ray and sphere
 RayCollision GetRayCollisionSphere(Ray ray, Vector3 center, float radius); // Get collision info between ray and sphere
 RayCollision GetRayCollisionBox(Ray ray, BoundingBox box); // Get collision info between ray and box
 RayCollision GetRayCollisionBox(Ray ray, BoundingBox box); // Get collision info between ray and box
-RayCollision GetRayCollisionModel(Ray ray, Model model); // Get collision info between ray and model
 RayCollision GetRayCollisionMesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh
 RayCollision GetRayCollisionMesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh
 RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle
 RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle
 RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4); // Get collision info between ray and quad
 RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4); // Get collision info between ray and quad
@@ -1458,6 +1481,7 @@ RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Ve
 //------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------
 // Audio Loading and Playing Functions (Module: audio)
 // Audio Loading and Playing Functions (Module: audio)
 //------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------
+alias AudioCallback = void function(void* bufferData, uint frames);
 
 
 // Audio device management functions
 // Audio device management functions
 void InitAudioDevice(); // Initialize audio device and context
 void InitAudioDevice(); // Initialize audio device and context
@@ -1487,15 +1511,16 @@ int GetSoundsPlaying(); // Get number of sounds playing in the multichannel
 bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing
 bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing
 void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level)
 void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level)
 void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level)
 void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level)
-void WaveFormat(Wave* wave, int sampleRate, int sampleSize, int channels); // Convert wave data to desired format
+void SetSoundPan(Sound sound, float pan); // Set pan for a sound (0.5 is center)
 Wave WaveCopy(Wave wave); // Copy a wave to a new wave
 Wave WaveCopy(Wave wave); // Copy a wave to a new wave
 void WaveCrop(Wave* wave, int initSample, int finalSample); // Crop a wave to defined samples range
 void WaveCrop(Wave* wave, int initSample, int finalSample); // Crop a wave to defined samples range
-float* LoadWaveSamples(Wave wave); // Load samples data from wave as a floats array
+void WaveFormat(Wave* wave, int sampleRate, int sampleSize, int channels); // Convert wave data to desired format
+float* LoadWaveSamples(Wave wave); // Load samples data from wave as a 32bit float data array
 void UnloadWaveSamples(float* samples); // Unload samples data loaded with LoadWaveSamples()
 void UnloadWaveSamples(float* samples); // Unload samples data loaded with LoadWaveSamples()
 
 
 // Music management functions
 // Music management functions
 Music LoadMusicStream(const(char)* fileName); // Load music stream from file
 Music LoadMusicStream(const(char)* fileName); // Load music stream from file
-Music LoadMusicStreamFromMemory(const(char)* fileType, ubyte* data, int dataSize); // Load music stream from data
+Music LoadMusicStreamFromMemory(const(char)* fileType, const(ubyte)* data, int dataSize); // Load music stream from data
 void UnloadMusicStream(Music music); // Unload music stream
 void UnloadMusicStream(Music music); // Unload music stream
 void PlayMusicStream(Music music); // Start music playing
 void PlayMusicStream(Music music); // Start music playing
 bool IsMusicStreamPlaying(Music music); // Check if music is playing
 bool IsMusicStreamPlaying(Music music); // Check if music is playing
@@ -1506,6 +1531,7 @@ void ResumeMusicStream(Music music); // Resume playing paused music
 void SeekMusicStream(Music music, float position); // Seek music to a position (in seconds)
 void SeekMusicStream(Music music, float position); // Seek music to a position (in seconds)
 void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level)
 void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level)
 void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level)
 void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level)
+void SetMusicPan(Music music, float pan); // Set pan for a music (0.5 is center)
 float GetMusicTimeLength(Music music); // Get music time length (in seconds)
 float GetMusicTimeLength(Music music); // Get music time length (in seconds)
 float GetMusicTimePlayed(Music music); // Get current music time played (in seconds)
 float GetMusicTimePlayed(Music music); // Get current music time played (in seconds)
 
 
@@ -1521,6 +1547,11 @@ bool IsAudioStreamPlaying(AudioStream stream); // Check if audio stream is playi
 void StopAudioStream(AudioStream stream); // Stop audio stream
 void StopAudioStream(AudioStream stream); // Stop audio stream
 void SetAudioStreamVolume(AudioStream stream, float volume); // Set volume for audio stream (1.0 is max level)
 void SetAudioStreamVolume(AudioStream stream, float volume); // Set volume for audio stream (1.0 is max level)
 void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level)
 void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level)
+void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered)
 void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams
 void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams
+void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data
+
+void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream
+void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream
 
 
 // RAYLIB_H
 // RAYLIB_H

+ 99 - 0
source/raylib/raylib_types.d

@@ -0,0 +1,99 @@
+/// This module defines basic types from Raylib with local modifications to make them easier to use.
+module raylib.raylib_types;
+
+import raylib;
+
+// Vector2 type
+struct Vector2
+{
+    float x = 0.0f;
+    float y = 0.0f;
+    mixin Linear;
+}
+
+// Vector3 type
+struct Vector3
+{
+    float x = 0.0f;
+    float y = 0.0f;
+    float z = 0.0f;
+    mixin Linear;
+}
+
+// Vector4 type
+struct Vector4
+{
+    float x = 0.0f;
+    float y = 0.0f;
+    float z = 0.0f;
+    float w = 0.0f;
+    mixin Linear;
+}
+
+// Quaternion type, same as Vector4
+alias Quaternion = Vector4;
+
+// Matrix type (OpenGL style 4x4 - right handed, column major)
+struct Matrix
+{
+    float m0 = 0.0f;
+    float m4 = 0.0f;
+    float m8 = 0.0f;
+    float m12 = 0.0f;
+    float m1 = 0.0f;
+    float m5 = 0.0f;
+    float m9 = 0.0f;
+    float m13 = 0.0f;
+    float m2 = 0.0f;
+    float m6 = 0.0f;
+    float m10 = 0.0f;
+    float m14 = 0.0f;
+    float m3 = 0.0f;
+    float m7 = 0.0f;
+    float m11 = 0.0f;
+    float m15 = 0.0f;
+}
+
+// Rectangle type
+struct Rectangle
+{
+    float x;
+    float y;
+    float width;
+    float height;
+    alias w = width;
+    alias h = height;
+}
+
+enum Colors
+{
+    // Some Basic Colors
+    // NOTE: Custom raylib color palette for amazing visuals on WHITE background
+    LIGHTGRAY = Color(200, 200, 200, 255), // Light Gray
+    GRAY = Color(130, 130, 130, 255), // Gray
+    DARKGRAY = Color(80, 80, 80, 255), // Dark Gray
+    YELLOW = Color(253, 249, 0, 255), // Yellow
+    GOLD = Color(255, 203, 0, 255), // Gold
+    ORANGE = Color(255, 161, 0, 255), // Orange
+    PINK = Color(255, 109, 194, 255), // Pink
+    RED = Color(230, 41, 55, 255), // Red
+    MAROON = Color(190, 33, 55, 255), // Maroon
+    GREEN = Color(0, 228, 48, 255), // Green
+    LIME = Color(0, 158, 47, 255), // Lime
+    DARKGREEN = Color(0, 117, 44, 255), // Dark Green
+    SKYBLUE = Color(102, 191, 255, 255), // Sky Blue
+    BLUE = Color(0, 121, 241, 255), // Blue
+    DARKBLUE = Color(0, 82, 172, 255), // Dark Blue
+    PURPLE = Color(200, 122, 255, 255), // Purple
+    VIOLET = Color(135, 60, 190, 255), // Violet
+    DARKPURPLE = Color(112, 31, 126, 255), // Dark Purple
+    BEIGE = Color(211, 176, 131, 255), // Beige
+    BROWN = Color(127, 106, 79, 255), // Brown
+    DARKBROWN = Color(76, 63, 47, 255), // Dark Brown
+
+    WHITE = Color(255, 255, 255, 255), // White
+    BLACK = Color(0, 0, 0, 255), // Black
+    BLANK = Color(0, 0, 0, 0), // Blank (Transparent)
+    MAGENTA = Color(255, 0, 255, 255), // Magenta
+    RAYWHITE = Color(245, 245, 245, 255), // My own White (raylib logo)
+}

+ 624 - 0
source/raylib/raymath.d

@@ -0,0 +1,624 @@
+module raylib.raymath;
+
+import raylib;
+/**********************************************************************************************
+*
+*   raymath v1.5 - Math functions to work with Vector2, Vector3, Matrix and Quaternions
+*
+*   CONFIGURATION:
+*
+*   #define RAYMATH_IMPLEMENTATION
+*       Generates the implementation of the library into the included file.
+*       If not defined, the library is in header only mode and can be included in other headers
+*       or source files without problems. But only ONE file should hold the implementation.
+*
+*   #define RAYMATH_STATIC_INLINE
+*       Define static inline functions code, so #include header suffices for use.
+*       This may use up lots of memory.
+*
+*   CONVENTIONS:
+*
+*     - Functions are always self-contained, no function use another raymath function inside,
+*       required code is directly re-implemented inside
+*     - Functions input parameters are always received by value (2 unavoidable exceptions)
+*     - Functions use always a "result" variable for return
+*     - Functions are always defined inline
+*     - Angles are always in radians (DEG2RAD/RAD2DEG macros provided for convenience)
+*
+*
+*   LICENSE: zlib/libpng
+*
+*   Copyright (c) 2015-2022 Ramon Santamaria (@raysan5)
+*
+*   This software is provided "as-is", without any express or implied warranty. In no event
+*   will the authors be held liable for any damages arising from the use of this software.
+*
+*   Permission is granted to anyone to use this software for any purpose, including commercial
+*   applications, and to alter it and redistribute it freely, subject to the following restrictions:
+*
+*     1. The origin of this software must not be misrepresented; you must not claim that you
+*     wrote the original software. If you use this software in a product, an acknowledgment
+*     in the product documentation would be appreciated but is not required.
+*
+*     2. Altered source versions must be plainly marked as such, and must not be misrepresented
+*     as being the original software.
+*
+*     3. This notice may not be removed or altered from any source distribution.
+*
+**********************************************************************************************/
+
+extern (C) @nogc nothrow:
+
+// Function specifiers definition
+
+// We are building raylib as a Win32 shared library (.dll).
+
+// We are using raylib as a Win32 shared library (.dll)
+
+// Provide external definition
+
+// Functions may be inlined, no external out-of-line definition
+
+// plain inline not supported by tinycc (See issue #435) // Functions may be inlined or external definition used
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+
+enum PI = 3.14159265358979323846f;
+
+enum EPSILON = 0.000001f;
+
+enum DEG2RAD = PI / 180.0f;
+
+enum RAD2DEG = 180.0f / PI;
+
+// Get float vector for Matrix
+
+extern (D) auto MatrixToFloat(T)(auto ref T mat)
+{
+    return MatrixToFloatV(mat).v;
+}
+
+// Get float vector for Vector3
+
+extern (D) auto Vector3ToFloat(T)(auto ref T vec)
+{
+    return Vector3ToFloatV(vec).v;
+}
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+
+// Vector2 type
+
+// Vector3 type
+
+// Vector4 type
+
+// Quaternion type
+
+// Matrix type (OpenGL style 4x4 - right handed, column major)
+
+// Matrix first row (4 components)
+// Matrix second row (4 components)
+// Matrix third row (4 components)
+// Matrix fourth row (4 components)
+
+// NOTE: Helper types to be used instead of array return types for *ToFloat functions
+struct float3
+{
+    float[3] v;
+}
+
+struct float16
+{
+    float[16] v;
+}
+
+// Required for: sinf(), cosf(), tan(), atan2f(), sqrtf(), floor(), fminf(), fmaxf(), fabs()
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - Utils math
+//----------------------------------------------------------------------------------
+
+// Clamp float value
+float Clamp(float value, float min, float max);
+
+// Calculate linear interpolation between two floats
+float Lerp(float start, float end, float amount);
+
+// Normalize input value within input range
+float Normalize(float value, float start, float end);
+
+// Remap input value within input range to output range
+float Remap(
+    float value,
+    float inputStart,
+    float inputEnd,
+    float outputStart,
+    float outputEnd);
+
+// Wrap input value from min to max
+float Wrap(float value, float min, float max);
+
+// Check whether two given floats are almost equal
+int FloatEquals(float x, float y);
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - Vector2 math
+//----------------------------------------------------------------------------------
+
+// Vector with components value 0.0f
+Vector2 Vector2Zero();
+
+// Vector with components value 1.0f
+Vector2 Vector2One();
+
+// Add two vectors (v1 + v2)
+Vector2 Vector2Add(Vector2 v1, Vector2 v2);
+
+// Add vector and float value
+Vector2 Vector2AddValue(Vector2 v, float add);
+
+// Subtract two vectors (v1 - v2)
+Vector2 Vector2Subtract(Vector2 v1, Vector2 v2);
+
+// Subtract vector by float value
+Vector2 Vector2SubtractValue(Vector2 v, float sub);
+
+// Calculate vector length
+float Vector2Length(Vector2 v);
+
+// Calculate vector square length
+float Vector2LengthSqr(Vector2 v);
+
+// Calculate two vectors dot product
+float Vector2DotProduct(Vector2 v1, Vector2 v2);
+
+// Calculate distance between two vectors
+float Vector2Distance(Vector2 v1, Vector2 v2);
+
+// Calculate square distance between two vectors
+float Vector2DistanceSqr(Vector2 v1, Vector2 v2);
+
+// Calculate angle from two vectors
+float Vector2Angle(Vector2 v1, Vector2 v2);
+
+// Scale vector (multiply by value)
+Vector2 Vector2Scale(Vector2 v, float scale);
+
+// Multiply vector by vector
+Vector2 Vector2Multiply(Vector2 v1, Vector2 v2);
+
+// Negate vector
+Vector2 Vector2Negate(Vector2 v);
+
+// Divide vector by vector
+Vector2 Vector2Divide(Vector2 v1, Vector2 v2);
+
+// Normalize provided vector
+Vector2 Vector2Normalize(Vector2 v);
+
+// Transforms a Vector2 by a given Matrix
+Vector2 Vector2Transform(Vector2 v, Matrix mat);
+
+// Calculate linear interpolation between two vectors
+Vector2 Vector2Lerp(Vector2 v1, Vector2 v2, float amount);
+
+// Calculate reflected vector to normal
+
+// Dot product
+Vector2 Vector2Reflect(Vector2 v, Vector2 normal);
+
+// Rotate vector by angle
+Vector2 Vector2Rotate(Vector2 v, float angle);
+
+// Move Vector towards target
+Vector2 Vector2MoveTowards(Vector2 v, Vector2 target, float maxDistance);
+
+// Invert the given vector
+Vector2 Vector2Invert(Vector2 v);
+
+// Clamp the components of the vector between
+// min and max values specified by the given vectors
+Vector2 Vector2Clamp(Vector2 v, Vector2 min, Vector2 max);
+
+// Clamp the magnitude of the vector between two min and max values
+Vector2 Vector2ClampValue(Vector2 v, float min, float max);
+
+// Check whether two given vectors are almost equal
+int Vector2Equals(Vector2 p, Vector2 q);
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - Vector3 math
+//----------------------------------------------------------------------------------
+
+// Vector with components value 0.0f
+Vector3 Vector3Zero();
+
+// Vector with components value 1.0f
+Vector3 Vector3One();
+
+// Add two vectors
+Vector3 Vector3Add(Vector3 v1, Vector3 v2);
+
+// Add vector and float value
+Vector3 Vector3AddValue(Vector3 v, float add);
+
+// Subtract two vectors
+Vector3 Vector3Subtract(Vector3 v1, Vector3 v2);
+
+// Subtract vector by float value
+Vector3 Vector3SubtractValue(Vector3 v, float sub);
+
+// Multiply vector by scalar
+Vector3 Vector3Scale(Vector3 v, float scalar);
+
+// Multiply vector by vector
+Vector3 Vector3Multiply(Vector3 v1, Vector3 v2);
+
+// Calculate two vectors cross product
+Vector3 Vector3CrossProduct(Vector3 v1, Vector3 v2);
+
+// Calculate one vector perpendicular vector
+
+// Cross product between vectors
+Vector3 Vector3Perpendicular(Vector3 v);
+
+// Calculate vector length
+float Vector3Length(const Vector3 v);
+
+// Calculate vector square length
+float Vector3LengthSqr(const Vector3 v);
+
+// Calculate two vectors dot product
+float Vector3DotProduct(Vector3 v1, Vector3 v2);
+
+// Calculate distance between two vectors
+float Vector3Distance(Vector3 v1, Vector3 v2);
+
+// Calculate square distance between two vectors
+float Vector3DistanceSqr(Vector3 v1, Vector3 v2);
+
+// Calculate angle between two vectors
+float Vector3Angle(Vector3 v1, Vector3 v2);
+
+// Negate provided vector (invert direction)
+Vector3 Vector3Negate(Vector3 v);
+
+// Divide vector by vector
+Vector3 Vector3Divide(Vector3 v1, Vector3 v2);
+
+// Normalize provided vector
+Vector3 Vector3Normalize(Vector3 v);
+
+// Orthonormalize provided vectors
+// Makes vectors normalized and orthogonal to each other
+// Gram-Schmidt function implementation
+
+// Vector3Normalize(*v1);
+
+// Vector3CrossProduct(*v1, *v2)
+
+// Vector3Normalize(vn1);
+
+// Vector3CrossProduct(vn1, *v1)
+void Vector3OrthoNormalize(Vector3* v1, Vector3* v2);
+
+// Transforms a Vector3 by a given Matrix
+Vector3 Vector3Transform(Vector3 v, Matrix mat);
+
+// Transform a vector by quaternion rotation
+Vector3 Vector3RotateByQuaternion(Vector3 v, Quaternion q);
+
+// Rotates a vector around an axis
+
+// Using Euler-Rodrigues Formula
+// Ref.: https://en.wikipedia.org/w/index.php?title=Euler%E2%80%93Rodrigues_formula
+
+// Vector3Normalize(axis);
+
+// Vector3CrossProduct(w, v)
+
+// Vector3CrossProduct(w, wv)
+
+// Vector3Scale(wv, 2 * a)
+
+// Vector3Scale(wwv, 2)
+Vector3 Vector3RotateByAxisAngle(Vector3 v, Vector3 axis, float angle);
+
+// Calculate linear interpolation between two vectors
+Vector3 Vector3Lerp(Vector3 v1, Vector3 v2, float amount);
+
+// Calculate reflected vector to normal
+
+// I is the original vector
+// N is the normal of the incident plane
+// R = I - (2*N*(DotProduct[I, N]))
+Vector3 Vector3Reflect(Vector3 v, Vector3 normal);
+
+// Get min value for each pair of components
+Vector3 Vector3Min(Vector3 v1, Vector3 v2);
+
+// Get max value for each pair of components
+Vector3 Vector3Max(Vector3 v1, Vector3 v2);
+
+// Compute barycenter coordinates (u, v, w) for point p with respect to triangle (a, b, c)
+// NOTE: Assumes P is on the plane of the triangle
+
+// Vector3Subtract(b, a)
+// Vector3Subtract(c, a)
+// Vector3Subtract(p, a)
+// Vector3DotProduct(v0, v0)
+// Vector3DotProduct(v0, v1)
+// Vector3DotProduct(v1, v1)
+// Vector3DotProduct(v2, v0)
+// Vector3DotProduct(v2, v1)
+Vector3 Vector3Barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c);
+
+// Projects a Vector3 from screen space into object space
+// NOTE: We are avoiding calling other raymath functions despite available
+
+// Calculate unproject matrix (multiply view patrix by projection matrix) and invert it
+// MatrixMultiply(view, projection);
+
+// Calculate inverted matrix -> MatrixInvert(matViewProj);
+// Cache the matrix values (speed optimization)
+
+// Calculate the invert determinant (inlined to avoid double-caching)
+
+// Create quaternion from source point
+
+// Multiply quat point by unproject matrix
+// QuaternionTransform(quat, matViewProjInv)
+
+// Normalized world points in vectors
+Vector3 Vector3Unproject(Vector3 source, Matrix projection, Matrix view);
+
+// Get Vector3 as float array
+float3 Vector3ToFloatV(Vector3 v);
+
+// Invert the given vector
+Vector3 Vector3Invert(Vector3 v);
+
+// Clamp the components of the vector between
+// min and max values specified by the given vectors
+Vector3 Vector3Clamp(Vector3 v, Vector3 min, Vector3 max);
+
+// Clamp the magnitude of the vector between two values
+Vector3 Vector3ClampValue(Vector3 v, float min, float max);
+
+// Check whether two given vectors are almost equal
+int Vector3Equals(Vector3 p, Vector3 q);
+
+// Compute the direction of a refracted ray where v specifies the
+// normalized direction of the incoming ray, n specifies the
+// normalized normal vector of the interface of two optical media,
+// and r specifies the ratio of the refractive index of the medium
+// from where the ray comes to the refractive index of the medium
+// on the other side of the surface
+Vector3 Vector3Refract(Vector3 v, Vector3 n, float r);
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - Matrix math
+//----------------------------------------------------------------------------------
+
+// Compute matrix determinant
+
+// Cache the matrix values (speed optimization)
+float MatrixDeterminant(Matrix mat);
+
+// Get the trace of the matrix (sum of the values along the diagonal)
+float MatrixTrace(Matrix mat);
+
+// Transposes provided matrix
+Matrix MatrixTranspose(Matrix mat);
+
+// Invert provided matrix
+
+// Cache the matrix values (speed optimization)
+
+// Calculate the invert determinant (inlined to avoid double-caching)
+Matrix MatrixInvert(Matrix mat);
+
+// Get identity matrix
+Matrix MatrixIdentity();
+
+// Add two matrices
+Matrix MatrixAdd(Matrix left, Matrix right);
+
+// Subtract two matrices (left - right)
+Matrix MatrixSubtract(Matrix left, Matrix right);
+
+// Get two matrix multiplication
+// NOTE: When multiplying matrices... the order matters!
+Matrix MatrixMultiply(Matrix left, Matrix right);
+
+// Get translation matrix
+Matrix MatrixTranslate(float x, float y, float z);
+
+// Create rotation matrix from axis and angle
+// NOTE: Angle should be provided in radians
+Matrix MatrixRotate(Vector3 axis, float angle);
+
+// Get x-rotation matrix
+// NOTE: Angle must be provided in radians
+
+// MatrixIdentity()
+Matrix MatrixRotateX(float angle);
+
+// Get y-rotation matrix
+// NOTE: Angle must be provided in radians
+
+// MatrixIdentity()
+Matrix MatrixRotateY(float angle);
+
+// Get z-rotation matrix
+// NOTE: Angle must be provided in radians
+
+// MatrixIdentity()
+Matrix MatrixRotateZ(float angle);
+
+// Get xyz-rotation matrix
+// NOTE: Angle must be provided in radians
+
+// MatrixIdentity()
+Matrix MatrixRotateXYZ(Vector3 angle);
+
+// Get zyx-rotation matrix
+// NOTE: Angle must be provided in radians
+Matrix MatrixRotateZYX(Vector3 angle);
+
+// Get scaling matrix
+Matrix MatrixScale(float x, float y, float z);
+
+// Get perspective projection matrix
+Matrix MatrixFrustum(
+    double left,
+    double right,
+    double bottom,
+    double top,
+    double near,
+    double far);
+
+// Get perspective projection matrix
+// NOTE: Fovy angle must be provided in radians
+
+// MatrixFrustum(-right, right, -top, top, near, far);
+Matrix MatrixPerspective(double fovy, double aspect, double near, double far);
+
+// Get orthographic projection matrix
+Matrix MatrixOrtho(
+    double left,
+    double right,
+    double bottom,
+    double top,
+    double near,
+    double far);
+
+// Get camera look-at matrix (view matrix)
+
+// Vector3Subtract(eye, target)
+
+// Vector3Normalize(vz)
+
+// Vector3CrossProduct(up, vz)
+
+// Vector3Normalize(x)
+
+// Vector3CrossProduct(vz, vx)
+
+// Vector3DotProduct(vx, eye)
+// Vector3DotProduct(vy, eye)
+// Vector3DotProduct(vz, eye)
+Matrix MatrixLookAt(Vector3 eye, Vector3 target, Vector3 up);
+
+// Get float array of matrix data
+float16 MatrixToFloatV(Matrix mat);
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - Quaternion math
+//----------------------------------------------------------------------------------
+
+// Add two quaternions
+Quaternion QuaternionAdd(Quaternion q1, Quaternion q2);
+
+// Add quaternion and float value
+Quaternion QuaternionAddValue(Quaternion q, float add);
+
+// Subtract two quaternions
+Quaternion QuaternionSubtract(Quaternion q1, Quaternion q2);
+
+// Subtract quaternion and float value
+Quaternion QuaternionSubtractValue(Quaternion q, float sub);
+
+// Get identity quaternion
+Quaternion QuaternionIdentity();
+
+// Computes the length of a quaternion
+float QuaternionLength(Quaternion q);
+
+// Normalize provided quaternion
+Quaternion QuaternionNormalize(Quaternion q);
+
+// Invert provided quaternion
+Quaternion QuaternionInvert(Quaternion q);
+
+// Calculate two quaternion multiplication
+Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2);
+
+// Scale quaternion by float value
+Quaternion QuaternionScale(Quaternion q, float mul);
+
+// Divide two quaternions
+Quaternion QuaternionDivide(Quaternion q1, Quaternion q2);
+
+// Calculate linear interpolation between two quaternions
+Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount);
+
+// Calculate slerp-optimized interpolation between two quaternions
+
+// QuaternionLerp(q1, q2, amount)
+
+// QuaternionNormalize(q);
+Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount);
+
+// Calculates spherical linear interpolation between two quaternions
+Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount);
+
+// Calculate quaternion based on the rotation from one vector to another
+
+// Vector3DotProduct(from, to)
+// Vector3CrossProduct(from, to)
+
+// QuaternionNormalize(q);
+// NOTE: Normalize to essentially nlerp the original and identity to 0.5
+Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to);
+
+// Get a quaternion for a given rotation matrix
+Quaternion QuaternionFromMatrix(Matrix mat);
+
+// Get a matrix for a given quaternion
+
+// MatrixIdentity()
+Matrix QuaternionToMatrix(Quaternion q);
+
+// Get rotation quaternion for an angle and axis
+// NOTE: Angle must be provided in radians
+
+// Vector3Normalize(axis)
+
+// QuaternionNormalize(q);
+Quaternion QuaternionFromAxisAngle(Vector3 axis, float angle);
+
+// Get the rotation angle and axis for a given quaternion
+
+// QuaternionNormalize(q);
+
+// This occurs when the angle is zero.
+// Not a problem: just set an arbitrary normalized axis.
+void QuaternionToAxisAngle(Quaternion q, Vector3* outAxis, float* outAngle);
+
+// Get the quaternion equivalent to Euler angles
+// NOTE: Rotation order is ZYX
+Quaternion QuaternionFromEuler(float pitch, float yaw, float roll);
+
+// Get the Euler angles equivalent to quaternion (roll, pitch, yaw)
+// NOTE: Angles are returned in a Vector3 struct in radians
+
+// Roll (x-axis rotation)
+
+// Pitch (y-axis rotation)
+
+// Yaw (z-axis rotation)
+Vector3 QuaternionToEuler(Quaternion q);
+
+// Transform a quaternion given a transformation matrix
+Quaternion QuaternionTransform(Quaternion q, Matrix mat);
+
+// Check whether two given quaternions are almost equal
+int QuaternionEquals(Quaternion p, Quaternion q);
+
+// RAYMATH_H

+ 320 - 0
source/raylib/raymathext.d

@@ -0,0 +1,320 @@
+module raylib.raymathext;
+
+import raylib;
+import std.math;
+
+pragma(inline, true):
+
+// Bivector2 type
+struct Bivector2
+{
+    float xy = 0.0f;
+    alias xy this;
+    mixin Linear;
+}
+
+// Bivector3 type
+/// Beware of the field order
+/// xy is the first field
+struct Bivector3
+{
+    float xy = 0.0f;
+    float yz = 0.0f;
+    float zx = 0.0f;
+    mixin Linear;
+}
+
+// Rotor type
+struct Rotor3
+{
+    float a = 1.0f;
+    float xy = 0.0f;
+    float yz = 0.0f;
+    float zx = 0.0f;
+    mixin Linear;
+
+    alias i = yz;
+    alias j = zx;
+    alias k = xy;
+
+    @property Bivector3 b()
+    {
+        return Bivector3(xy, yz, zx);
+    }
+
+    @property Bivector3 b(Bivector3 _b)
+    {
+        xy = _b.xy;
+        yz = _b.yz;
+        zx = _b.zx;
+        return _b;
+    }
+
+    this(float _a, Bivector3 _b)
+    {
+        a = _a;
+        b = _b;
+    }
+
+    this(float _a, float _xy, float _yz, float _zx)
+    {
+        a = _a;
+        xy = _xy;
+        yz = _yz;
+        zx = _zx;
+    }
+}
+
+alias Matrix4 = Matrix;
+
+mixin template Linear()
+{
+    import std.algorithm : canFind, map;
+    import std.range : join;
+    import std.traits : FieldNameTuple;
+
+    private static alias T = typeof(this);
+
+    static T zero()
+    {
+        enum fragment = [FieldNameTuple!T].map!(field => "0.").join(",");
+        return mixin("T(" ~ fragment ~ ")");
+    }
+
+    static T one()
+    {
+        enum fragment = [FieldNameTuple!T].map!(field => "1.").join(",");
+        return mixin("T(" ~ fragment ~ ")");
+    }
+
+    inout T opUnary(string op)() if (["+", "-"].canFind(op))
+    {
+        enum fragment = [FieldNameTuple!T].map!(field => op ~ field).join(",");
+        return mixin("T(" ~ fragment ~ ")");
+    }
+
+    static if (is(T == Rotor3))
+    {
+        /// Returns a rotor equivalent to first apply p, then apply q
+        inout Rotor3 opBinary(string op)(inout Rotor3 q) if (op == "*")
+        {
+            alias p = this;
+            Rotor3 r;
+            r.a = p.a * q.a - p.i * q.i - p.j * q.j - p.k * q.k;
+            r.i = p.i * q.a + p.a * q.i + p.j * q.k - p.k * q.j;
+            r.j = p.j * q.a + p.a * q.j + p.k * q.i - p.i * q.k;
+            r.k = p.k * q.a + p.a * q.k + p.i * q.j - p.j * q.i;
+            return r;
+        }
+
+        inout Vector3 opBinary(string op)(inout Vector3 v) if (op == "*")
+        {
+            Vector3 rv;
+            rv.x = a * v.x + xy * v.y - zx * v.z;
+            rv.y = a * v.y + yz * v.z - xy * v.x;
+            rv.z = a * v.z + zx * v.x - yz * v.y;
+            return rv;
+        }
+
+        inout Vector3 opBinaryRight(string op)(inout Vector3 v) if (op == "*")
+        {
+            Vector3 vr;
+            vr.x = v.x * a - v.y * xy + v.z * zx;
+            vr.y = v.y * a - v.z * yz + v.x * xy;
+            vr.z = v.z * a - v.x * zx + v.y * yz;
+            return vr;
+        }
+    }
+    else
+    {
+        inout T opBinary(string op)(inout T rhs) if (["+", "-"].canFind(op))
+        {
+            enum fragment = [FieldNameTuple!T].map!(field => field ~ op ~ "rhs." ~ field).join(",");
+            return mixin("T(" ~ fragment ~ ")");
+        }
+
+        ref T opOpAssign(string op)(inout T rhs) if (["+", "-"].canFind(op))
+        {
+            static foreach (field; [FieldNameTuple!T])
+                mixin(field ~ op ~ "= rhs." ~ field ~ ";");
+            return this;
+        }
+    }
+
+    inout T opBinary(string op)(inout float rhs) if (["+", "-", "*", "/"].canFind(op))
+    {
+        enum fragment = [FieldNameTuple!T].map!(field => field ~ op ~ "rhs").join(",");
+        return mixin("T(" ~ fragment ~ ")");
+    }
+
+    inout T opBinaryRight(string op)(inout float lhs) if (["+", "-", "*", "/"].canFind(op))
+    {
+        enum fragment = [FieldNameTuple!T].map!(field => "lhs" ~ op ~ field).join(",");
+        return mixin("T(" ~ fragment ~ ")");
+    }
+
+    ref T opOpAssign(string op)(inout float rhs) if (["+", "-", "*", "/"].canFind(op))
+    {
+        static foreach (field; [FieldNameTuple!T])
+            mixin(field ~ op ~ "= rhs;");
+        return this;
+    }
+}
+
+unittest
+{
+    assert(Vector2.init == Vector2.zero);
+    assert(Vector2() == Vector2.zero);
+    assert(-Vector2(1, 2) == Vector2(-1, -2));
+    auto a = Vector3(1, 2, 9);
+    immutable b = Vector3(3, 4, 9);
+    Vector3 c = a + b;
+    assert(c == Vector3(4, 6, 18));
+    assert(4.0f - Vector2.zero == Vector2(4, 4));
+    assert(Vector2.one - 3.0f == Vector2(-2, -2));
+    a += 5;
+    assert(a == Vector3(6, 7, 14));
+    a *= 0.5;
+    assert(a == Vector3(3, 3.5, 7));
+    a += Vector3(3, 2.5, -1);
+    assert(a == Vector3(6, 6, 6));
+}
+
+import std.traits : FieldNameTuple;
+import std.algorithm : map;
+import std.range : join;
+
+float length(T)(T v)
+{
+    enum fragment = [FieldNameTuple!T].map!(field => "v." ~ field ~ "*" ~ "v." ~ field).join("+");
+    return mixin("sqrt(" ~ fragment ~ ")");
+}
+
+T normal(T)(T v)
+{
+    return v / v.length;
+}
+
+float distance(T)(T lhs, T rhs)
+{
+    return (lhs - rhs).length;
+}
+
+float dot(T)(T lhs, T rhs)
+{
+    enum fragment = [FieldNameTuple!T].map!(field => "lhs." ~ field ~ "*" ~ "rhs." ~ field).join(
+                "+");
+    return mixin(fragment);
+}
+
+unittest
+{
+    assert(Vector2(3, 4).length == 5);
+    const a = Vector2(-3, 4);
+    assert(a.normal == Vector2(-3. / 5., 4. / 5.));
+    immutable b = Vector2(9, 8);
+    assert(b.distance(Vector2(-3, 3)) == 13);
+    assert(Vector3(2, 3, 4).dot(Vector3(4, 5, 6)) == 47);
+    assert(Vector2.one.length == sqrt(2.0f));
+}
+
+unittest
+{
+    assert(Rotor3(1, 2, 3, 4) == Rotor3(1, Bivector3(2, 3, 4)));
+}
+
+/// Mix `amount` of `lhs` with `1-amount` of `rhs`
+///   `amount` should be between 0 and 1, but can be anything
+///   lerp(lhs, rhs, 0) == lhs
+///   lerp(lhs, rhs, 1) == rhs
+T lerp(T)(T lhs, T rhs, float amount)
+{
+    return lhs + amount * (rhs - lhs);
+}
+
+/// angle betwenn vector and x-axis (+y +x -> positive)
+float angle(Vector2 v)
+{
+    return atan2(v.y, v.x);
+}
+
+Vector2 rotate(Vector2 v, float angle)
+{
+    return Vector2(v.x * cos(angle) - v.y * sin(angle), v.x * sin(angle) + v.y * cos(angle));
+}
+
+Vector2 slide(Vector2 v, Vector2 along)
+{
+    return along.normal * dot(v, along);
+}
+
+Bivector2 wedge(Vector2 lhs, Vector2 rhs)
+{
+    Bivector2 result = {xy: lhs.x * rhs.y - lhs.y * rhs.x};
+    return result;
+}
+
+// dfmt off
+Bivector3 wedge(Vector3 lhs, Vector3 rhs)
+{
+    Bivector3 result = {
+        xy: lhs.x * rhs.y - lhs.y * rhs.x,
+        yz: lhs.y * rhs.z - lhs.z * rhs.y,
+        zx: lhs.z * rhs.x - lhs.x * rhs.z,
+    };
+    return result;
+}
+
+Vector3 transform(Vector3 v, Matrix4 mat)
+{
+    with (v) with (mat)
+        return Vector3(
+            m0 * x + m4 * y + m8 * z + m12,
+            m1 * x + m5 * y + m9 * z + m13,
+            m2 * x + m6 * y + m10 * z + m14
+        );
+}
+// dfmt on
+
+Vector3 cross(Vector3 lhs, Vector3 rhs)
+{
+    auto v = wedge(lhs, rhs);
+    return Vector3(v.yz, v.zx, v.xy);
+}
+
+unittest {
+    // TODO
+}
+
+/// Returns a unit rotor that rotates `from` to `to`
+Rotor3 rotation(Vector3 from, Vector3 to)
+{
+    return Rotor3(1 + dot(to, from), wedge(to, from)).normal;
+}
+
+Rotor3 rotation(float angle, Bivector3 plane)
+{
+    return Rotor3(cos(angle / 2.0f), -sin(angle / 2.0f) * plane);
+}
+
+/// Rotate q by p
+Rotor3 rotate(Rotor3 p, Rotor3 q)
+{
+    return p * q * p.reverse;
+}
+
+/// Rotate v by r
+Vector3 rotate(Rotor3 r, Vector3 v)
+{
+    return r * v * r.reverse;
+}
+
+Rotor3 reverse(Rotor3 r)
+{
+    return Rotor3(r.a, -r.b);
+}
+
+unittest
+{
+    // TODO
+}

+ 244 - 0
source/raylib/reasings.d

@@ -0,0 +1,244 @@
+/*******************************************************************************************
+*
+*   reasings - raylib easings library, based on Robert Penner library
+*
+*   Useful easing functions for values animation
+*
+*   This header uses:
+*       #define EASINGS_STATIC_INLINE       // Inlines all functions code, so it runs faster.
+*                                           // This requires lots of memory on system.
+*   How to use:
+*   The four inputs t,b,c,d are defined as follows:
+*   t = current time (in any unit measure, but same unit as duration)
+*   b = starting value to interpolate
+*   c = the total change in value of b that needs to occur
+*   d = total time it should take to complete (duration)
+*
+*   Example:
+*
+*   int currentTime = 0;
+*   int duration = 100;
+*   float startPositionX = 0.0f;
+*   float finalPositionX = 30.0f;
+*   float currentPositionX = startPositionX;
+*
+*   while (currentPositionX < finalPositionX)
+*   {
+*       currentPositionX = EaseSineIn(currentTime, startPositionX, finalPositionX - startPositionX, duration);
+*       currentTime++;
+*   }
+*
+*   A port of Robert Penner's easing equations to C (http://robertpenner.com/easing/)
+*
+*   Robert Penner License
+*   ---------------------------------------------------------------------------------
+*   Open source under the BSD License.
+*
+*   Copyright (c) 2001 Robert Penner. All rights reserved.
+*
+*   Redistribution and use in source and binary forms, with or without modification,
+*   are permitted provided that the following conditions are met:
+*
+*       - Redistributions of source code must retain the above copyright notice,
+*         this list of conditions and the following disclaimer.
+*       - Redistributions in binary form must reproduce the above copyright notice,
+*         this list of conditions and the following disclaimer in the documentation
+*         and/or other materials provided with the distribution.
+*       - Neither the name of the author nor the names of contributors may be used
+*         to endorse or promote products derived from this software without specific
+*         prior written permission.
+*
+*   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+*   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+*   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+*   IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+*   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+*   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+*   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+*   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+*   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+*   OF THE POSSIBILITY OF SUCH DAMAGE.
+*   ---------------------------------------------------------------------------------
+*
+*   Copyright (c) 2015-2022 Ramon Santamaria (@raysan5)
+*
+*   This software is provided "as-is", without any express or implied warranty. In no event
+*   will the authors be held liable for any damages arising from the use of this software.
+*
+*   Permission is granted to anyone to use this software for any purpose, including commercial
+*   applications, and to alter it and redistribute it freely, subject to the following restrictions:
+*
+*     1. The origin of this software must not be misrepresented; you must not claim that you
+*     wrote the original software. If you use this software in a product, an acknowledgment
+*     in the product documentation would be appreciated but is not required.
+*
+*     2. Altered source versions must be plainly marked as such, and must not be misrepresented
+*     as being the original software.
+*
+*     3. This notice may not be removed or altered from any source distribution.
+*
+**********************************************************************************************/
+module raylib.reasings;
+
+extern (C) nothrow @nogc:
+pragma(inline, true): // NOTE: By default, compile functions as static inline
+
+import core.stdc.math; // Required for: sinf(), cosf(), sqrt(), pow()
+
+enum PI = 3.14159265358979323846f; //Required as PI is not always defined in math.h
+
+// Linear Easing functions
+static float EaseLinearNone(float t, float b, float c, float d) { return (c*t/d + b); }
+static float EaseLinearIn(float t, float b, float c, float d) { return (c*t/d + b); }
+static float EaseLinearOut(float t, float b, float c, float d) { return (c*t/d + b); }
+static float EaseLinearInOut(float t,float b, float c, float d) { return (c*t/d + b); }
+
+// Sine Easing functions
+static float EaseSineIn(float t, float b, float c, float d) { return (-c*cosf(t/d*(PI/2.0f)) + c + b); }
+static float EaseSineOut(float t, float b, float c, float d) { return (c*sinf(t/d*(PI/2.0f)) + b); }
+static float EaseSineInOut(float t, float b, float c, float d) { return (-c/2.0f*(cosf(PI*t/d) - 1.0f) + b); }
+
+// Circular Easing functions
+static float EaseCircIn(float t, float b, float c, float d) { t /= d; return (-c*(sqrtf(1.0f - t*t) - 1.0f) + b); }
+static float EaseCircOut(float t, float b, float c, float d) { t = t/d - 1.0f; return (c*sqrtf(1.0f - t*t) + b); }
+static float EaseCircInOut(float t, float b, float c, float d)
+{
+    if ((t/=d/2.0f) < 1.0f) return (-c/2.0f*(sqrtf(1.0f - t*t) - 1.0f) + b);
+    t -= 2.0f; return (c/2.0f*(sqrtf(1.0f - t*t) + 1.0f) + b);
+}
+
+// Cubic Easing functions
+static float EaseCubicIn(float t, float b, float c, float d) { t /= d; return (c*t*t*t + b); }
+static float EaseCubicOut(float t, float b, float c, float d) { t = t/d - 1.0f; return (c*(t*t*t + 1.0f) + b); }
+static float EaseCubicInOut(float t, float b, float c, float d)
+{
+    if ((t/=d/2.0f) < 1.0f) return (c/2.0f*t*t*t + b);
+    t -= 2.0f; return (c/2.0f*(t*t*t + 2.0f) + b);
+}
+
+// Quadratic Easing functions
+static float EaseQuadIn(float t, float b, float c, float d) { t /= d; return (c*t*t + b); }
+static float EaseQuadOut(float t, float b, float c, float d) { t /= d; return (-c*t*(t - 2.0f) + b); }
+static float EaseQuadInOut(float t, float b, float c, float d)
+{
+    if ((t/=d/2) < 1) return (((c/2)*(t*t)) + b);
+    return (-c/2.0f*(((t - 1.0f)*(t - 3.0f)) - 1.0f) + b);
+}
+
+// Exponential Easing functions
+static float EaseExpoIn(float t, float b, float c, float d) { return (t == 0.0f) ? b : (c*powf(2.0f, 10.0f*(t/d - 1.0f)) + b); }
+static float EaseExpoOut(float t, float b, float c, float d) { return (t == d) ? (b + c) : (c*(-powf(2.0f, -10.0f*t/d) + 1.0f) + b);    }
+static float EaseExpoInOut(float t, float b, float c, float d)
+{
+    if (t == 0.0f) return b;
+    if (t == d) return (b + c);
+    if ((t/=d/2.0f) < 1.0f) return (c/2.0f*powf(2.0f, 10.0f*(t - 1.0f)) + b);
+
+    return (c/2.0f*(-powf(2.0f, -10.0f*(t - 1.0f)) + 2.0f) + b);
+}
+
+// Back Easing functions
+static float EaseBackIn(float t, float b, float c, float d)
+{
+    float s = 1.70158f;
+    float postFix = t/=d;
+    return (c*(postFix)*t*((s + 1.0f)*t - s) + b);
+}
+
+static float EaseBackOut(float t, float b, float c, float d)
+{
+    float s = 1.70158f;
+    t = t/d - 1.0f;
+    return (c*(t*t*((s + 1.0f)*t + s) + 1.0f) + b);
+}
+
+static float EaseBackInOut(float t, float b, float c, float d)
+{
+    float s = 1.70158f;
+    if ((t/=d/2.0f) < 1.0f)
+    {
+        s *= 1.525f;
+        return (c/2.0f*(t*t*((s + 1.0f)*t - s)) + b);
+    }
+
+    float postFix = t-=2.0f;
+    s *= 1.525f;
+    return (c/2.0f*((postFix)*t*((s + 1.0f)*t + s) + 2.0f) + b);
+}
+
+// Bounce Easing functions
+static float EaseBounceOut(float t, float b, float c, float d)
+{
+    if ((t/=d) < (1.0f/2.75f))
+    {
+        return (c*(7.5625f*t*t) + b);
+    }
+    else if (t < (2.0f/2.75f))
+    {
+        float postFix = t-=(1.5f/2.75f);
+        return (c*(7.5625f*(postFix)*t + 0.75f) + b);
+    }
+    else if (t < (2.5/2.75))
+    {
+        float postFix = t-=(2.25f/2.75f);
+        return (c*(7.5625f*(postFix)*t + 0.9375f) + b);
+    }
+    else
+    {
+        float postFix = t-=(2.625f/2.75f);
+        return (c*(7.5625f*(postFix)*t + 0.984375f) + b);
+    }
+}
+
+static float EaseBounceIn(float t, float b, float c, float d) { return (c - EaseBounceOut(d - t, 0.0f, c, d) + b); }
+static float EaseBounceInOut(float t, float b, float c, float d)
+{
+    if (t < d/2.0f) return (EaseBounceIn(t*2.0f, 0.0f, c, d)*0.5f + b);
+    else return (EaseBounceOut(t*2.0f - d, 0.0f, c, d)*0.5f + c*0.5f + b);
+}
+
+// Elastic Easing functions
+static float EaseElasticIn(float t, float b, float c, float d)
+{
+    if (t == 0.0f) return b;
+    if ((t/=d) == 1.0f) return (b + c);
+
+    float p = d*0.3f;
+    float a = c;
+    float s = p/4.0f;
+    float postFix = a*powf(2.0f, 10.0f*(t-=1.0f));
+
+    return (-(postFix*sinf((t*d-s)*(2.0f*PI)/p )) + b);
+}
+
+static float EaseElasticOut(float t, float b, float c, float d)
+{
+    if (t == 0.0f) return b;
+    if ((t/=d) == 1.0f) return (b + c);
+
+    float p = d*0.3f;
+    float a = c;
+    float s = p/4.0f;
+
+    return (a*powf(2.0f,-10.0f*t)*sinf((t*d-s)*(2.0f*PI)/p) + c + b);
+}
+
+static float EaseElasticInOut(float t, float b, float c, float d)
+{
+    if (t == 0.0f) return b;
+    if ((t/=d/2.0f) == 2.0f) return (b + c);
+
+    float p = d*(0.3f*1.5f);
+    float a = c;
+    float s = p/4.0f;
+
+    if (t < 1.0f)
+    {
+        float postFix = a*powf(2.0f, 10.0f*(t-=1.0f));
+        return -0.5f*(postFix*sinf((t*d-s)*(2.0f*PI)/p)) + b;
+    }
+
+    float postFix = a*powf(2.0f, -10.0f*(t-=1.0f));
+
+    return (postFix*sinf((t*d-s)*(2.0f*PI)/p)*0.5f + c + b);
+}

+ 1926 - 0
source/raylib/rlgl.d

@@ -0,0 +1,1926 @@
+module raylib.rlgl;
+
+import raylib;
+/**********************************************************************************************
+*
+*   rlgl v4.0 - A multi-OpenGL abstraction layer with an immediate-mode style API
+*
+*   An abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, 4.3 Core, ES 2.0)
+*   that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...)
+*
+*   When chosing an OpenGL backend different than OpenGL 1.1, some internal buffer are
+*   initialized on rlglInit() to accumulate vertex data.
+*
+*   When an internal state change is required all the stored vertex data is renderer in batch,
+*   additioanlly, rlDrawRenderBatchActive() could be called to force flushing of the batch.
+*
+*   Some additional resources are also loaded for convenience, here the complete list:
+*      - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data
+*      - Default texture (RLGL.defaultTextureId): 1x1 white pixel R8G8B8A8
+*      - Default shader (RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs)
+*
+*   Internal buffer (and additional resources) must be manually unloaded calling rlglClose().
+*
+*
+*   CONFIGURATION:
+*
+*   #define GRAPHICS_API_OPENGL_11
+*   #define GRAPHICS_API_OPENGL_21
+*   #define GRAPHICS_API_OPENGL_33
+*   #define GRAPHICS_API_OPENGL_43
+*   #define GRAPHICS_API_OPENGL_ES2
+*       Use selected OpenGL graphics backend, should be supported by platform
+*       Those preprocessor defines are only used on rlgl module, if OpenGL version is
+*       required by any other module, use rlGetVersion() to check it
+*
+*   #define RLGL_IMPLEMENTATION
+*       Generates the implementation of the library into the included file.
+*       If not defined, the library is in header only mode and can be included in other headers
+*       or source files without problems. But only ONE file should hold the implementation.
+*
+*   #define RLGL_RENDER_TEXTURES_HINT
+*       Enable framebuffer objects (fbo) support (enabled by default)
+*       Some GPUs could not support them despite the OpenGL version
+*
+*   #define RLGL_SHOW_GL_DETAILS_INFO
+*       Show OpenGL extensions and capabilities detailed logs on init
+*
+*   #define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT
+*       Enable debug context (only available on OpenGL 4.3)
+*
+*   rlgl capabilities could be customized just defining some internal
+*   values before library inclusion (default values listed):
+*
+*   #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS   8192    // Default internal render batch elements limits
+*   #define RL_DEFAULT_BATCH_BUFFERS              1    // Default number of batch buffers (multi-buffering)
+*   #define RL_DEFAULT_BATCH_DRAWCALLS          256    // Default number of batch draw calls (by state changes: mode, texture)
+*   #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS    4    // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture())
+*
+*   #define RL_MAX_MATRIX_STACK_SIZE             32    // Maximum size of internal Matrix stack
+*   #define RL_MAX_SHADER_LOCATIONS              32    // Maximum number of shader locations supported
+*   #define RL_CULL_DISTANCE_NEAR              0.01    // Default projection matrix near cull distance
+*   #define RL_CULL_DISTANCE_FAR             1000.0    // Default projection matrix far cull distance
+*
+*   When loading a shader, the following vertex attribute and uniform
+*   location names are tried to be set automatically:
+*
+*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION     "vertexPosition"    // Binded by default to shader location: 0
+*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD     "vertexTexCoord"    // Binded by default to shader location: 1
+*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL       "vertexNormal"      // Binded by default to shader location: 2
+*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR        "vertexColor"       // Binded by default to shader location: 3
+*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT      "vertexTangent"     // Binded by default to shader location: 4
+*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2    "vertexTexCoord2"   // Binded by default to shader location: 5
+*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP         "mvp"               // model-view-projection matrix
+*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW        "matView"           // view matrix
+*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION  "matProjection"     // projection matrix
+*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL       "matModel"          // model matrix
+*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL      "matNormal"         // normal matrix (transpose(inverse(matModelView))
+*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR       "colDiffuse"        // color diffuse (base tint color, multiplied by texture color)
+*   #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0  "texture0"          // texture0 (texture slot active 0)
+*   #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1  "texture1"          // texture1 (texture slot active 1)
+*   #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2  "texture2"          // texture2 (texture slot active 2)
+*
+*   DEPENDENCIES:
+*
+*      - OpenGL libraries (depending on platform and OpenGL version selected)
+*      - GLAD OpenGL extensions loading library (only for OpenGL 3.3 Core, 4.3 Core)
+*
+*
+*   LICENSE: zlib/libpng
+*
+*   Copyright (c) 2014-2022 Ramon Santamaria (@raysan5)
+*
+*   This software is provided "as-is", without any express or implied warranty. In no event
+*   will the authors be held liable for any damages arising from the use of this software.
+*
+*   Permission is granted to anyone to use this software for any purpose, including commercial
+*   applications, and to alter it and redistribute it freely, subject to the following restrictions:
+*
+*     1. The origin of this software must not be misrepresented; you must not claim that you
+*     wrote the original software. If you use this software in a product, an acknowledgment
+*     in the product documentation would be appreciated but is not required.
+*
+*     2. Altered source versions must be plainly marked as such, and must not be misrepresented
+*     as being the original software.
+*
+*     3. This notice may not be removed or altered from any source distribution.
+*
+**********************************************************************************************/
+
+extern (C) @nogc nothrow:
+
+enum RLGL_VERSION = "4.0";
+
+// Function specifiers in case library is build/used as a shared library (Windows)
+// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll
+
+// We are building the library as a Win32 shared library (.dll)
+
+// We are using the library as a Win32 shared library (.dll)
+
+// Function specifiers definition // Functions defined as 'extern' by default (implicit specifiers)
+
+// Support TRACELOG macros
+
+// Allow custom memory allocators
+
+// Security check in case no GRAPHICS_API_OPENGL_* defined
+
+// Security check in case multiple GRAPHICS_API_OPENGL_* defined
+
+// OpenGL 2.1 uses most of OpenGL 3.3 Core functionality
+// WARNING: Specific parts are checked with #if defines
+
+// OpenGL 4.3 uses OpenGL 3.3 Core functionality
+
+// Support framebuffer objects by default
+// NOTE: Some driver implementation do not support it, despite they should
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+
+// Default internal render batch elements limits
+
+// This is the maximum amount of elements (quads) per batch
+// NOTE: Be careful with text, every letter maps to a quad
+enum RL_DEFAULT_BATCH_BUFFER_ELEMENTS = 8192;
+
+// We reduce memory sizes for embedded systems (RPI and HTML5)
+// NOTE: On HTML5 (emscripten) this is allocated on heap,
+// by default it's only 16MB!...just take care...
+
+enum RL_DEFAULT_BATCH_BUFFERS = 1; // Default number of batch buffers (multi-buffering)
+
+enum RL_DEFAULT_BATCH_DRAWCALLS = 256; // Default number of batch draw calls (by state changes: mode, texture)
+
+enum RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS = 4; // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture())
+
+// Internal Matrix stack
+
+enum RL_MAX_MATRIX_STACK_SIZE = 32; // Maximum size of Matrix stack
+
+// Shader limits
+
+enum RL_MAX_SHADER_LOCATIONS = 32; // Maximum number of shader locations supported
+
+// Projection matrix culling
+
+enum RL_CULL_DISTANCE_NEAR = 0.01; // Default near cull distance
+
+enum RL_CULL_DISTANCE_FAR = 1000.0; // Default far cull distance
+
+// Texture parameters (equivalent to OpenGL defines)
+enum RL_TEXTURE_WRAP_S = 0x2802; // GL_TEXTURE_WRAP_S
+enum RL_TEXTURE_WRAP_T = 0x2803; // GL_TEXTURE_WRAP_T
+enum RL_TEXTURE_MAG_FILTER = 0x2800; // GL_TEXTURE_MAG_FILTER
+enum RL_TEXTURE_MIN_FILTER = 0x2801; // GL_TEXTURE_MIN_FILTER
+
+enum RL_TEXTURE_FILTER_NEAREST = 0x2600; // GL_NEAREST
+enum RL_TEXTURE_FILTER_LINEAR = 0x2601; // GL_LINEAR
+enum RL_TEXTURE_FILTER_MIP_NEAREST = 0x2700; // GL_NEAREST_MIPMAP_NEAREST
+enum RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR = 0x2702; // GL_NEAREST_MIPMAP_LINEAR
+enum RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST = 0x2701; // GL_LINEAR_MIPMAP_NEAREST
+enum RL_TEXTURE_FILTER_MIP_LINEAR = 0x2703; // GL_LINEAR_MIPMAP_LINEAR
+enum RL_TEXTURE_FILTER_ANISOTROPIC = 0x3000; // Anisotropic filter (custom identifier)
+
+enum RL_TEXTURE_WRAP_REPEAT = 0x2901; // GL_REPEAT
+enum RL_TEXTURE_WRAP_CLAMP = 0x812F; // GL_CLAMP_TO_EDGE
+enum RL_TEXTURE_WRAP_MIRROR_REPEAT = 0x8370; // GL_MIRRORED_REPEAT
+enum RL_TEXTURE_WRAP_MIRROR_CLAMP = 0x8742; // GL_MIRROR_CLAMP_EXT
+
+// Matrix modes (equivalent to OpenGL)
+enum RL_MODELVIEW = 0x1700; // GL_MODELVIEW
+enum RL_PROJECTION = 0x1701; // GL_PROJECTION
+enum RL_TEXTURE = 0x1702; // GL_TEXTURE
+
+// Primitive assembly draw modes
+enum RL_LINES = 0x0001; // GL_LINES
+enum RL_TRIANGLES = 0x0004; // GL_TRIANGLES
+enum RL_QUADS = 0x0007; // GL_QUADS
+
+// GL equivalent data types
+enum RL_UNSIGNED_BYTE = 0x1401; // GL_UNSIGNED_BYTE
+enum RL_FLOAT = 0x1406; // GL_FLOAT
+
+// Buffer usage hint
+enum RL_STREAM_DRAW = 0x88E0; // GL_STREAM_DRAW
+enum RL_STREAM_READ = 0x88E1; // GL_STREAM_READ
+enum RL_STREAM_COPY = 0x88E2; // GL_STREAM_COPY
+enum RL_STATIC_DRAW = 0x88E4; // GL_STATIC_DRAW
+enum RL_STATIC_READ = 0x88E5; // GL_STATIC_READ
+enum RL_STATIC_COPY = 0x88E6; // GL_STATIC_COPY
+enum RL_DYNAMIC_DRAW = 0x88E8; // GL_DYNAMIC_DRAW
+enum RL_DYNAMIC_READ = 0x88E9; // GL_DYNAMIC_READ
+enum RL_DYNAMIC_COPY = 0x88EA; // GL_DYNAMIC_COPY
+
+// GL Shader type
+enum RL_FRAGMENT_SHADER = 0x8B30; // GL_FRAGMENT_SHADER
+enum RL_VERTEX_SHADER = 0x8B31; // GL_VERTEX_SHADER
+enum RL_COMPUTE_SHADER = 0x91B9; // GL_COMPUTE_SHADER
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+enum rlGlVersion
+{
+    OPENGL_11 = 1,
+    OPENGL_21 = 2,
+    OPENGL_33 = 3,
+    OPENGL_43 = 4,
+    OPENGL_ES_20 = 5
+}
+
+enum rlFramebufferAttachType
+{
+    RL_ATTACHMENT_COLOR_CHANNEL0 = 0,
+    RL_ATTACHMENT_COLOR_CHANNEL1 = 1,
+    RL_ATTACHMENT_COLOR_CHANNEL2 = 2,
+    RL_ATTACHMENT_COLOR_CHANNEL3 = 3,
+    RL_ATTACHMENT_COLOR_CHANNEL4 = 4,
+    RL_ATTACHMENT_COLOR_CHANNEL5 = 5,
+    RL_ATTACHMENT_COLOR_CHANNEL6 = 6,
+    RL_ATTACHMENT_COLOR_CHANNEL7 = 7,
+    RL_ATTACHMENT_DEPTH = 100,
+    RL_ATTACHMENT_STENCIL = 200
+}
+
+enum rlFramebufferAttachTextureType
+{
+    RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0,
+    RL_ATTACHMENT_CUBEMAP_NEGATIVE_X = 1,
+    RL_ATTACHMENT_CUBEMAP_POSITIVE_Y = 2,
+    RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y = 3,
+    RL_ATTACHMENT_CUBEMAP_POSITIVE_Z = 4,
+    RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z = 5,
+    RL_ATTACHMENT_TEXTURE2D = 100,
+    RL_ATTACHMENT_RENDERBUFFER = 200
+}
+
+// Dynamic vertex buffers (position + texcoords + colors + indices arrays)
+struct rlVertexBuffer
+{
+    int elementCount; // Number of elements in the buffer (QUADS)
+
+    float* vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0)
+    float* texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)
+    ubyte* colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
+
+    uint* indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad)
+
+    // Vertex indices (in case vertex data comes indexed) (6 indices per quad)
+
+    uint vaoId; // OpenGL Vertex Array Object id
+    uint[4] vboId; // OpenGL Vertex Buffer Objects id (4 types of vertex data)
+}
+
+// Draw call type
+// NOTE: Only texture changes register a new draw, other state-change-related elements are not
+// used at this moment (vaoId, shaderId, matrices), raylib just forces a batch draw call if any
+// of those state-change happens (this is done in core module)
+struct rlDrawCall
+{
+    int mode; // Drawing mode: LINES, TRIANGLES, QUADS
+    int vertexCount; // Number of vertex of the draw
+    int vertexAlignment; // Number of vertex required for index alignment (LINES, TRIANGLES)
+    //unsigned int vaoId;       // Vertex array id to be used on the draw -> Using RLGL.currentBatch->vertexBuffer.vaoId
+    //unsigned int shaderId;    // Shader id to be used on the draw -> Using RLGL.currentShaderId
+    uint textureId; // Texture id to be used on the draw -> Use to create new draw call if changes
+
+    //Matrix projection;      // Projection matrix for this draw -> Using RLGL.projection by default
+    //Matrix modelview;       // Modelview matrix for this draw -> Using RLGL.modelview by default
+}
+
+// rlRenderBatch type
+struct rlRenderBatch
+{
+    int bufferCount; // Number of vertex buffers (multi-buffering support)
+    int currentBuffer; // Current buffer tracking in case of multi-buffering
+    rlVertexBuffer* vertexBuffer; // Dynamic buffer(s) for vertex data
+
+    rlDrawCall* draws; // Draw calls array, depends on textureId
+    int drawCounter; // Draw calls counter
+    float currentDepth; // Current depth value for next draw
+}
+
+// Boolean type
+
+// Matrix, 4x4 components, column major, OpenGL style, right handed
+
+// Matrix first row (4 components)
+// Matrix second row (4 components)
+// Matrix third row (4 components)
+// Matrix fourth row (4 components)
+
+// Trace log level
+// NOTE: Organized by priority level
+enum rlTraceLogLevel
+{
+    RL_LOG_ALL = 0, // Display all logs
+    RL_LOG_TRACE = 1, // Trace logging, intended for internal use only
+    RL_LOG_DEBUG = 2, // Debug logging, used for internal debugging, it should be disabled on release builds
+    RL_LOG_INFO = 3, // Info logging, used for program execution info
+    RL_LOG_WARNING = 4, // Warning logging, used on recoverable failures
+    RL_LOG_ERROR = 5, // Error logging, used on unrecoverable failures
+    RL_LOG_FATAL = 6, // Fatal logging, used to abort program: exit(EXIT_FAILURE)
+    RL_LOG_NONE = 7 // Disable logging
+}
+
+// Texture formats (support depends on OpenGL version)
+enum rlPixelFormat
+{
+    RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha)
+    RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA = 2, // 8*2 bpp (2 channels)
+    RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5 = 3, // 16 bpp
+    RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8 = 4, // 24 bpp
+    RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1 = 5, // 16 bpp (1 bit alpha)
+    RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4 = 6, // 16 bpp (4 bit alpha)
+    RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 = 7, // 32 bpp
+    RL_PIXELFORMAT_UNCOMPRESSED_R32 = 8, // 32 bpp (1 channel - float)
+    RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32 = 9, // 32*3 bpp (3 channels - float)
+    RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32 = 10, // 32*4 bpp (4 channels - float)
+    RL_PIXELFORMAT_COMPRESSED_DXT1_RGB = 11, // 4 bpp (no alpha)
+    RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA = 12, // 4 bpp (1 bit alpha)
+    RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA = 13, // 8 bpp
+    RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA = 14, // 8 bpp
+    RL_PIXELFORMAT_COMPRESSED_ETC1_RGB = 15, // 4 bpp
+    RL_PIXELFORMAT_COMPRESSED_ETC2_RGB = 16, // 4 bpp
+    RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA = 17, // 8 bpp
+    RL_PIXELFORMAT_COMPRESSED_PVRT_RGB = 18, // 4 bpp
+    RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA = 19, // 4 bpp
+    RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA = 20, // 8 bpp
+    RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 21 // 2 bpp
+}
+
+// Texture parameters: filter mode
+// NOTE 1: Filtering considers mipmaps if available in the texture
+// NOTE 2: Filter is accordingly set for minification and magnification
+enum rlTextureFilter
+{
+    RL_TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation
+    RL_TEXTURE_FILTER_BILINEAR = 1, // Linear filtering
+    RL_TEXTURE_FILTER_TRILINEAR = 2, // Trilinear filtering (linear with mipmaps)
+    RL_TEXTURE_FILTER_ANISOTROPIC_4X = 3, // Anisotropic filtering 4x
+    RL_TEXTURE_FILTER_ANISOTROPIC_8X = 4, // Anisotropic filtering 8x
+    RL_TEXTURE_FILTER_ANISOTROPIC_16X = 5 // Anisotropic filtering 16x
+}
+
+// Color blending modes (pre-defined)
+enum rlBlendMode
+{
+    RL_BLEND_ALPHA = 0, // Blend textures considering alpha (default)
+    RL_BLEND_ADDITIVE = 1, // Blend textures adding colors
+    RL_BLEND_MULTIPLIED = 2, // Blend textures multiplying colors
+    RL_BLEND_ADD_COLORS = 3, // Blend textures adding colors (alternative)
+    RL_BLEND_SUBTRACT_COLORS = 4, // Blend textures subtracting colors (alternative)
+    RL_BLEND_ALPHA_PREMULTIPLY = 5, // Blend premultiplied textures considering alpha
+    RL_BLEND_CUSTOM = 6 // Blend textures using custom src/dst factors (use rlSetBlendFactors())
+}
+
+// Shader location point type
+enum rlShaderLocationIndex
+{
+    RL_SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position
+    RL_SHADER_LOC_VERTEX_TEXCOORD01 = 1, // Shader location: vertex attribute: texcoord01
+    RL_SHADER_LOC_VERTEX_TEXCOORD02 = 2, // Shader location: vertex attribute: texcoord02
+    RL_SHADER_LOC_VERTEX_NORMAL = 3, // Shader location: vertex attribute: normal
+    RL_SHADER_LOC_VERTEX_TANGENT = 4, // Shader location: vertex attribute: tangent
+    RL_SHADER_LOC_VERTEX_COLOR = 5, // Shader location: vertex attribute: color
+    RL_SHADER_LOC_MATRIX_MVP = 6, // Shader location: matrix uniform: model-view-projection
+    RL_SHADER_LOC_MATRIX_VIEW = 7, // Shader location: matrix uniform: view (camera transform)
+    RL_SHADER_LOC_MATRIX_PROJECTION = 8, // Shader location: matrix uniform: projection
+    RL_SHADER_LOC_MATRIX_MODEL = 9, // Shader location: matrix uniform: model (transform)
+    RL_SHADER_LOC_MATRIX_NORMAL = 10, // Shader location: matrix uniform: normal
+    RL_SHADER_LOC_VECTOR_VIEW = 11, // Shader location: vector uniform: view
+    RL_SHADER_LOC_COLOR_DIFFUSE = 12, // Shader location: vector uniform: diffuse color
+    RL_SHADER_LOC_COLOR_SPECULAR = 13, // Shader location: vector uniform: specular color
+    RL_SHADER_LOC_COLOR_AMBIENT = 14, // Shader location: vector uniform: ambient color
+    RL_SHADER_LOC_MAP_ALBEDO = 15, // Shader location: sampler2d texture: albedo (same as: RL_SHADER_LOC_MAP_DIFFUSE)
+    RL_SHADER_LOC_MAP_METALNESS = 16, // Shader location: sampler2d texture: metalness (same as: RL_SHADER_LOC_MAP_SPECULAR)
+    RL_SHADER_LOC_MAP_NORMAL = 17, // Shader location: sampler2d texture: normal
+    RL_SHADER_LOC_MAP_ROUGHNESS = 18, // Shader location: sampler2d texture: roughness
+    RL_SHADER_LOC_MAP_OCCLUSION = 19, // Shader location: sampler2d texture: occlusion
+    RL_SHADER_LOC_MAP_EMISSION = 20, // Shader location: sampler2d texture: emission
+    RL_SHADER_LOC_MAP_HEIGHT = 21, // Shader location: sampler2d texture: height
+    RL_SHADER_LOC_MAP_CUBEMAP = 22, // Shader location: samplerCube texture: cubemap
+    RL_SHADER_LOC_MAP_IRRADIANCE = 23, // Shader location: samplerCube texture: irradiance
+    RL_SHADER_LOC_MAP_PREFILTER = 24, // Shader location: samplerCube texture: prefilter
+    RL_SHADER_LOC_MAP_BRDF = 25 // Shader location: sampler2d texture: brdf
+}
+
+enum RL_SHADER_LOC_MAP_DIFFUSE = rlShaderLocationIndex.RL_SHADER_LOC_MAP_ALBEDO;
+enum RL_SHADER_LOC_MAP_SPECULAR = rlShaderLocationIndex.RL_SHADER_LOC_MAP_METALNESS;
+
+// Shader uniform data type
+enum rlShaderUniformDataType
+{
+    RL_SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float
+    RL_SHADER_UNIFORM_VEC2 = 1, // Shader uniform type: vec2 (2 float)
+    RL_SHADER_UNIFORM_VEC3 = 2, // Shader uniform type: vec3 (3 float)
+    RL_SHADER_UNIFORM_VEC4 = 3, // Shader uniform type: vec4 (4 float)
+    RL_SHADER_UNIFORM_INT = 4, // Shader uniform type: int
+    RL_SHADER_UNIFORM_IVEC2 = 5, // Shader uniform type: ivec2 (2 int)
+    RL_SHADER_UNIFORM_IVEC3 = 6, // Shader uniform type: ivec3 (3 int)
+    RL_SHADER_UNIFORM_IVEC4 = 7, // Shader uniform type: ivec4 (4 int)
+    RL_SHADER_UNIFORM_SAMPLER2D = 8 // Shader uniform type: sampler2d
+}
+
+// Shader attribute data types
+enum rlShaderAttributeDataType
+{
+    RL_SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float
+    RL_SHADER_ATTRIB_VEC2 = 1, // Shader attribute type: vec2 (2 float)
+    RL_SHADER_ATTRIB_VEC3 = 2, // Shader attribute type: vec3 (3 float)
+    RL_SHADER_ATTRIB_VEC4 = 3 // Shader attribute type: vec4 (4 float)
+}
+
+//------------------------------------------------------------------------------------
+// Functions Declaration - Matrix operations
+//------------------------------------------------------------------------------------
+
+// Prevents name mangling of functions
+
+void rlMatrixMode(int mode); // Choose the current matrix to be transformed
+void rlPushMatrix(); // Push the current matrix to stack
+void rlPopMatrix(); // Pop lattest inserted matrix from stack
+void rlLoadIdentity(); // Reset current matrix to identity matrix
+void rlTranslatef(float x, float y, float z); // Multiply the current matrix by a translation matrix
+void rlRotatef(float angle, float x, float y, float z); // Multiply the current matrix by a rotation matrix
+void rlScalef(float x, float y, float z); // Multiply the current matrix by a scaling matrix
+void rlMultMatrixf(float* matf); // Multiply the current matrix by another matrix
+void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar);
+void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar);
+void rlViewport(int x, int y, int width, int height); // Set the viewport area
+
+//------------------------------------------------------------------------------------
+// Functions Declaration - Vertex level operations
+//------------------------------------------------------------------------------------
+void rlBegin(int mode); // Initialize drawing mode (how to organize vertex)
+void rlEnd(); // Finish vertex providing
+void rlVertex2i(int x, int y); // Define one vertex (position) - 2 int
+void rlVertex2f(float x, float y); // Define one vertex (position) - 2 float
+void rlVertex3f(float x, float y, float z); // Define one vertex (position) - 3 float
+void rlTexCoord2f(float x, float y); // Define one vertex (texture coordinate) - 2 float
+void rlNormal3f(float x, float y, float z); // Define one vertex (normal) - 3 float
+void rlColor4ub(ubyte r, ubyte g, ubyte b, ubyte a); // Define one vertex (color) - 4 byte
+void rlColor3f(float x, float y, float z); // Define one vertex (color) - 3 float
+void rlColor4f(float x, float y, float z, float w); // Define one vertex (color) - 4 float
+
+//------------------------------------------------------------------------------------
+// Functions Declaration - OpenGL style functions (common to 1.1, 3.3+, ES2)
+// NOTE: This functions are used to completely abstract raylib code from OpenGL layer,
+// some of them are direct wrappers over OpenGL calls, some others are custom
+//------------------------------------------------------------------------------------
+
+// Vertex buffers state
+bool rlEnableVertexArray(uint vaoId); // Enable vertex array (VAO, if supported)
+void rlDisableVertexArray(); // Disable vertex array (VAO, if supported)
+void rlEnableVertexBuffer(uint id); // Enable vertex buffer (VBO)
+void rlDisableVertexBuffer(); // Disable vertex buffer (VBO)
+void rlEnableVertexBufferElement(uint id); // Enable vertex buffer element (VBO element)
+void rlDisableVertexBufferElement(); // Disable vertex buffer element (VBO element)
+void rlEnableVertexAttribute(uint index); // Enable vertex attribute index
+void rlDisableVertexAttribute(uint index); // Disable vertex attribute index
+
+// Enable attribute state pointer
+// Disable attribute state pointer
+
+// Textures state
+void rlActiveTextureSlot(int slot); // Select and active a texture slot
+void rlEnableTexture(uint id); // Enable texture
+void rlDisableTexture(); // Disable texture
+void rlEnableTextureCubemap(uint id); // Enable texture cubemap
+void rlDisableTextureCubemap(); // Disable texture cubemap
+void rlTextureParameters(uint id, int param, int value); // Set texture parameters (filter, wrap)
+
+// Shader state
+void rlEnableShader(uint id); // Enable shader program
+void rlDisableShader(); // Disable shader program
+
+// Framebuffer state
+void rlEnableFramebuffer(uint id); // Enable render texture (fbo)
+void rlDisableFramebuffer(); // Disable render texture (fbo), return to default framebuffer
+void rlActiveDrawBuffers(int count); // Activate multiple draw color buffers
+
+// General render state
+void rlEnableColorBlend(); // Enable color blending
+void rlDisableColorBlend(); // Disable color blending
+void rlEnableDepthTest(); // Enable depth test
+void rlDisableDepthTest(); // Disable depth test
+void rlEnableDepthMask(); // Enable depth write
+void rlDisableDepthMask(); // Disable depth write
+void rlEnableBackfaceCulling(); // Enable backface culling
+void rlDisableBackfaceCulling(); // Disable backface culling
+void rlEnableScissorTest(); // Enable scissor test
+void rlDisableScissorTest(); // Disable scissor test
+void rlScissor(int x, int y, int width, int height); // Scissor test
+void rlEnableWireMode(); // Enable wire mode
+void rlDisableWireMode(); // Disable wire mode
+void rlSetLineWidth(float width); // Set the line drawing width
+float rlGetLineWidth(); // Get the line drawing width
+void rlEnableSmoothLines(); // Enable line aliasing
+void rlDisableSmoothLines(); // Disable line aliasing
+void rlEnableStereoRender(); // Enable stereo rendering
+void rlDisableStereoRender(); // Disable stereo rendering
+bool rlIsStereoRenderEnabled(); // Check if stereo render is enabled
+
+void rlClearColor(ubyte r, ubyte g, ubyte b, ubyte a); // Clear color buffer with color
+void rlClearScreenBuffers(); // Clear used screen buffers (color and depth)
+void rlCheckErrors(); // Check and log OpenGL error codes
+void rlSetBlendMode(int mode); // Set blending mode
+void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation); // Set blending mode factor and equation (using OpenGL factors)
+
+//------------------------------------------------------------------------------------
+// Functions Declaration - rlgl functionality
+//------------------------------------------------------------------------------------
+// rlgl initialization functions
+void rlglInit(int width, int height); // Initialize rlgl (buffers, shaders, textures, states)
+void rlglClose(); // De-inititialize rlgl (buffers, shaders, textures)
+void rlLoadExtensions(void* loader); // Load OpenGL extensions (loader function required)
+int rlGetVersion(); // Get current OpenGL version
+void rlSetFramebufferWidth(int width); // Set current framebuffer width
+int rlGetFramebufferWidth(); // Get default framebuffer width
+void rlSetFramebufferHeight(int height); // Set current framebuffer height
+int rlGetFramebufferHeight(); // Get default framebuffer height
+
+uint rlGetTextureIdDefault(); // Get default texture id
+uint rlGetShaderIdDefault(); // Get default shader id
+int* rlGetShaderLocsDefault(); // Get default shader locations
+
+// Render batch management
+// NOTE: rlgl provides a default render batch to behave like OpenGL 1.1 immediate mode
+// but this render batch API is exposed in case of custom batches are required
+rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements); // Load a render batch system
+void rlUnloadRenderBatch(rlRenderBatch batch); // Unload render batch system
+void rlDrawRenderBatch(rlRenderBatch* batch); // Draw render batch data (Update->Draw->Reset)
+void rlSetRenderBatchActive(rlRenderBatch* batch); // Set the active render batch for rlgl (NULL for default internal)
+void rlDrawRenderBatchActive(); // Update and draw internal render batch
+bool rlCheckRenderBatchLimit(int vCount); // Check internal buffer overflow for a given number of vertex
+void rlSetTexture(uint id); // Set current texture for render batch and check buffers limits
+
+//------------------------------------------------------------------------------------------------------------------------
+
+// Vertex buffers management
+uint rlLoadVertexArray(); // Load vertex array (vao) if supported
+uint rlLoadVertexBuffer(const(void)* buffer, int size, bool dynamic); // Load a vertex buffer attribute
+uint rlLoadVertexBufferElement(const(void)* buffer, int size, bool dynamic); // Load a new attributes element buffer
+void rlUpdateVertexBuffer(uint bufferId, const(void)* data, int dataSize, int offset); // Update GPU buffer with new data
+void rlUpdateVertexBufferElements(uint id, const(void)* data, int dataSize, int offset); // Update vertex buffer elements with new data
+void rlUnloadVertexArray(uint vaoId);
+void rlUnloadVertexBuffer(uint vboId);
+void rlSetVertexAttribute(uint index, int compSize, int type, bool normalized, int stride, const(void)* pointer);
+void rlSetVertexAttributeDivisor(uint index, int divisor);
+void rlSetVertexAttributeDefault(int locIndex, const(void)* value, int attribType, int count); // Set vertex attribute default value
+void rlDrawVertexArray(int offset, int count);
+void rlDrawVertexArrayElements(int offset, int count, const(void)* buffer);
+void rlDrawVertexArrayInstanced(int offset, int count, int instances);
+void rlDrawVertexArrayElementsInstanced(int offset, int count, const(void)* buffer, int instances);
+
+// Textures management
+uint rlLoadTexture(const(void)* data, int width, int height, int format, int mipmapCount); // Load texture in GPU
+uint rlLoadTextureDepth(int width, int height, bool useRenderBuffer); // Load depth texture/renderbuffer (to be attached to fbo)
+uint rlLoadTextureCubemap(const(void)* data, int size, int format); // Load texture cubemap
+void rlUpdateTexture(uint id, int offsetX, int offsetY, int width, int height, int format, const(void)* data); // Update GPU texture with new data
+void rlGetGlTextureFormats(int format, uint* glInternalFormat, uint* glFormat, uint* glType); // Get OpenGL internal formats
+const(char)* rlGetPixelFormatName(uint format); // Get name string for pixel format
+void rlUnloadTexture(uint id); // Unload texture from GPU memory
+void rlGenTextureMipmaps(uint id, int width, int height, int format, int* mipmaps); // Generate mipmap data for selected texture
+void* rlReadTexturePixels(uint id, int width, int height, int format); // Read texture pixel data
+ubyte* rlReadScreenPixels(int width, int height); // Read screen pixel data (color buffer)
+
+// Framebuffer management (fbo)
+uint rlLoadFramebuffer(int width, int height); // Load an empty framebuffer
+void rlFramebufferAttach(uint fboId, uint texId, int attachType, int texType, int mipLevel); // Attach texture/renderbuffer to a framebuffer
+bool rlFramebufferComplete(uint id); // Verify framebuffer is complete
+void rlUnloadFramebuffer(uint id); // Delete framebuffer from GPU
+
+// Shaders management
+uint rlLoadShaderCode(const(char)* vsCode, const(char)* fsCode); // Load shader from code strings
+uint rlCompileShader(const(char)* shaderCode, int type); // Compile custom shader and return shader id (type: RL_VERTEX_SHADER, RL_FRAGMENT_SHADER, RL_COMPUTE_SHADER)
+uint rlLoadShaderProgram(uint vShaderId, uint fShaderId); // Load custom shader program
+void rlUnloadShaderProgram(uint id); // Unload shader program
+int rlGetLocationUniform(uint shaderId, const(char)* uniformName); // Get shader location uniform
+int rlGetLocationAttrib(uint shaderId, const(char)* attribName); // Get shader location attribute
+void rlSetUniform(int locIndex, const(void)* value, int uniformType, int count); // Set shader value uniform
+void rlSetUniformMatrix(int locIndex, Matrix mat); // Set shader value matrix
+void rlSetUniformSampler(int locIndex, uint textureId); // Set shader value sampler
+void rlSetShader(uint id, int* locs); // Set shader currently active (id and locations)
+
+// Compute shader management
+uint rlLoadComputeShaderProgram(uint shaderId); // Load compute shader program
+void rlComputeShaderDispatch(uint groupX, uint groupY, uint groupZ); // Dispatch compute shader (equivalent to *draw* for graphics pilepine)
+
+// Shader buffer storage object management (ssbo)
+uint rlLoadShaderBuffer(ulong size, const(void)* data, int usageHint); // Load shader storage buffer object (SSBO)
+void rlUnloadShaderBuffer(uint ssboId); // Unload shader storage buffer object (SSBO)
+void rlUpdateShaderBufferElements(uint id, const(void)* data, ulong dataSize, ulong offset); // Update SSBO buffer data
+ulong rlGetShaderBufferSize(uint id); // Get SSBO buffer size
+void rlReadShaderBufferElements(uint id, void* dest, ulong count, ulong offset); // Bind SSBO buffer
+void rlBindShaderBuffer(uint id, uint index); // Copy SSBO buffer data
+
+// Buffer management
+void rlCopyBuffersElements(uint destId, uint srcId, ulong destOffset, ulong srcOffset, ulong count); // Copy SSBO buffer data
+void rlBindImageTexture(uint id, uint index, uint format, int readonly); // Bind image texture
+
+// Matrix state management
+Matrix rlGetMatrixModelview(); // Get internal modelview matrix
+Matrix rlGetMatrixProjection(); // Get internal projection matrix
+Matrix rlGetMatrixTransform(); // Get internal accumulated transform matrix
+Matrix rlGetMatrixProjectionStereo(int eye); // Get internal projection matrix for stereo render (selected eye)
+Matrix rlGetMatrixViewOffsetStereo(int eye); // Get internal view offset matrix for stereo render (selected eye)
+void rlSetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix)
+void rlSetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix)
+void rlSetMatrixProjectionStereo(Matrix right, Matrix left); // Set eyes projection matrices for stereo rendering
+void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left); // Set eyes view offsets matrices for stereo rendering
+
+// Quick and dirty cube/quad buffers load->draw->unload
+void rlLoadDrawCube(); // Load and draw a cube
+void rlLoadDrawQuad(); // Load and draw a quad
+
+// RLGL_H
+
+/***********************************************************************************
+*
+*   RLGL IMPLEMENTATION
+*
+************************************************************************************/
+
+// OpenGL 1.1 library for OSX
+// OpenGL extensions library
+
+// APIENTRY for OpenGL function pointer declarations is required
+
+// WINGDIAPI definition. Some Windows OpenGL headers need it
+
+// OpenGL 1.1 library
+
+// OpenGL 3 library for OSX
+// OpenGL 3 extensions library for OSX
+
+// GLAD extensions loading library, includes OpenGL headers
+
+//#include <EGL/egl.h>              // EGL library -> not required, platform layer
+// OpenGL ES 2.0 library
+// OpenGL ES 2.0 extensions library
+
+// It seems OpenGL ES 2.0 instancing entry points are not defined on Raspberry Pi
+// provided headers (despite being defined in official Khronos GLES2 headers)
+
+// Required for: malloc(), free()
+// Required for: strcmp(), strlen() [Used in rlglInit(), on extensions loading]
+// Required for: sqrtf(), sinf(), cosf(), floor(), log()
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+
+// Default shader vertex attribute names to set location points
+
+// Binded by default to shader location: 0
+
+// Binded by default to shader location: 1
+
+// Binded by default to shader location: 2
+
+// Binded by default to shader location: 3
+
+// Binded by default to shader location: 4
+
+// Binded by default to shader location: 5
+
+// model-view-projection matrix
+
+// view matrix
+
+// projection matrix
+
+// model matrix
+
+// normal matrix (transpose(inverse(matModelView))
+
+// color diffuse (base tint color, multiplied by texture color)
+
+// texture0 (texture slot active 0)
+
+// texture1 (texture slot active 1)
+
+// texture2 (texture slot active 2)
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+
+// Current render batch
+// Default internal render batch
+
+// Current active render batch vertex counter (generic, used for all batches)
+// Current active texture coordinate (added on glVertex*())
+// Current active normal (added on glVertex*())
+// Current active color (added on glVertex*())
+
+// Current matrix mode
+// Current matrix pointer
+// Default modelview matrix
+// Default projection matrix
+// Transform matrix to be used with rlTranslate, rlRotate, rlScale
+// Require transform matrix application to current draw-call vertex (if required)
+// Matrix stack for push/pop
+// Matrix stack counter
+
+// Default texture used on shapes/poly drawing (required by shader)
+// Active texture ids to be enabled on batch drawing (0 active by default)
+// Default vertex shader id (used by default shader program)
+// Default fragment shader id (used by default shader program)
+// Default shader program id, supports vertex color and diffuse texture
+// Default shader locations pointer to be used on rendering
+// Current shader id to be used on rendering (by default, defaultShaderId)
+// Current shader locations pointer to be used on rendering (by default, defaultShaderLocs)
+
+// Stereo rendering flag
+// VR stereo rendering eyes projection matrices
+// VR stereo rendering eyes view offset matrices
+
+// Blending mode active
+// Blending source factor
+// Blending destination factor
+// Blending equation
+
+// Current framebuffer width
+// Current framebuffer height
+
+// Renderer state
+
+// VAO support (OpenGL ES2 could not support VAO extension) (GL_ARB_vertex_array_object)
+// Instancing supported (GL_ANGLE_instanced_arrays, GL_EXT_draw_instanced + GL_EXT_instanced_arrays)
+// NPOT textures full support (GL_ARB_texture_non_power_of_two, GL_OES_texture_npot)
+// Depth textures supported (GL_ARB_depth_texture, GL_WEBGL_depth_texture, GL_OES_depth_texture)
+// float textures support (32 bit per channel) (GL_OES_texture_float)
+// DDS texture compression support (GL_EXT_texture_compression_s3tc, GL_WEBGL_compressed_texture_s3tc, GL_WEBKIT_WEBGL_compressed_texture_s3tc)
+// ETC1 texture compression support (GL_OES_compressed_ETC1_RGB8_texture, GL_WEBGL_compressed_texture_etc1)
+// ETC2/EAC texture compression support (GL_ARB_ES3_compatibility)
+// PVR texture compression support (GL_IMG_texture_compression_pvrtc)
+// ASTC texture compression support (GL_KHR_texture_compression_astc_hdr, GL_KHR_texture_compression_astc_ldr)
+// Clamp mirror wrap mode supported (GL_EXT_texture_mirror_clamp)
+// Anisotropic texture filtering support (GL_EXT_texture_filter_anisotropic)
+// Compute shaders support (GL_ARB_compute_shader)
+// Shader storage buffer object support (GL_ARB_shader_storage_buffer_object)
+
+// Maximum anisotropy level supported (minimum is 2.0f)
+// Maximum bits for depth component
+
+// Extensions supported flags
+
+// OpenGL extension functions loader signature (same as GLADloadproc)
+
+// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+
+// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
+
+// NOTE: VAO functionality is exposed through extensions (OES)
+
+// NOTE: Instancing functionality could also be available through extension
+
+//----------------------------------------------------------------------------------
+// Module specific Functions Declaration
+//----------------------------------------------------------------------------------
+
+// Load default shader
+// Unload default shader
+
+// Get compressed format official GL identifier name
+// RLGL_SHOW_GL_DETAILS_INFO
+// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
+
+// Generate mipmaps data on CPU side
+// Generate next mipmap level on CPU side
+
+// Get pixel data size in bytes (image or texture)
+// Auxiliar matrix math functions
+// Get identity matrix
+// Multiply two matrices
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - Matrix operations
+//----------------------------------------------------------------------------------
+
+// Fallback to OpenGL 1.1 function calls
+//---------------------------------------
+
+// Choose the current matrix to be transformed
+
+//else if (mode == RL_TEXTURE) // Not supported
+
+// Push the current matrix into RLGL.State.stack
+
+// Pop lattest inserted matrix from RLGL.State.stack
+
+// Reset current matrix to identity matrix
+
+// Multiply the current matrix by a translation matrix
+
+// NOTE: We transpose matrix with multiplication order
+
+// Multiply the current matrix by a rotation matrix
+// NOTE: The provided angle must be in degrees
+
+// Axis vector (x, y, z) normalization
+
+// Rotation matrix generation
+
+// NOTE: We transpose matrix with multiplication order
+
+// Multiply the current matrix by a scaling matrix
+
+// NOTE: We transpose matrix with multiplication order
+
+// Multiply the current matrix by another matrix
+
+// Matrix creation from array
+
+// Multiply the current matrix by a perspective matrix generated by parameters
+
+// Multiply the current matrix by an orthographic matrix generated by parameters
+
+// NOTE: If left-right and top-botton values are equal it could create a division by zero,
+// response to it is platform/compiler dependant
+
+// Set the viewport area (transformation from normalized device coordinates to window coordinates)
+// NOTE: We store current viewport dimensions
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - Vertex level operations
+//----------------------------------------------------------------------------------
+
+// Fallback to OpenGL 1.1 function calls
+//---------------------------------------
+
+// Initialize drawing mode (how to organize vertex)
+
+// Draw mode can be RL_LINES, RL_TRIANGLES and RL_QUADS
+// NOTE: In all three cases, vertex are accumulated over default internal vertex buffer
+
+// Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4,
+// that way, following QUADS drawing will keep aligned with index processing
+// It implies adding some extra alignment vertex at the end of the draw,
+// those vertex are not processed but they are considered as an additional offset
+// for the next set of vertex to be drawn
+
+// Finish vertex providing
+
+// NOTE: Depth increment is dependant on rlOrtho(): z-near and z-far values,
+// as well as depth buffer bit-depth (16bit or 24bit or 32bit)
+// Correct increment formula would be: depthInc = (zfar - znear)/pow(2, bits)
+
+// Verify internal buffers limits
+// NOTE: This check is combined with usage of rlCheckRenderBatchLimit()
+
+// WARNING: If we are between rlPushMatrix() and rlPopMatrix() and we need to force a rlDrawRenderBatch(),
+// we need to call rlPopMatrix() before to recover *RLGL.State.currentMatrix (RLGL.State.modelview) for the next forced draw call!
+// If we have multiple matrix pushed, it will require "RLGL.State.stackCounter" pops before launching the draw
+
+// Define one vertex (position)
+// NOTE: Vertex position data is the basic information required for drawing
+
+// Transform provided vector if required
+
+// Verify that current vertex buffer elements limit has not been reached
+
+// Add vertices
+
+// Add current texcoord
+
+// TODO: Add current normal
+// By default rlVertexBuffer type does not store normals
+
+// Add current color
+
+// Define one vertex (position)
+
+// Define one vertex (position)
+
+// Define one vertex (texture coordinate)
+// NOTE: Texture coordinates are limited to QUADS only
+
+// Define one vertex (normal)
+// NOTE: Normals limited to TRIANGLES only?
+
+// Define one vertex (color)
+
+// Define one vertex (color)
+
+// Define one vertex (color)
+
+//--------------------------------------------------------------------------------------
+// Module Functions Definition - OpenGL style functions (common to 1.1, 3.3+, ES2)
+//--------------------------------------------------------------------------------------
+
+// Set current texture to use
+
+// NOTE: If quads batch limit is reached, we force a draw call and next batch starts
+
+// Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4,
+// that way, following QUADS drawing will keep aligned with index processing
+// It implies adding some extra alignment vertex at the end of the draw,
+// those vertex are not processed but they are considered as an additional offset
+// for the next set of vertex to be drawn
+
+// Select and active a texture slot
+
+// Enable texture
+
+// Disable texture
+
+// Enable texture cubemap
+
+// Disable texture cubemap
+
+// Set texture parameters (wrap mode/filter mode)
+
+// Reset anisotropy filter, in case it was set
+
+// Enable shader program
+
+// Disable shader program
+
+// Enable rendering to texture (fbo)
+
+// Disable rendering to texture
+
+// Activate multiple draw color buffers
+// NOTE: One color buffer is always active by default
+
+// NOTE: Maximum number of draw buffers supported is implementation dependant,
+// it can be queried with glGet*() but it must be at least 8
+//GLint maxDrawBuffers = 0;
+//glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
+
+//----------------------------------------------------------------------------------
+// General render state configuration
+//----------------------------------------------------------------------------------
+
+// Enable color blending
+
+// Disable color blending
+
+// Enable depth test
+
+// Disable depth test
+
+// Enable depth write
+
+// Disable depth write
+
+// Enable backface culling
+
+// Disable backface culling
+
+// Enable scissor test
+
+// Disable scissor test
+
+// Scissor test
+
+// Enable wire mode
+
+// NOTE: glPolygonMode() not available on OpenGL ES
+
+// Disable wire mode
+
+// NOTE: glPolygonMode() not available on OpenGL ES
+
+// Set the line drawing width
+
+// Get the line drawing width
+
+// Enable line aliasing
+
+// Disable line aliasing
+
+// Enable stereo rendering
+
+// Disable stereo rendering
+
+// Check if stereo render is enabled
+
+// Clear color buffer with color
+
+// Color values clamp to 0.0f(0) and 1.0f(255)
+
+// Clear used screen buffers (color and depth)
+
+// Clear used buffers: Color and Depth (Depth is used for 3D)
+//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);     // Stencil buffer not used...
+
+// Check and log OpenGL error codes
+
+// Set blend mode
+
+// NOTE: Using GL blend src/dst factors and GL equation configured with rlSetBlendFactors()
+
+// Set blending mode factor and equation
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - OpenGL Debug
+//----------------------------------------------------------------------------------
+
+// Ignore non-significant error/warning codes (NVidia drivers)
+// NOTE: Here there are the details with a sample output:
+// - #131169 - Framebuffer detailed info: The driver allocated storage for renderbuffer 2. (severity: low)
+// - #131185 - Buffer detailed info: Buffer object 1 (bound to GL_ELEMENT_ARRAY_BUFFER_ARB, usage hint is GL_ENUM_88e4)
+//             will use VIDEO memory as the source for buffer object operations. (severity: low)
+// - #131218 - Program/shader state performance warning: Vertex shader in program 7 is being recompiled based on GL state. (severity: medium)
+// - #131204 - Texture state usage warning: The texture object (0) bound to texture image unit 0 does not have
+//             a defined base level and cannot be used for texture mapping. (severity: low)
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition - rlgl functionality
+//----------------------------------------------------------------------------------
+
+// Initialize rlgl: OpenGL extensions, default buffers/shaders/textures, OpenGL states
+
+// Enable OpenGL debug context if required
+
+// glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DEBUG_SEVERITY_HIGH, 0, 0, GL_TRUE); // TODO: Filter message
+
+// Debug context options:
+//  - GL_DEBUG_OUTPUT - Faster version but not useful for breakpoints
+//  - GL_DEBUG_OUTPUT_SYNCHRONUS - Callback is in sync with errors, so a breakpoint can be placed on the callback in order to get a stacktrace for the GL error
+
+// Init default white texture
+// 1 pixel RGBA (4 bytes)
+
+// Init default Shader (customized for GL 3.3 and ES2)
+// Loaded: RLGL.State.defaultShaderId + RLGL.State.defaultShaderLocs
+
+// Init default vertex arrays buffers
+
+// Init stack matrices (emulating OpenGL 1.1)
+
+// Init internal matrices
+
+// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
+
+// Initialize OpenGL default states
+//----------------------------------------------------------
+// Init state: Depth test
+// Type of depth testing to apply
+// Disable depth testing for 2D (only used for 3D)
+
+// Init state: Blending mode
+// Color blending function (how colors are mixed)
+// Enable color blending (required to work with transparencies)
+
+// Init state: Culling
+// NOTE: All shapes/models triangles are drawn CCW
+// Cull the back face (default)
+// Front face are defined counter clockwise (default)
+// Enable backface culling
+
+// Init state: Cubemap seamless
+
+// Seamless cubemaps (not supported on OpenGL ES 2.0)
+
+// Init state: Color hints (deprecated in OpenGL 3.0+)
+// Improve quality of color and texture coordinate interpolation
+// Smooth shading between vertex (vertex colors interpolation)
+
+// Store screen size into global variables
+
+//----------------------------------------------------------
+
+// Init state: Color/Depth buffers clear
+// Set clear color (black)
+// Set clear depth value (default)
+// Clear color and depth buffers (depth buffer required for 3D)
+
+// Vertex Buffer Object deinitialization (memory free)
+
+// Unload default shader
+
+// Unload default texture
+
+// Load OpenGL extensions
+// NOTE: External loader function must be provided
+
+// Also defined for GRAPHICS_API_OPENGL_21
+// NOTE: glad is generated and contains only required OpenGL 3.3 Core extensions (and lower versions)
+
+// Get number of supported extensions
+
+// Get supported extensions list
+// WARNING: glGetStringi() not available on OpenGL 2.1
+
+// Register supported extensions flags
+// OpenGL 3.3 extensions supported by default (core)
+
+// NOTE: With GLAD, we can check if an extension is supported using the GLAD_GL_xxx booleans
+// Texture compression: DXT
+// Texture compression: ETC2/EAC
+
+// GRAPHICS_API_OPENGL_33
+
+// Get supported extensions list
+
+// Allocate 512 strings pointers (2 KB)
+// One big const string
+
+// NOTE: We have to duplicate string because glGetString() returns a const string
+// Get extensions string size in bytes
+
+// Check required extensions
+
+// Check VAO support
+// NOTE: Only check on OpenGL ES, OpenGL 3.3 has VAO support as core feature
+
+// The extension is supported by our hardware and driver, try to get related functions pointers
+// NOTE: emscripten does not support VAOs natively, it uses emulation and it reduces overall performance...
+
+//glIsVertexArray = (PFNGLISVERTEXARRAYOESPROC)loader("glIsVertexArrayOES");     // NOTE: Fails in WebGL, omitted
+
+// Check instanced rendering support
+// Web ANGLE
+
+// Standard EXT
+
+// Check NPOT textures support
+// NOTE: Only check on OpenGL ES, OpenGL 3.3 has NPOT textures full support as core feature
+
+// Check texture float support
+
+// Check depth texture support
+
+// Check texture compression support: DXT
+
+// Check texture compression support: ETC1
+
+// Check texture compression support: ETC2/EAC
+
+// Check texture compression support: PVR
+
+// Check texture compression support: ASTC
+
+// Check anisotropic texture filter support
+
+// Check clamp mirror wrap mode support
+
+// Free extensions pointers
+
+// Duplicated string must be deallocated
+// GRAPHICS_API_OPENGL_ES2
+
+// Check OpenGL information and capabilities
+//------------------------------------------------------------------------------
+// Show current OpenGL and GLSL version
+
+// NOTE: Anisotropy levels capability is an extension
+
+// Show some OpenGL GPU capabilities
+
+// GRAPHICS_API_OPENGL_43
+// RLGL_SHOW_GL_DETAILS_INFO
+
+// Show some basic info about GL supported features
+
+// RLGL_SHOW_GL_DETAILS_INFO
+
+// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
+
+// Get current OpenGL version
+
+// NOTE: Force OpenGL 3.3 on OSX
+
+// Set current framebuffer width
+
+// Set current framebuffer height
+
+// Get default framebuffer width
+
+// Get default framebuffer height
+
+// Get default internal texture (white texture)
+// NOTE: Default texture is a 1x1 pixel UNCOMPRESSED_R8G8B8A8
+
+// Get default shader id
+
+// Get default shader locs
+
+// Render batch management
+//------------------------------------------------------------------------------------------------
+// Load render batch
+
+// Initialize CPU (RAM) vertex buffers (position, texcoord, color data and indexes)
+//--------------------------------------------------------------------------------------------
+
+// 3 float by vertex, 4 vertex by quad
+// 2 float by texcoord, 4 texcoord by quad
+// 4 float by color, 4 colors by quad
+
+// 6 int by quad (indices)
+
+// 6 int by quad (indices)
+
+// Indices can be initialized right now
+
+//--------------------------------------------------------------------------------------------
+
+// Upload to GPU (VRAM) vertex data and initialize VAOs/VBOs
+//--------------------------------------------------------------------------------------------
+
+// Initialize Quads VAO
+
+// Quads - Vertex buffers binding and attributes enable
+// Vertex position buffer (shader-location = 0)
+
+// Vertex texcoord buffer (shader-location = 1)
+
+// Vertex color buffer (shader-location = 3)
+
+// Fill index buffer
+
+// Unbind the current VAO
+
+//--------------------------------------------------------------------------------------------
+
+// Init draw calls tracking system
+//--------------------------------------------------------------------------------------------
+
+//batch.draws[i].vaoId = 0;
+//batch.draws[i].shaderId = 0;
+
+//batch.draws[i].RLGL.State.projection = rlMatrixIdentity();
+//batch.draws[i].RLGL.State.modelview = rlMatrixIdentity();
+
+// Record buffer count
+// Reset draws counter
+// Reset depth value
+//--------------------------------------------------------------------------------------------
+
+// Unload default internal buffers vertex data from CPU and GPU
+
+// Unbind everything
+
+// Unload all vertex buffers data
+
+// Unbind VAO attribs data
+
+// Delete VBOs from GPU (VRAM)
+
+// Delete VAOs from GPU (VRAM)
+
+// Free vertex arrays memory from CPU (RAM)
+
+// Unload arrays
+
+// Draw render batch
+// NOTE: We require a pointer to reset batch and increase current buffer (multi-buffer)
+
+// Update batch vertex buffers
+//------------------------------------------------------------------------------------------------------------
+// NOTE: If there is not vertex data, buffers doesn't need to be updated (vertexCount > 0)
+// TODO: If no data changed on the CPU arrays --> No need to re-update GPU arrays (change flag required)
+
+// Activate elements VAO
+
+// Vertex positions buffer
+
+//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].vertices, GL_DYNAMIC_DRAW);  // Update all buffer
+
+// Texture coordinates buffer
+
+//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].texcoords, GL_DYNAMIC_DRAW); // Update all buffer
+
+// Colors buffer
+
+//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].colors, GL_DYNAMIC_DRAW);    // Update all buffer
+
+// NOTE: glMapBuffer() causes sync issue.
+// If GPU is working with this buffer, glMapBuffer() will wait(stall) until GPU to finish its job.
+// To avoid waiting (idle), you can call first glBufferData() with NULL pointer before glMapBuffer().
+// If you do that, the previous data in PBO will be discarded and glMapBuffer() returns a new
+// allocated pointer immediately even if GPU is still working with the previous data.
+
+// Another option: map the buffer object into client's memory
+// Probably this code could be moved somewhere else...
+// batch->vertexBuffer[batch->currentBuffer].vertices = (float *)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
+// if (batch->vertexBuffer[batch->currentBuffer].vertices)
+// {
+// Update vertex data
+// }
+// glUnmapBuffer(GL_ARRAY_BUFFER);
+
+// Unbind the current VAO
+
+//------------------------------------------------------------------------------------------------------------
+
+// Draw batch vertex buffers (considering VR stereo if required)
+//------------------------------------------------------------------------------------------------------------
+
+// Setup current eye viewport (half screen width)
+
+// Set current eye view offset to modelview matrix
+
+// Set current eye projection matrix
+
+// Draw buffers
+
+// Set current shader and upload current MVP matrix
+
+// Create modelview-projection matrix and upload to shader
+
+// Bind vertex attrib: position (shader-location = 0)
+
+// Bind vertex attrib: texcoord (shader-location = 1)
+
+// Bind vertex attrib: color (shader-location = 3)
+
+// Setup some default shader values
+
+// Active default sampler2D: texture0
+
+// Activate additional sampler textures
+// Those additional textures will be common for all draw calls of the batch
+
+// Activate default sampler2D texture0 (one texture is always active for default batch shader)
+// NOTE: Batch system accumulates calls by texture0 changes, additional textures are enabled for all the draw calls
+
+// Bind current draw call texture, activated as GL_TEXTURE0 and binded to sampler2D texture0 by default
+
+// We need to define the number of indices to be processed: elementCount*6
+// NOTE: The final parameter tells the GPU the offset in bytes from the
+// start of the index buffer to the location of the first index to process
+
+// Unbind textures
+
+// Unbind VAO
+
+// Unbind shader program
+
+// Restore viewport to default measures
+
+//------------------------------------------------------------------------------------------------------------
+
+// Reset batch buffers
+//------------------------------------------------------------------------------------------------------------
+// Reset vertex counter for next frame
+
+// Reset depth for next draw
+
+// Restore projection/modelview matrices
+
+// Reset RLGL.currentBatch->draws array
+
+// Reset active texture units for next batch
+
+// Reset draws counter to one draw for the batch
+
+//------------------------------------------------------------------------------------------------------------
+
+// Change to next buffer in the list (in case of multi-buffering)
+
+// Set the active render batch for rlgl
+
+// Update and draw internal render batch
+
+// NOTE: Stereo rendering is checked inside
+
+// Check internal buffer overflow for a given number of vertex
+// and force a rlRenderBatch draw call if required
+
+// NOTE: Stereo rendering is checked inside
+
+// Restore state of last batch so we can continue adding vertices
+
+// Textures data management
+//-----------------------------------------------------------------------------------------
+// Convert image data to OpenGL texture (returns OpenGL valid Id)
+
+// Free any old binding
+
+// Check texture format support by OpenGL 1.1 (compressed textures not supported)
+
+// GRAPHICS_API_OPENGL_11
+
+// Generate texture id
+
+// Mipmap data offset
+
+// Load the different mipmap levels
+
+// Security check for NPOT textures
+
+// Texture parameters configuration
+// NOTE: glTexParameteri does NOT affect texture uploading, just the way it's used
+
+// NOTE: OpenGL ES 2.0 with no GL_OES_texture_npot support (i.e. WebGL) has limited NPOT support, so CLAMP_TO_EDGE must be used
+
+// Set texture to repeat on x-axis
+// Set texture to repeat on y-axis
+
+// NOTE: If using negative texture coordinates (LoadOBJ()), it does not work!
+// Set texture to clamp on x-axis
+// Set texture to clamp on y-axis
+
+// Set texture to repeat on x-axis
+// Set texture to repeat on y-axis
+
+// Magnification and minification filters
+// Alternative: GL_LINEAR
+// Alternative: GL_LINEAR
+
+// Activate Trilinear filtering if mipmaps are available
+
+// At this point we have the texture loaded in GPU and texture parameters configured
+
+// NOTE: If mipmaps were not in data, they are not generated automatically
+
+// Unbind current texture
+
+// Load depth texture/renderbuffer (to be attached to fbo)
+// WARNING: OpenGL ES 2.0 requires GL_OES_depth_texture/WEBGL_depth_texture extensions
+
+// In case depth textures not supported, we force renderbuffer usage
+
+// NOTE: We let the implementation to choose the best bit-depth
+// Possible formats: GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32 and GL_DEPTH_COMPONENT32F
+
+// Create the renderbuffer that will serve as the depth attachment for the framebuffer
+// NOTE: A renderbuffer is simpler than a texture and could offer better performance on embedded devices
+
+// Load texture cubemap
+// NOTE: Cubemap data is expected to be 6 images in a single data array (one after the other),
+// expected the following convention: +X, -X, +Y, -Y, +Z, -Z
+
+// Load cubemap faces
+
+// Instead of using a sized internal texture format (GL_RGB16F, GL_RGB32F), we let the driver to choose the better format for us (GL_RGB)
+
+// Set cubemap texture sampling parameters
+
+// Flag not supported on OpenGL ES 2.0
+
+// Update already loaded texture in GPU with new data
+// NOTE: We don't know safely if internal texture format is the expected one...
+
+// Get OpenGL internal formats and data type from raylib PixelFormat
+
+// NOTE: on OpenGL ES 2.0 (WebGL), internalFormat must match format and options allowed are: GL_LUMINANCE, GL_RGB, GL_RGBA
+
+// NOTE: Requires extension OES_texture_float
+// NOTE: Requires extension OES_texture_float
+// NOTE: Requires extension OES_texture_float
+
+// NOTE: Requires OpenGL ES 2.0 or OpenGL 4.3
+// NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3
+// NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3
+// NOTE: Requires PowerVR GPU
+// NOTE: Requires PowerVR GPU
+// NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3
+// NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3
+
+// Unload texture from GPU memory
+
+// Generate mipmap data for selected texture
+
+// Check if texture is power-of-two (POT)
+
+// WARNING: Manual mipmap generation only works for RGBA 32bit textures!
+
+// Retrieve texture data from VRAM
+
+// NOTE: Texture data size is reallocated to fit mipmaps data
+// NOTE: CPU mipmap generation only supports RGBA 32bit data
+
+// Load the mipmaps
+
+// Once mipmaps have been generated and data has been uploaded to GPU VRAM, we can discard RAM data
+
+//glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);   // Hint for mipmaps generation algorithm: GL_FASTEST, GL_NICEST, GL_DONT_CARE
+// Generate mipmaps automatically
+
+// Read texture pixel data
+
+// NOTE: Using texture id, we can retrieve some texture info (but not on OpenGL ES 2.0)
+// Possible texture info: GL_TEXTURE_RED_SIZE, GL_TEXTURE_GREEN_SIZE, GL_TEXTURE_BLUE_SIZE, GL_TEXTURE_ALPHA_SIZE
+//int width, height, format;
+//glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
+//glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
+//glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &format);
+
+// NOTE: Each row written to or read from by OpenGL pixel operations like glGetTexImage are aligned to a 4 byte boundary by default, which may add some padding.
+// Use glPixelStorei to modify padding with the GL_[UN]PACK_ALIGNMENT setting.
+// GL_PACK_ALIGNMENT affects operations that read from OpenGL memory (glReadPixels, glGetTexImage, etc.)
+// GL_UNPACK_ALIGNMENT affects operations that write to OpenGL memory (glTexImage, etc.)
+
+// glGetTexImage() is not available on OpenGL ES 2.0
+// Texture width and height are required on OpenGL ES 2.0. There is no way to get it from texture id.
+// Two possible Options:
+// 1 - Bind texture to color fbo attachment and glReadPixels()
+// 2 - Create an fbo, activate it, render quad with texture, glReadPixels()
+// We are using Option 1, just need to care for texture format on retrieval
+// NOTE: This behaviour could be conditioned by graphic driver...
+
+// Attach our texture to FBO
+
+// We read data as RGBA because FBO texture is configured as RGBA, despite binding another texture format
+
+// Clean up temporal fbo
+
+// Read screen pixel data (color buffer)
+
+// NOTE 1: glReadPixels returns image flipped vertically -> (0,0) is the bottom left corner of the framebuffer
+// NOTE 2: We are getting alpha channel! Be careful, it can be transparent if not cleared properly!
+
+// Flip image vertically!
+
+// Flip line
+
+// Set alpha component value to 255 (no trasparent image retrieval)
+// NOTE: Alpha value has already been applied to RGB in framebuffer, we don't need it!
+
+// NOTE: image data should be freed
+
+// Framebuffer management (fbo)
+//-----------------------------------------------------------------------------------------
+// Load a framebuffer to be used for rendering
+// NOTE: No textures attached
+
+// Create the framebuffer object
+// Unbind any framebuffer
+
+// Attach color buffer texture to an fbo (unloads previous attachment)
+// NOTE: Attach type: 0-Color, 1-Depth renderbuffer, 2-Depth texture
+
+// Verify render texture is complete
+
+// Unload framebuffer from GPU memory
+// NOTE: All attached textures/cubemaps/renderbuffers are also deleted
+
+// Query depth attachment to automatically delete texture/renderbuffer
+
+// Bind framebuffer to query depth texture type
+
+// NOTE: If a texture object is deleted while its image is attached to the *currently bound* framebuffer,
+// the texture image is automatically detached from the currently bound framebuffer.
+
+// Vertex data management
+//-----------------------------------------------------------------------------------------
+// Load a new attributes buffer
+
+// Load a new attributes element buffer
+
+// Enable vertex buffer (VBO)
+
+// Disable vertex buffer (VBO)
+
+// Enable vertex buffer element (VBO element)
+
+// Disable vertex buffer element (VBO element)
+
+// Update vertex buffer with new data
+// NOTE: dataSize and offset must be provided in bytes
+
+// Update vertex buffer elements with new data
+// NOTE: dataSize and offset must be provided in bytes
+
+// Enable vertex array object (VAO)
+
+// Disable vertex array object (VAO)
+
+// Enable vertex attribute index
+
+// Disable vertex attribute index
+
+// Draw vertex array
+
+// Draw vertex array elements
+
+// Draw vertex array instanced
+
+// Draw vertex array elements instanced
+
+// Enable vertex state pointer
+
+//case GL_INDEX_ARRAY: if (buffer != NULL) glIndexPointer(GL_SHORT, 0, buffer); break; // Indexed colors
+
+// Disable vertex state pointer
+
+// Load vertex array object (VAO)
+
+// Set vertex attribute
+
+// Set vertex attribute divisor
+
+// Unload vertex array object (VAO)
+
+// Unload vertex buffer (VBO)
+
+//TRACELOG(RL_LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)");
+
+// Shaders management
+//-----------------------------------------------------------------------------------------------
+// Load shader from code strings
+// NOTE: If shader string is NULL, using default vertex/fragment shaders
+
+// Compile vertex shader (if provided)
+
+// In case no vertex shader was provided or compilation failed, we use default vertex shader
+
+// Compile fragment shader (if provided)
+
+// In case no fragment shader was provided or compilation failed, we use default fragment shader
+
+// In case vertex and fragment shader are the default ones, no need to recompile, we can just assign the default shader program id
+
+// One of or both shader are new, we need to compile a new shader program
+
+// We can detach and delete vertex/fragment shaders (if not default ones)
+// NOTE: We detach shader before deletion to make sure memory is freed
+
+// In case shader program loading failed, we assign default shader
+
+// In case shader loading fails, we return the default shader
+
+/*
+else
+{
+    // Get available shader uniforms
+    // NOTE: This information is useful for debug...
+    int uniformCount = -1;
+    glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &uniformCount);
+
+    for (int i = 0; i < uniformCount; i++)
+    {
+        int namelen = -1;
+        int num = -1;
+        char name[256] = { 0 };     // Assume no variable names longer than 256
+        GLenum type = GL_ZERO;
+
+        // Get the name of the uniforms
+        glGetActiveUniform(id, i, sizeof(name) - 1, &namelen, &num, &type, name);
+
+        name[namelen] = 0;
+        TRACELOGD("SHADER: [ID %i] Active uniform (%s) set at location: %i", id, name, glGetUniformLocation(id, name));
+    }
+}
+*/
+
+// Compile custom shader and return shader id
+
+//case GL_GEOMETRY_SHADER:
+
+//case GL_GEOMETRY_SHADER:
+
+// Load custom shader strings and return program id
+
+// NOTE: Default attribute shader locations must be binded before linking
+
+// NOTE: If some attrib name is no found on the shader, it locations becomes -1
+
+// NOTE: All uniform variables are intitialised to 0 when a program links
+
+// Get the size of compiled shader program (not available on OpenGL ES 2.0)
+// NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero.
+//GLint binarySize = 0;
+//glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize);
+
+// Unload shader program
+
+// Get shader location uniform
+
+// Get shader location attribute
+
+// Set shader value uniform
+
+// Set shader value attribute
+
+// Set shader value uniform matrix
+
+// Set shader value uniform sampler
+
+// Check if texture is already active
+
+// Register a new active texture for the internal batch system
+// NOTE: Default texture is always activated as GL_TEXTURE0
+
+// Activate new texture unit
+// Save texture id for binding on drawing
+
+// Set shader currently active (id and locations)
+
+// Load compute shader program
+
+// NOTE: All uniform variables are intitialised to 0 when a program links
+
+// Get the size of compiled shader program (not available on OpenGL ES 2.0)
+// NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero.
+//GLint binarySize = 0;
+//glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize);
+
+// Dispatch compute shader (equivalent to *draw* for graphics pilepine)
+
+// Load shader storage buffer object (SSBO)
+
+// Unload shader storage buffer object (SSBO)
+
+// Update SSBO buffer data
+
+// Get SSBO buffer size
+
+// Read SSBO buffer data
+
+// Bind SSBO buffer
+
+// Copy SSBO buffer data
+
+// Bind image texture
+
+// Matrix state management
+//-----------------------------------------------------------------------------------------
+// Get internal modelview matrix
+
+// Get internal projection matrix
+
+// Get internal accumulated transform matrix
+
+// TODO: Consider possible transform matrices in the RLGL.State.stack
+// Is this the right order? or should we start with the first stored matrix instead of the last one?
+//Matrix matStackTransform = rlMatrixIdentity();
+//for (int i = RLGL.State.stackCounter; i > 0; i--) matStackTransform = rlMatrixMultiply(RLGL.State.stack[i], matStackTransform);
+
+// Get internal projection matrix for stereo render (selected eye)
+
+// Get internal view offset matrix for stereo render (selected eye)
+
+// Set a custom modelview matrix (replaces internal modelview matrix)
+
+// Set a custom projection matrix (replaces internal projection matrix)
+
+// Set eyes projection matrices for stereo rendering
+
+// Set eyes view offsets matrices for stereo rendering
+
+// Load and draw a quad in NDC
+
+// Positions         Texcoords
+
+// Gen VAO to contain VBO
+
+// Gen and fill vertex buffer (VBO)
+
+// Bind vertex attributes (position, texcoords)
+
+// Positions
+
+// Texcoords
+
+// Draw quad
+
+// Delete buffers (VBO and VAO)
+
+// Load and draw a cube in NDC
+
+// Positions          Normals               Texcoords
+
+// Gen VAO to contain VBO
+
+// Gen and fill vertex buffer (VBO)
+
+// Bind vertex attributes (position, normals, texcoords)
+
+// Positions
+
+// Normals
+
+// Texcoords
+
+// Draw cube
+
+// Delete VBO and VAO
+
+// Get name string for pixel format
+
+// 8 bit per pixel (no alpha)
+// 8*2 bpp (2 channels)
+// 16 bpp
+// 24 bpp
+// 16 bpp (1 bit alpha)
+// 16 bpp (4 bit alpha)
+// 32 bpp
+// 32 bpp (1 channel - float)
+// 32*3 bpp (3 channels - float)
+// 32*4 bpp (4 channels - float)
+// 4 bpp (no alpha)
+// 4 bpp (1 bit alpha)
+// 8 bpp
+// 8 bpp
+// 4 bpp
+// 4 bpp
+// 8 bpp
+// 4 bpp
+// 4 bpp
+// 8 bpp
+// 2 bpp
+
+//----------------------------------------------------------------------------------
+// Module specific Functions Definition
+//----------------------------------------------------------------------------------
+
+// Load default shader (just vertex positioning and texture coloring)
+// NOTE: This shader program is used for internal buffers
+// NOTE: Loaded: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs
+
+// NOTE: All locations must be reseted to -1 (no location)
+
+// Vertex shader directly defined, no external file required
+
+// Fragment shader directly defined, no external file required
+
+// Precision required for OpenGL ES2 (WebGL)
+
+// NOTE: Compiled vertex/fragment shaders are not deleted,
+// they are kept for re-use as default shaders in case some shader loading fails
+// Compile default vertex shader
+// Compile default fragment shader
+
+// Set default shader locations: attributes locations
+
+// Set default shader locations: uniform locations
+
+// Unload default shader
+// NOTE: Unloads: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs
+
+// Get compressed format official GL identifier name
+
+// GL_EXT_texture_compression_s3tc
+
+// GL_3DFX_texture_compression_FXT1
+
+// GL_IMG_texture_compression_pvrtc
+
+// GL_OES_compressed_ETC1_RGB8_texture
+
+// GL_ARB_texture_compression_rgtc
+
+// GL_ARB_texture_compression_bptc
+
+// GL_ARB_ES3_compatibility
+
+// GL_KHR_texture_compression_astc_hdr
+
+// RLGL_SHOW_GL_DETAILS_INFO
+
+// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
+
+// Mipmaps data is generated after image data
+// NOTE: Only works with RGBA (4 bytes) data!
+
+// Required mipmap levels count (including base level)
+
+// Size in bytes (will include mipmaps...), RGBA only
+
+// Count mipmap levels required
+
+// Add mipmap size (in bytes)
+
+// RGBA: 4 bytes
+
+// Generate mipmaps
+// NOTE: Every mipmap data is stored after data (RGBA - 4 bytes)
+
+// Size of last mipmap
+
+// Mipmap size to store after offset
+
+// Add mipmap to data
+
+// free mipmap data
+
+// Manual mipmap generation (basic scaling algorithm)
+
+// Scaling algorithm works perfectly (box-filter)
+
+// GRAPHICS_API_OPENGL_11
+
+// Get pixel data size in bytes (image or texture)
+// NOTE: Size depends on pixel format
+
+// Size in bytes
+// Bits per pixel
+
+// Total data size in bytes
+
+// Most compressed formats works on 4x4 blocks,
+// if texture is smaller, minimum dataSize is 8 or 16
+
+// Auxiliar math functions
+
+// Get identity matrix
+
+// Get two matrix multiplication
+// NOTE: When multiplying matrices... the order matters!
+
+// RLGL_IMPLEMENTATION

+ 2 - 97
source/raylib_types.d

@@ -1,99 +1,4 @@
-/// This module defines basic types from Raylib with local modifications to make them easier to use.
+deprecated("module raylib_types is deprecated, import raylib.raylib_types instead")
 module raylib_types;
 module raylib_types;
 
 
-import raylib;
-
-// Vector2 type
-struct Vector2
-{
-    float x = 0.0f;
-    float y = 0.0f;
-    mixin Linear;
-}
-
-// Vector3 type
-struct Vector3
-{
-    float x = 0.0f;
-    float y = 0.0f;
-    float z = 0.0f;
-    mixin Linear;
-}
-
-// Vector4 type
-struct Vector4
-{
-    float x = 0.0f;
-    float y = 0.0f;
-    float z = 0.0f;
-    float w = 0.0f;
-    mixin Linear;
-}
-
-// Quaternion type, same as Vector4
-alias Quaternion = Vector4;
-
-// Matrix type (OpenGL style 4x4 - right handed, column major)
-struct Matrix
-{
-    float m0 = 0.0f;
-    float m4 = 0.0f;
-    float m8 = 0.0f;
-    float m12 = 0.0f;
-    float m1 = 0.0f;
-    float m5 = 0.0f;
-    float m9 = 0.0f;
-    float m13 = 0.0f;
-    float m2 = 0.0f;
-    float m6 = 0.0f;
-    float m10 = 0.0f;
-    float m14 = 0.0f;
-    float m3 = 0.0f;
-    float m7 = 0.0f;
-    float m11 = 0.0f;
-    float m15 = 0.0f;
-}
-
-// Rectangle type
-struct Rectangle
-{
-    float x;
-    float y;
-    float width;
-    float height;
-    alias w = width;
-    alias h = height;
-}
-
-enum Colors
-{
-    // Some Basic Colors
-    // NOTE: Custom raylib color palette for amazing visuals on WHITE background
-    LIGHTGRAY = Color(200, 200, 200, 255), // Light Gray
-    GRAY = Color(130, 130, 130, 255), // Gray
-    DARKGRAY = Color(80, 80, 80, 255), // Dark Gray
-    YELLOW = Color(253, 249, 0, 255), // Yellow
-    GOLD = Color(255, 203, 0, 255), // Gold
-    ORANGE = Color(255, 161, 0, 255), // Orange
-    PINK = Color(255, 109, 194, 255), // Pink
-    RED = Color(230, 41, 55, 255), // Red
-    MAROON = Color(190, 33, 55, 255), // Maroon
-    GREEN = Color(0, 228, 48, 255), // Green
-    LIME = Color(0, 158, 47, 255), // Lime
-    DARKGREEN = Color(0, 117, 44, 255), // Dark Green
-    SKYBLUE = Color(102, 191, 255, 255), // Sky Blue
-    BLUE = Color(0, 121, 241, 255), // Blue
-    DARKBLUE = Color(0, 82, 172, 255), // Dark Blue
-    PURPLE = Color(200, 122, 255, 255), // Purple
-    VIOLET = Color(135, 60, 190, 255), // Violet
-    DARKPURPLE = Color(112, 31, 126, 255), // Dark Purple
-    BEIGE = Color(211, 176, 131, 255), // Beige
-    BROWN = Color(127, 106, 79, 255), // Brown
-    DARKBROWN = Color(76, 63, 47, 255), // Dark Brown
-
-    WHITE = Color(255, 255, 255, 255), // White
-    BLACK = Color(0, 0, 0, 255), // Black
-    BLANK = Color(0, 0, 0, 0), // Blank (Transparent)
-    MAGENTA = Color(255, 0, 255, 255), // Magenta
-    RAYWHITE = Color(245, 245, 245, 255), // My own White (raylib logo)
-}
+public import raylib.raylib_types;

+ 2 - 557
source/raymath.d

@@ -1,559 +1,4 @@
+deprecated("module raymath is deprecated, import raylib.raymath instead")
 module raymath;
 module raymath;
 
 
-import raylib;
-/**********************************************************************************************
-*
-*   raymath v1.5 - Math functions to work with Vector2, Vector3, Matrix and Quaternions
-*
-*   CONFIGURATION:
-*
-*   #define RAYMATH_IMPLEMENTATION
-*       Generates the implementation of the library into the included file.
-*       If not defined, the library is in header only mode and can be included in other headers
-*       or source files without problems. But only ONE file should hold the implementation.
-*
-*   #define RAYMATH_STATIC_INLINE
-*       Define static inline functions code, so #include header suffices for use.
-*       This may use up lots of memory.
-*
-*   CONVENTIONS:
-*
-*     - Functions are always self-contained, no function use another raymath function inside,
-*       required code is directly re-implemented inside
-*     - Functions input parameters are always received by value (2 unavoidable exceptions)
-*     - Functions use always a "result" anmed variable for return
-*     - Functions are always defined inline
-*     - Angles are always in radians (DEG2RAD/RAD2DEG macros provided for convenience)
-*
-*
-*   LICENSE: zlib/libpng
-*
-*   Copyright (c) 2015-2021 Ramon Santamaria (@raysan5)
-*
-*   This software is provided "as-is", without any express or implied warranty. In no event
-*   will the authors be held liable for any damages arising from the use of this software.
-*
-*   Permission is granted to anyone to use this software for any purpose, including commercial
-*   applications, and to alter it and redistribute it freely, subject to the following restrictions:
-*
-*     1. The origin of this software must not be misrepresented; you must not claim that you
-*     wrote the original software. If you use this software in a product, an acknowledgment
-*     in the product documentation would be appreciated but is not required.
-*
-*     2. Altered source versions must be plainly marked as such, and must not be misrepresented
-*     as being the original software.
-*
-*     3. This notice may not be removed or altered from any source distribution.
-*
-**********************************************************************************************/
-
-extern (C) @nogc nothrow:
-
-// Function specifiers definition
-
-// We are building raylib as a Win32 shared library (.dll).
-
-// We are using raylib as a Win32 shared library (.dll)
-
-// Provide external definition
-
-// Functions may be inlined, no external out-of-line definition
-
-// plain inline not supported by tinycc (See issue #435) // Functions may be inlined or external definition used
-
-//----------------------------------------------------------------------------------
-// Defines and Macros
-//----------------------------------------------------------------------------------
-
-enum PI = 3.14159265358979323846f;
-
-enum DEG2RAD = PI / 180.0f;
-
-enum RAD2DEG = 180.0f / PI;
-
-// Get float vector for Matrix
-
-extern (D) auto MatrixToFloat(T)(auto ref T mat)
-{
-    return MatrixToFloatV(mat).v;
-}
-
-// Get float vector for Vector3
-
-extern (D) auto Vector3ToFloat(T)(auto ref T vec)
-{
-    return Vector3ToFloatV(vec).v;
-}
-
-//----------------------------------------------------------------------------------
-// Types and Structures Definition
-//----------------------------------------------------------------------------------
-
-// Vector2 type
-
-// Vector3 type
-
-// Vector4 type
-
-// Quaternion type
-
-// Matrix type (OpenGL style 4x4 - right handed, column major)
-
-// Matrix first row (4 components)
-// Matrix second row (4 components)
-// Matrix third row (4 components)
-// Matrix fourth row (4 components)
-
-// NOTE: Helper types to be used instead of array return types for *ToFloat functions
-struct float3
-{
-    float[3] v;
-}
-
-struct float16
-{
-    float[16] v;
-}
-
-// Required for: sinf(), cosf(), tan(), atan2f(), sqrtf(), fminf(), fmaxf(), fabs()
-
-//----------------------------------------------------------------------------------
-// Module Functions Definition - Utils math
-//----------------------------------------------------------------------------------
-
-// Clamp float value
-float Clamp(float value, float min, float max);
-
-// Calculate linear interpolation between two floats
-float Lerp(float start, float end, float amount);
-
-// Normalize input value within input range
-float Normalize(float value, float start, float end);
-
-// Remap input value within input range to output range
-float Remap(
-    float value,
-    float inputStart,
-    float inputEnd,
-    float outputStart,
-    float outputEnd);
-
-//----------------------------------------------------------------------------------
-// Module Functions Definition - Vector2 math
-//----------------------------------------------------------------------------------
-
-// Vector with components value 0.0f
-Vector2 Vector2Zero();
-
-// Vector with components value 1.0f
-Vector2 Vector2One();
-
-// Add two vectors (v1 + v2)
-Vector2 Vector2Add(Vector2 v1, Vector2 v2);
-
-// Add vector and float value
-Vector2 Vector2AddValue(Vector2 v, float add);
-
-// Subtract two vectors (v1 - v2)
-Vector2 Vector2Subtract(Vector2 v1, Vector2 v2);
-
-// Subtract vector by float value
-Vector2 Vector2SubtractValue(Vector2 v, float sub);
-
-// Calculate vector length
-float Vector2Length(Vector2 v);
-
-// Calculate vector square length
-float Vector2LengthSqr(Vector2 v);
-
-// Calculate two vectors dot product
-float Vector2DotProduct(Vector2 v1, Vector2 v2);
-
-// Calculate distance between two vectors
-float Vector2Distance(Vector2 v1, Vector2 v2);
-
-// Calculate angle from two vectors in X-axis
-float Vector2Angle(Vector2 v1, Vector2 v2);
-
-// Scale vector (multiply by value)
-Vector2 Vector2Scale(Vector2 v, float scale);
-
-// Multiply vector by vector
-Vector2 Vector2Multiply(Vector2 v1, Vector2 v2);
-
-// Negate vector
-Vector2 Vector2Negate(Vector2 v);
-
-// Divide vector by vector
-Vector2 Vector2Divide(Vector2 v1, Vector2 v2);
-
-// Normalize provided vector
-Vector2 Vector2Normalize(Vector2 v);
-
-// Calculate linear interpolation between two vectors
-Vector2 Vector2Lerp(Vector2 v1, Vector2 v2, float amount);
-
-// Calculate reflected vector to normal
-
-// Dot product
-Vector2 Vector2Reflect(Vector2 v, Vector2 normal);
-
-// Rotate vector by angle
-Vector2 Vector2Rotate(Vector2 v, float angle);
-
-// Move Vector towards target
-Vector2 Vector2MoveTowards(Vector2 v, Vector2 target, float maxDistance);
-
-//----------------------------------------------------------------------------------
-// Module Functions Definition - Vector3 math
-//----------------------------------------------------------------------------------
-
-// Vector with components value 0.0f
-Vector3 Vector3Zero();
-
-// Vector with components value 1.0f
-Vector3 Vector3One();
-
-// Add two vectors
-Vector3 Vector3Add(Vector3 v1, Vector3 v2);
-
-// Add vector and float value
-Vector3 Vector3AddValue(Vector3 v, float add);
-
-// Subtract two vectors
-Vector3 Vector3Subtract(Vector3 v1, Vector3 v2);
-
-// Subtract vector by float value
-Vector3 Vector3SubtractValue(Vector3 v, float sub);
-
-// Multiply vector by scalar
-Vector3 Vector3Scale(Vector3 v, float scalar);
-
-// Multiply vector by vector
-Vector3 Vector3Multiply(Vector3 v1, Vector3 v2);
-
-// Calculate two vectors cross product
-Vector3 Vector3CrossProduct(Vector3 v1, Vector3 v2);
-
-// Calculate one vector perpendicular vector
-
-// Cross product between vectors
-Vector3 Vector3Perpendicular(Vector3 v);
-
-// Calculate vector length
-float Vector3Length(const Vector3 v);
-
-// Calculate vector square length
-float Vector3LengthSqr(const Vector3 v);
-
-// Calculate two vectors dot product
-float Vector3DotProduct(Vector3 v1, Vector3 v2);
-
-// Calculate distance between two vectors
-float Vector3Distance(Vector3 v1, Vector3 v2);
-
-// Calculate angle between two vectors in XY and XZ
-
-// Angle in XZ
-// Angle in XY
-Vector2 Vector3Angle(Vector3 v1, Vector3 v2);
-
-// Negate provided vector (invert direction)
-Vector3 Vector3Negate(Vector3 v);
-
-// Divide vector by vector
-Vector3 Vector3Divide(Vector3 v1, Vector3 v2);
-
-// Normalize provided vector
-Vector3 Vector3Normalize(Vector3 v);
-
-// Orthonormalize provided vectors
-// Makes vectors normalized and orthogonal to each other
-// Gram-Schmidt function implementation
-
-// Vector3Normalize(*v1);
-
-// Vector3CrossProduct(*v1, *v2)
-
-// Vector3Normalize(vn1);
-
-// Vector3CrossProduct(vn1, *v1)
-void Vector3OrthoNormalize(Vector3* v1, Vector3* v2);
-
-// Transforms a Vector3 by a given Matrix
-Vector3 Vector3Transform(Vector3 v, Matrix mat);
-
-// Transform a vector by quaternion rotation
-Vector3 Vector3RotateByQuaternion(Vector3 v, Quaternion q);
-
-// Calculate linear interpolation between two vectors
-Vector3 Vector3Lerp(Vector3 v1, Vector3 v2, float amount);
-
-// Calculate reflected vector to normal
-
-// I is the original vector
-// N is the normal of the incident plane
-// R = I - (2*N*(DotProduct[I, N]))
-Vector3 Vector3Reflect(Vector3 v, Vector3 normal);
-
-// Get min value for each pair of components
-Vector3 Vector3Min(Vector3 v1, Vector3 v2);
-
-// Get max value for each pair of components
-Vector3 Vector3Max(Vector3 v1, Vector3 v2);
-
-// Compute barycenter coordinates (u, v, w) for point p with respect to triangle (a, b, c)
-// NOTE: Assumes P is on the plane of the triangle
-
-// Vector3Subtract(b, a)
-// Vector3Subtract(c, a)
-// Vector3Subtract(p, a)
-// Vector3DotProduct(v0, v0)
-// Vector3DotProduct(v0, v1)
-// Vector3DotProduct(v1, v1)
-// Vector3DotProduct(v2, v0)
-// Vector3DotProduct(v2, v1)
-Vector3 Vector3Barycenter(Vector3 p, Vector3 a, Vector3 b, Vector3 c);
-
-// Projects a Vector3 from screen space into object space
-// NOTE: We are avoiding calling other raymath functions despite available
-
-// Calculate unproject matrix (multiply view patrix by projection matrix) and invert it
-// MatrixMultiply(view, projection);
-
-// Calculate inverted matrix -> MatrixInvert(matViewProj);
-// Cache the matrix values (speed optimization)
-
-// Calculate the invert determinant (inlined to avoid double-caching)
-
-// Create quaternion from source point
-
-// Multiply quat point by unproject matrix
-// QuaternionTransform(quat, matViewProjInv)
-
-// Normalized world points in vectors
-Vector3 Vector3Unproject(Vector3 source, Matrix projection, Matrix view);
-
-// Get Vector3 as float array
-float3 Vector3ToFloatV(Vector3 v);
-
-//----------------------------------------------------------------------------------
-// Module Functions Definition - Matrix math
-//----------------------------------------------------------------------------------
-
-// Compute matrix determinant
-
-// Cache the matrix values (speed optimization)
-float MatrixDeterminant(Matrix mat);
-
-// Get the trace of the matrix (sum of the values along the diagonal)
-float MatrixTrace(Matrix mat);
-
-// Transposes provided matrix
-Matrix MatrixTranspose(Matrix mat);
-
-// Invert provided matrix
-
-// Cache the matrix values (speed optimization)
-
-// Calculate the invert determinant (inlined to avoid double-caching)
-Matrix MatrixInvert(Matrix mat);
-
-// Normalize provided matrix
-
-// Cache the matrix values (speed optimization)
-
-// MatrixDeterminant(mat)
-Matrix MatrixNormalize(Matrix mat);
-
-// Get identity matrix
-Matrix MatrixIdentity();
-
-// Add two matrices
-Matrix MatrixAdd(Matrix left, Matrix right);
-
-// Subtract two matrices (left - right)
-Matrix MatrixSubtract(Matrix left, Matrix right);
-
-// Get two matrix multiplication
-// NOTE: When multiplying matrices... the order matters!
-Matrix MatrixMultiply(Matrix left, Matrix right);
-
-// Get translation matrix
-Matrix MatrixTranslate(float x, float y, float z);
-
-// Create rotation matrix from axis and angle
-// NOTE: Angle should be provided in radians
-Matrix MatrixRotate(Vector3 axis, float angle);
-
-// Get x-rotation matrix (angle in radians)
-
-// MatrixIdentity()
-Matrix MatrixRotateX(float angle);
-
-// Get y-rotation matrix (angle in radians)
-
-// MatrixIdentity()
-Matrix MatrixRotateY(float angle);
-
-// Get z-rotation matrix (angle in radians)
-
-// MatrixIdentity()
-Matrix MatrixRotateZ(float angle);
-
-// Get xyz-rotation matrix (angles in radians)
-
-// MatrixIdentity()
-Matrix MatrixRotateXYZ(Vector3 ang);
-
-// Get zyx-rotation matrix (angles in radians)
-Matrix MatrixRotateZYX(Vector3 ang);
-
-// Get scaling matrix
-Matrix MatrixScale(float x, float y, float z);
-
-// Get perspective projection matrix
-Matrix MatrixFrustum(
-    double left,
-    double right,
-    double bottom,
-    double top,
-    double near,
-    double far);
-
-// Get perspective projection matrix
-// NOTE: Angle should be provided in radians
-
-// MatrixFrustum(-right, right, -top, top, near, far);
-Matrix MatrixPerspective(double fovy, double aspect, double near, double far);
-
-// Get orthographic projection matrix
-Matrix MatrixOrtho(
-    double left,
-    double right,
-    double bottom,
-    double top,
-    double near,
-    double far);
-
-// Get camera look-at matrix (view matrix)
-
-// Vector3Subtract(eye, target)
-
-// Vector3Normalize(vz)
-
-// Vector3CrossProduct(up, vz)
-
-// Vector3Normalize(x)
-
-// Vector3CrossProduct(vz, vx)
-
-// Vector3DotProduct(vx, eye)
-// Vector3DotProduct(vy, eye)
-// Vector3DotProduct(vz, eye)
-Matrix MatrixLookAt(Vector3 eye, Vector3 target, Vector3 up);
-
-// Get float array of matrix data
-float16 MatrixToFloatV(Matrix mat);
-
-//----------------------------------------------------------------------------------
-// Module Functions Definition - Quaternion math
-//----------------------------------------------------------------------------------
-
-// Add two quaternions
-Quaternion QuaternionAdd(Quaternion q1, Quaternion q2);
-
-// Add quaternion and float value
-Quaternion QuaternionAddValue(Quaternion q, float add);
-
-// Subtract two quaternions
-Quaternion QuaternionSubtract(Quaternion q1, Quaternion q2);
-
-// Subtract quaternion and float value
-Quaternion QuaternionSubtractValue(Quaternion q, float sub);
-
-// Get identity quaternion
-Quaternion QuaternionIdentity();
-
-// Computes the length of a quaternion
-float QuaternionLength(Quaternion q);
-
-// Normalize provided quaternion
-Quaternion QuaternionNormalize(Quaternion q);
-
-// Invert provided quaternion
-Quaternion QuaternionInvert(Quaternion q);
-
-// Calculate two quaternion multiplication
-Quaternion QuaternionMultiply(Quaternion q1, Quaternion q2);
-
-// Scale quaternion by float value
-Quaternion QuaternionScale(Quaternion q, float mul);
-
-// Divide two quaternions
-Quaternion QuaternionDivide(Quaternion q1, Quaternion q2);
-
-// Calculate linear interpolation between two quaternions
-Quaternion QuaternionLerp(Quaternion q1, Quaternion q2, float amount);
-
-// Calculate slerp-optimized interpolation between two quaternions
-
-// QuaternionLerp(q1, q2, amount)
-
-// QuaternionNormalize(q);
-Quaternion QuaternionNlerp(Quaternion q1, Quaternion q2, float amount);
-
-// Calculates spherical linear interpolation between two quaternions
-Quaternion QuaternionSlerp(Quaternion q1, Quaternion q2, float amount);
-
-// Calculate quaternion based on the rotation from one vector to another
-
-// Vector3DotProduct(from, to)
-// Vector3CrossProduct(from, to)
-
-// QuaternionNormalize(q);
-// NOTE: Normalize to essentially nlerp the original and identity to 0.5
-Quaternion QuaternionFromVector3ToVector3(Vector3 from, Vector3 to);
-
-// Get a quaternion for a given rotation matrix
-Quaternion QuaternionFromMatrix(Matrix mat);
-
-// Get a matrix for a given quaternion
-
-// MatrixIdentity()
-Matrix QuaternionToMatrix(Quaternion q);
-
-// Get rotation quaternion for an angle and axis
-// NOTE: angle must be provided in radians
-
-// Vector3Normalize(axis)
-
-// QuaternionNormalize(q);
-Quaternion QuaternionFromAxisAngle(Vector3 axis, float angle);
-
-// Get the rotation angle and axis for a given quaternion
-
-// QuaternionNormalize(q);
-
-// This occurs when the angle is zero.
-// Not a problem: just set an arbitrary normalized axis.
-void QuaternionToAxisAngle(Quaternion q, Vector3* outAxis, float* outAngle);
-
-// Get the quaternion equivalent to Euler angles
-// NOTE: Rotation order is ZYX
-Quaternion QuaternionFromEuler(float pitch, float yaw, float roll);
-
-// Get the Euler angles equivalent to quaternion (roll, pitch, yaw)
-// NOTE: Angles are returned in a Vector3 struct in radians
-
-// Roll (x-axis rotation)
-
-// Pitch (y-axis rotation)
-
-// Yaw (z-axis rotation)
-Vector3 QuaternionToEuler(Quaternion q);
-
-// Transform a quaternion given a transformation matrix
-Quaternion QuaternionTransform(Quaternion q, Matrix mat);
-
-// RAYMATH_H
+public import raylib.raymath;

+ 2 - 323
source/raymathext.d

@@ -1,325 +1,4 @@
+deprecated("module raymathext is deprecated, import raylib.raymathext instead")
 module raymathext;
 module raymathext;
 
 
-import raylib;
-import std.math;
-
-pragma(inline, true):
-
-// Bivector2 type
-struct Bivector2
-{
-    float xy = 0.0f;
-    alias xy this;
-    mixin Linear;
-}
-
-// Bivector3 type
-/// Beware of the field order
-/// xy is the first field
-struct Bivector3
-{
-    float xy = 0.0f;
-    float yz = 0.0f;
-    float zx = 0.0f;
-    mixin Linear;
-}
-
-// Rotor type
-struct Rotor3
-{
-    float a = 1.0f;
-    float xy = 0.0f;
-    float yz = 0.0f;
-    float zx = 0.0f;
-    mixin Linear;
-
-    alias i = yz;
-    alias j = zx;
-    alias k = xy;
-
-    @property Bivector3 b()
-    {
-        return Bivector3(xy, yz, zx);
-    }
-
-    @property Bivector3 b(Bivector3 _b)
-    {
-        xy = _b.xy;
-        yz = _b.yz;
-        zx = _b.zx;
-        return _b;
-    }
-
-    this(float _a, Bivector3 _b)
-    {
-        a = _a;
-        b = _b;
-    }
-
-    this(float _a, float _xy, float _yz, float _zx)
-    {
-        a = _a;
-        xy = _xy;
-        yz = _yz;
-        zx = _zx;
-    }
-}
-
-alias Matrix4 = Matrix;
-
-version (unittest)
-{
-    import fluent.asserts;
-}
-
-mixin template Linear()
-{
-    import std.algorithm : canFind, map;
-    import std.range : join;
-    import std.traits : FieldNameTuple;
-
-    private static alias T = typeof(this);
-
-    static T zero()
-    {
-        enum fragment = [FieldNameTuple!T].map!(field => "0.").join(",");
-        return mixin("T(" ~ fragment ~ ")");
-    }
-
-    static T one()
-    {
-        enum fragment = [FieldNameTuple!T].map!(field => "1.").join(",");
-        return mixin("T(" ~ fragment ~ ")");
-    }
-
-    inout T opUnary(string op)() if (["+", "-"].canFind(op))
-    {
-        enum fragment = [FieldNameTuple!T].map!(field => op ~ field).join(",");
-        return mixin("T(" ~ fragment ~ ")");
-    }
-
-    static if (is(T == Rotor3))
-    {
-        /// Returns a rotor equivalent to first apply p, then apply q
-        inout Rotor3 opBinary(string op)(inout Rotor3 q) if (op == "*")
-        {
-            alias p = this;
-            Rotor3 r;
-            r.a = p.a * q.a - p.i * q.i - p.j * q.j - p.k * q.k;
-            r.i = p.i * q.a + p.a * q.i + p.j * q.k - p.k * q.j;
-            r.j = p.j * q.a + p.a * q.j + p.k * q.i - p.i * q.k;
-            r.k = p.k * q.a + p.a * q.k + p.i * q.j - p.j * q.i;
-            return r;
-        }
-
-        inout Vector3 opBinary(string op)(inout Vector3 v) if (op == "*")
-        {
-            Vector3 rv;
-            rv.x = a * v.x + xy * v.y - zx * v.z;
-            rv.y = a * v.y + yz * v.z - xy * v.x;
-            rv.z = a * v.z + zx * v.x - yz * v.y;
-            return rv;
-        }
-
-        inout Vector3 opBinaryRight(string op)(inout Vector3 v) if (op == "*")
-        {
-            Vector3 vr;
-            vr.x = v.x * a - v.y * xy + v.z * zx;
-            vr.y = v.y * a - v.z * yz + v.x * xy;
-            vr.z = v.z * a - v.x * zx + v.y * yz;
-            return vr;
-        }
-    }
-    else
-    {
-        inout T opBinary(string op)(inout T rhs) if (["+", "-"].canFind(op))
-        {
-            enum fragment = [FieldNameTuple!T].map!(field => field ~ op ~ "rhs." ~ field).join(",");
-            return mixin("T(" ~ fragment ~ ")");
-        }
-
-        ref T opOpAssign(string op)(inout T rhs) if (["+", "-"].canFind(op))
-        {
-            static foreach (field; [FieldNameTuple!T])
-                mixin(field ~ op ~ "= rhs." ~ field ~ ";");
-            return this;
-        }
-    }
-
-    inout T opBinary(string op)(inout float rhs) if (["+", "-", "*", "/"].canFind(op))
-    {
-        enum fragment = [FieldNameTuple!T].map!(field => field ~ op ~ "rhs").join(",");
-        return mixin("T(" ~ fragment ~ ")");
-    }
-
-    inout T opBinaryRight(string op)(inout float lhs) if (["+", "-", "*", "/"].canFind(op))
-    {
-        enum fragment = [FieldNameTuple!T].map!(field => "lhs" ~ op ~ field).join(",");
-        return mixin("T(" ~ fragment ~ ")");
-    }
-
-    ref T opOpAssign(string op)(inout float rhs) if (["+", "-", "*", "/"].canFind(op))
-    {
-        static foreach (field; [FieldNameTuple!T])
-            mixin(field ~ op ~ "= rhs;");
-        return this;
-    }
-}
-
-unittest
-{
-    Assert.equal(Vector2.init, Vector2.zero);
-    Assert.equal(Vector2(), Vector2.zero);
-    Assert.equal(-Vector2(1, 2), Vector2(-1, -2));
-    auto a = Vector3(1, 2, 9);
-    immutable b = Vector3(3, 4, 9);
-    Vector3 c = a + b;
-    Assert.equal(c, Vector3(4, 6, 18));
-    Assert.equal(4.0f - Vector2.zero, Vector2(4, 4));
-    Assert.equal(Vector2.one - 3.0f, Vector2(-2, -2));
-    a += 5;
-    Assert.equal(a, Vector3(6, 7, 14));
-    a *= 0.5;
-    Assert.equal(a, Vector3(3, 3.5, 7));
-    a += Vector3(3, 2.5, -1);
-    Assert.equal(a, Vector3(6, 6, 6));
-}
-
-import std.traits : FieldNameTuple;
-import std.algorithm : map;
-import std.range : join;
-
-float length(T)(T v)
-{
-    enum fragment = [FieldNameTuple!T].map!(field => "v." ~ field ~ "*" ~ "v." ~ field).join("+");
-    return mixin("sqrt(" ~ fragment ~ ")");
-}
-
-T normal(T)(T v)
-{
-    return v / v.length;
-}
-
-float distance(T)(T lhs, T rhs)
-{
-    return (lhs - rhs).length;
-}
-
-float dot(T)(T lhs, T rhs)
-{
-    enum fragment = [FieldNameTuple!T].map!(field => "lhs." ~ field ~ "*" ~ "rhs." ~ field).join(
-                "+");
-    return mixin(fragment);
-}
-
-unittest
-{
-    Assert.equal(Vector2(3, 4).length, 5);
-    const a = Vector2(-3, 4);
-    Assert.equal(a.normal, Vector2(-3. / 5., 4. / 5.));
-    immutable b = Vector2(9, 8);
-    Assert.equal(b.distance(Vector2(-3, 3)), 13);
-    Assert.equal(Vector3(2, 3, 4).dot(Vector3(4, 5, 6)), 47);
-    Assert.equal(Vector2.one.length, sqrt(2.0f));
-}
-
-unittest
-{
-    Assert.equal(Rotor3(1, 2, 3, 4), Rotor3(1, Bivector3(2, 3, 4)));
-}
-
-/// Mix `amount` of `lhs` with `1-amount` of `rhs`
-///   `amount` should be between 0 and 1, but can be anything
-///   lerp(lhs, rhs, 0) == lhs
-///   lerp(lhs, rhs, 1) == rhs
-T lerp(T)(T lhs, T rhs, float amount)
-{
-    return lhs + amount * (rhs - lhs);
-}
-
-/// angle betwenn vector and x-axis (+y +x -> positive)
-float angle(Vector2 v)
-{
-    return atan2(v.y, v.x);
-}
-
-Vector2 rotate(Vector2 v, float angle)
-{
-    return Vector2(v.x * cos(angle) - v.y * sin(angle), v.x * sin(angle) + v.y * cos(angle));
-}
-
-Vector2 slide(Vector2 v, Vector2 along)
-{
-    return along.normal * dot(v, along);
-}
-
-Bivector2 wedge(Vector2 lhs, Vector2 rhs)
-{
-    Bivector2 result = {xy: lhs.x * rhs.y - lhs.y * rhs.x};
-    return result;
-}
-
-// dfmt off
-Bivector3 wedge(Vector3 lhs, Vector3 rhs)
-{
-    Bivector3 result = {
-        xy: lhs.x * rhs.y - lhs.y * rhs.x,
-        yz: lhs.y * rhs.z - lhs.z * rhs.y,
-        zx: lhs.z * rhs.x - lhs.x * rhs.z,
-    };
-    return result;
-}
-
-Vector3 transform(Vector3 v, Matrix4 mat)
-{
-    with (v) with (mat)
-        return Vector3(
-            m0 * x + m4 * y + m8 * z + m12,
-            m1 * x + m5 * y + m9 * z + m13,
-            m2 * x + m6 * y + m10 * z + m14
-        );
-}
-// dfmt on
-
-Vector3 cross(Vector3 lhs, Vector3 rhs)
-{
-    auto v = wedge(lhs, rhs);
-    return Vector3(v.yz, v.zx, v.xy);
-}
-
-unittest {
-    // TODO
-}
-
-/// Returns a unit rotor that rotates `from` to `to`
-Rotor3 rotation(Vector3 from, Vector3 to)
-{
-    return Rotor3(1 + dot(to, from), wedge(to, from)).normal;
-}
-
-Rotor3 rotation(float angle, Bivector3 plane)
-{
-    return Rotor3(cos(angle / 2.0f), -sin(angle / 2.0f) * plane);
-}
-
-/// Rotate q by p
-Rotor3 rotate(Rotor3 p, Rotor3 q)
-{
-    return p * q * p.reverse;
-}
-
-/// Rotate v by r
-Vector3 rotate(Rotor3 r, Vector3 v)
-{
-    return r * v * r.reverse;
-}
-
-Rotor3 reverse(Rotor3 r)
-{
-    return Rotor3(r.a, -r.b);
-}
-
-unittest
-{
-    // TODO
-}
+public import raylib.raymathext;

+ 2 - 1884
source/rlgl.d

@@ -1,1886 +1,4 @@
+deprecated("module rlgl is deprecated, import raylib.rlgl instead")
 module rlgl;
 module rlgl;
 
 
-import raylib;
-/**********************************************************************************************
-*
-*   rlgl v4.0 - A multi-OpenGL abstraction layer with an immediate-mode style API
-*
-*   An abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, 4.3 Core, ES 2.0)
-*   that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...)
-*
-*   When chosing an OpenGL backend different than OpenGL 1.1, some internal buffer are
-*   initialized on rlglInit() to accumulate vertex data.
-*
-*   When an internal state change is required all the stored vertex data is renderer in batch,
-*   additioanlly, rlDrawRenderBatchActive() could be called to force flushing of the batch.
-*
-*   Some additional resources are also loaded for convenience, here the complete list:
-*      - Default batch (RLGL.defaultBatch): RenderBatch system to accumulate vertex data
-*      - Default texture (RLGL.defaultTextureId): 1x1 white pixel R8G8B8A8
-*      - Default shader (RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs)
-*
-*   Internal buffer (and additional resources) must be manually unloaded calling rlglClose().
-*
-*
-*   CONFIGURATION:
-*
-*   #define GRAPHICS_API_OPENGL_11
-*   #define GRAPHICS_API_OPENGL_21
-*   #define GRAPHICS_API_OPENGL_33
-*   #define GRAPHICS_API_OPENGL_43
-*   #define GRAPHICS_API_OPENGL_ES2
-*       Use selected OpenGL graphics backend, should be supported by platform
-*       Those preprocessor defines are only used on rlgl module, if OpenGL version is
-*       required by any other module, use rlGetVersion() to check it
-*
-*   #define RLGL_IMPLEMENTATION
-*       Generates the implementation of the library into the included file.
-*       If not defined, the library is in header only mode and can be included in other headers
-*       or source files without problems. But only ONE file should hold the implementation.
-*
-*   #define RLGL_RENDER_TEXTURES_HINT
-*       Enable framebuffer objects (fbo) support (enabled by default)
-*       Some GPUs could not support them despite the OpenGL version
-*
-*   #define RLGL_SHOW_GL_DETAILS_INFO
-*       Show OpenGL extensions and capabilities detailed logs on init
-*
-*   #define RLGL_ENABLE_OPENGL_DEBUG_CONTEXT
-*       Enable debug context (only available on OpenGL 4.3)
-*
-*   rlgl capabilities could be customized just defining some internal
-*   values before library inclusion (default values listed):
-*
-*   #define RL_DEFAULT_BATCH_BUFFER_ELEMENTS   8192    // Default internal render batch elements limits
-*   #define RL_DEFAULT_BATCH_BUFFERS              1    // Default number of batch buffers (multi-buffering)
-*   #define RL_DEFAULT_BATCH_DRAWCALLS          256    // Default number of batch draw calls (by state changes: mode, texture)
-*   #define RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS    4    // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture())
-*
-*   #define RL_MAX_MATRIX_STACK_SIZE             32    // Maximum size of internal Matrix stack
-*   #define RL_MAX_SHADER_LOCATIONS              32    // Maximum number of shader locations supported
-*   #define RL_CULL_DISTANCE_NEAR              0.01    // Default projection matrix near cull distance
-*   #define RL_CULL_DISTANCE_FAR             1000.0    // Default projection matrix far cull distance
-*
-*   When loading a shader, the following vertex attribute and uniform
-*   location names are tried to be set automatically:
-*
-*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_POSITION     "vertexPosition"    // Binded by default to shader location: 0
-*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD     "vertexTexCoord"    // Binded by default to shader location: 1
-*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_NORMAL       "vertexNormal"      // Binded by default to shader location: 2
-*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_COLOR        "vertexColor"       // Binded by default to shader location: 3
-*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_TANGENT      "vertexTangent"     // Binded by default to shader location: 4
-*   #define RL_DEFAULT_SHADER_ATTRIB_NAME_TEXCOORD2    "vertexTexCoord2"   // Binded by default to shader location: 5
-*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_MVP         "mvp"               // model-view-projection matrix
-*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_VIEW        "matView"           // view matrix
-*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_PROJECTION  "matProjection"     // projection matrix
-*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_MODEL       "matModel"          // model matrix
-*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_NORMAL      "matNormal"         // normal matrix (transpose(inverse(matModelView))
-*   #define RL_DEFAULT_SHADER_UNIFORM_NAME_COLOR       "colDiffuse"        // color diffuse (base tint color, multiplied by texture color)
-*   #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE0  "texture0"          // texture0 (texture slot active 0)
-*   #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE1  "texture1"          // texture1 (texture slot active 1)
-*   #define RL_DEFAULT_SHADER_SAMPLER2D_NAME_TEXTURE2  "texture2"          // texture2 (texture slot active 2)
-*
-*   DEPENDENCIES:
-*
-*      - OpenGL libraries (depending on platform and OpenGL version selected)
-*      - GLAD OpenGL extensions loading library (only for OpenGL 3.3 Core, 4.3 Core)
-*
-*
-*   LICENSE: zlib/libpng
-*
-*   Copyright (c) 2014-2021 Ramon Santamaria (@raysan5)
-*
-*   This software is provided "as-is", without any express or implied warranty. In no event
-*   will the authors be held liable for any damages arising from the use of this software.
-*
-*   Permission is granted to anyone to use this software for any purpose, including commercial
-*   applications, and to alter it and redistribute it freely, subject to the following restrictions:
-*
-*     1. The origin of this software must not be misrepresented; you must not claim that you
-*     wrote the original software. If you use this software in a product, an acknowledgment
-*     in the product documentation would be appreciated but is not required.
-*
-*     2. Altered source versions must be plainly marked as such, and must not be misrepresented
-*     as being the original software.
-*
-*     3. This notice may not be removed or altered from any source distribution.
-*
-**********************************************************************************************/
-
-extern (C) @nogc nothrow:
-
-enum RLGL_VERSION = "4.0";
-
-// Function specifiers in case library is build/used as a shared library (Windows)
-// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll
-
-// We are building the library as a Win32 shared library (.dll)
-
-// We are using the library as a Win32 shared library (.dll)
-
-// Function specifiers definition // Functions defined as 'extern' by default (implicit specifiers)
-
-// Support TRACELOG macros
-
-// Allow custom memory allocators
-
-// Security check in case no GRAPHICS_API_OPENGL_* defined
-
-// Security check in case multiple GRAPHICS_API_OPENGL_* defined
-
-// OpenGL 2.1 uses most of OpenGL 3.3 Core functionality
-// WARNING: Specific parts are checked with #if defines
-
-// OpenGL 4.3 uses OpenGL 3.3 Core functionality
-
-// Support framebuffer objects by default
-// NOTE: Some driver implementation do not support it, despite they should
-
-//----------------------------------------------------------------------------------
-// Defines and Macros
-//----------------------------------------------------------------------------------
-
-// Default internal render batch elements limits
-
-// This is the maximum amount of elements (quads) per batch
-// NOTE: Be careful with text, every letter maps to a quad
-enum RL_DEFAULT_BATCH_BUFFER_ELEMENTS = 8192;
-
-// We reduce memory sizes for embedded systems (RPI and HTML5)
-// NOTE: On HTML5 (emscripten) this is allocated on heap,
-// by default it's only 16MB!...just take care...
-
-enum RL_DEFAULT_BATCH_BUFFERS = 1; // Default number of batch buffers (multi-buffering)
-
-enum RL_DEFAULT_BATCH_DRAWCALLS = 256; // Default number of batch draw calls (by state changes: mode, texture)
-
-enum RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS = 4; // Maximum number of textures units that can be activated on batch drawing (SetShaderValueTexture())
-
-// Internal Matrix stack
-
-enum RL_MAX_MATRIX_STACK_SIZE = 32; // Maximum size of Matrix stack
-
-// Shader limits
-
-enum RL_MAX_SHADER_LOCATIONS = 32; // Maximum number of shader locations supported
-
-// Projection matrix culling
-
-enum RL_CULL_DISTANCE_NEAR = 0.01; // Default near cull distance
-
-enum RL_CULL_DISTANCE_FAR = 1000.0; // Default far cull distance
-
-// Texture parameters (equivalent to OpenGL defines)
-enum RL_TEXTURE_WRAP_S = 0x2802; // GL_TEXTURE_WRAP_S
-enum RL_TEXTURE_WRAP_T = 0x2803; // GL_TEXTURE_WRAP_T
-enum RL_TEXTURE_MAG_FILTER = 0x2800; // GL_TEXTURE_MAG_FILTER
-enum RL_TEXTURE_MIN_FILTER = 0x2801; // GL_TEXTURE_MIN_FILTER
-
-enum RL_TEXTURE_FILTER_NEAREST = 0x2600; // GL_NEAREST
-enum RL_TEXTURE_FILTER_LINEAR = 0x2601; // GL_LINEAR
-enum RL_TEXTURE_FILTER_MIP_NEAREST = 0x2700; // GL_NEAREST_MIPMAP_NEAREST
-enum RL_TEXTURE_FILTER_NEAREST_MIP_LINEAR = 0x2702; // GL_NEAREST_MIPMAP_LINEAR
-enum RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST = 0x2701; // GL_LINEAR_MIPMAP_NEAREST
-enum RL_TEXTURE_FILTER_MIP_LINEAR = 0x2703; // GL_LINEAR_MIPMAP_LINEAR
-enum RL_TEXTURE_FILTER_ANISOTROPIC = 0x3000; // Anisotropic filter (custom identifier)
-
-enum RL_TEXTURE_WRAP_REPEAT = 0x2901; // GL_REPEAT
-enum RL_TEXTURE_WRAP_CLAMP = 0x812F; // GL_CLAMP_TO_EDGE
-enum RL_TEXTURE_WRAP_MIRROR_REPEAT = 0x8370; // GL_MIRRORED_REPEAT
-enum RL_TEXTURE_WRAP_MIRROR_CLAMP = 0x8742; // GL_MIRROR_CLAMP_EXT
-
-// Matrix modes (equivalent to OpenGL)
-enum RL_MODELVIEW = 0x1700; // GL_MODELVIEW
-enum RL_PROJECTION = 0x1701; // GL_PROJECTION
-enum RL_TEXTURE = 0x1702; // GL_TEXTURE
-
-// Primitive assembly draw modes
-enum RL_LINES = 0x0001; // GL_LINES
-enum RL_TRIANGLES = 0x0004; // GL_TRIANGLES
-enum RL_QUADS = 0x0007; // GL_QUADS
-
-// GL equivalent data types
-enum RL_UNSIGNED_BYTE = 0x1401; // GL_UNSIGNED_BYTE
-enum RL_FLOAT = 0x1406; // GL_FLOAT
-
-// Buffer usage hint
-enum RL_STREAM_DRAW = 0x88E0; // GL_STREAM_DRAW
-enum RL_STREAM_READ = 0x88E1; // GL_STREAM_READ
-enum RL_STREAM_COPY = 0x88E2; // GL_STREAM_COPY
-enum RL_STATIC_DRAW = 0x88E4; // GL_STATIC_DRAW
-enum RL_STATIC_READ = 0x88E5; // GL_STATIC_READ
-enum RL_STATIC_COPY = 0x88E6; // GL_STATIC_COPY
-enum RL_DYNAMIC_DRAW = 0x88E8; // GL_DYNAMIC_DRAW
-enum RL_DYNAMIC_READ = 0x88E9; // GL_DYNAMIC_READ
-enum RL_DYNAMIC_COPY = 0x88EA; // GL_DYNAMIC_COPY
-
-// GL Shader type
-enum RL_FRAGMENT_SHADER = 0x8B30; // GL_FRAGMENT_SHADER
-enum RL_VERTEX_SHADER = 0x8B31; // GL_VERTEX_SHADER
-enum RL_COMPUTE_SHADER = 0x91B9; // GL_COMPUTE_SHADER
-
-//----------------------------------------------------------------------------------
-// Types and Structures Definition
-//----------------------------------------------------------------------------------
-enum rlGlVersion
-{
-    OPENGL_11 = 1,
-    OPENGL_21 = 2,
-    OPENGL_33 = 3,
-    OPENGL_43 = 4,
-    OPENGL_ES_20 = 5
-}
-
-enum rlFramebufferAttachType
-{
-    RL_ATTACHMENT_COLOR_CHANNEL0 = 0,
-    RL_ATTACHMENT_COLOR_CHANNEL1 = 1,
-    RL_ATTACHMENT_COLOR_CHANNEL2 = 2,
-    RL_ATTACHMENT_COLOR_CHANNEL3 = 3,
-    RL_ATTACHMENT_COLOR_CHANNEL4 = 4,
-    RL_ATTACHMENT_COLOR_CHANNEL5 = 5,
-    RL_ATTACHMENT_COLOR_CHANNEL6 = 6,
-    RL_ATTACHMENT_COLOR_CHANNEL7 = 7,
-    RL_ATTACHMENT_DEPTH = 100,
-    RL_ATTACHMENT_STENCIL = 200
-}
-
-enum rlFramebufferAttachTextureType
-{
-    RL_ATTACHMENT_CUBEMAP_POSITIVE_X = 0,
-    RL_ATTACHMENT_CUBEMAP_NEGATIVE_X = 1,
-    RL_ATTACHMENT_CUBEMAP_POSITIVE_Y = 2,
-    RL_ATTACHMENT_CUBEMAP_NEGATIVE_Y = 3,
-    RL_ATTACHMENT_CUBEMAP_POSITIVE_Z = 4,
-    RL_ATTACHMENT_CUBEMAP_NEGATIVE_Z = 5,
-    RL_ATTACHMENT_TEXTURE2D = 100,
-    RL_ATTACHMENT_RENDERBUFFER = 200
-}
-
-// Dynamic vertex buffers (position + texcoords + colors + indices arrays)
-struct rlVertexBuffer
-{
-    int elementCount; // Number of elements in the buffer (QUADS)
-
-    float* vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0)
-    float* texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1)
-    ubyte* colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3)
-
-    uint* indices; // Vertex indices (in case vertex data comes indexed) (6 indices per quad)
-
-    // Vertex indices (in case vertex data comes indexed) (6 indices per quad)
-
-    uint vaoId; // OpenGL Vertex Array Object id
-    uint[4] vboId; // OpenGL Vertex Buffer Objects id (4 types of vertex data)
-}
-
-// Draw call type
-// NOTE: Only texture changes register a new draw, other state-change-related elements are not
-// used at this moment (vaoId, shaderId, matrices), raylib just forces a batch draw call if any
-// of those state-change happens (this is done in core module)
-struct rlDrawCall
-{
-    int mode; // Drawing mode: LINES, TRIANGLES, QUADS
-    int vertexCount; // Number of vertex of the draw
-    int vertexAlignment; // Number of vertex required for index alignment (LINES, TRIANGLES)
-    //unsigned int vaoId;       // Vertex array id to be used on the draw -> Using RLGL.currentBatch->vertexBuffer.vaoId
-    //unsigned int shaderId;    // Shader id to be used on the draw -> Using RLGL.currentShaderId
-    uint textureId; // Texture id to be used on the draw -> Use to create new draw call if changes
-
-    //Matrix projection;      // Projection matrix for this draw -> Using RLGL.projection by default
-    //Matrix modelview;       // Modelview matrix for this draw -> Using RLGL.modelview by default
-}
-
-// rlRenderBatch type
-struct rlRenderBatch
-{
-    int bufferCount; // Number of vertex buffers (multi-buffering support)
-    int currentBuffer; // Current buffer tracking in case of multi-buffering
-    rlVertexBuffer* vertexBuffer; // Dynamic buffer(s) for vertex data
-
-    rlDrawCall* draws; // Draw calls array, depends on textureId
-    int drawCounter; // Draw calls counter
-    float currentDepth; // Current depth value for next draw
-}
-
-// Boolean type
-
-// Matrix, 4x4 components, column major, OpenGL style, right handed
-
-// Matrix first row (4 components)
-// Matrix second row (4 components)
-// Matrix third row (4 components)
-// Matrix fourth row (4 components)
-
-// Trace log level
-// NOTE: Organized by priority level
-enum rlTraceLogLevel
-{
-    RL_LOG_ALL = 0, // Display all logs
-    RL_LOG_TRACE = 1, // Trace logging, intended for internal use only
-    RL_LOG_DEBUG = 2, // Debug logging, used for internal debugging, it should be disabled on release builds
-    RL_LOG_INFO = 3, // Info logging, used for program execution info
-    RL_LOG_WARNING = 4, // Warning logging, used on recoverable failures
-    RL_LOG_ERROR = 5, // Error logging, used on unrecoverable failures
-    RL_LOG_FATAL = 6, // Fatal logging, used to abort program: exit(EXIT_FAILURE)
-    RL_LOG_NONE = 7 // Disable logging
-}
-
-// Texture formats (support depends on OpenGL version)
-enum rlPixelFormat
-{
-    RL_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha)
-    RL_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA = 2, // 8*2 bpp (2 channels)
-    RL_PIXELFORMAT_UNCOMPRESSED_R5G6B5 = 3, // 16 bpp
-    RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8 = 4, // 24 bpp
-    RL_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1 = 5, // 16 bpp (1 bit alpha)
-    RL_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4 = 6, // 16 bpp (4 bit alpha)
-    RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 = 7, // 32 bpp
-    RL_PIXELFORMAT_UNCOMPRESSED_R32 = 8, // 32 bpp (1 channel - float)
-    RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32 = 9, // 32*3 bpp (3 channels - float)
-    RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32 = 10, // 32*4 bpp (4 channels - float)
-    RL_PIXELFORMAT_COMPRESSED_DXT1_RGB = 11, // 4 bpp (no alpha)
-    RL_PIXELFORMAT_COMPRESSED_DXT1_RGBA = 12, // 4 bpp (1 bit alpha)
-    RL_PIXELFORMAT_COMPRESSED_DXT3_RGBA = 13, // 8 bpp
-    RL_PIXELFORMAT_COMPRESSED_DXT5_RGBA = 14, // 8 bpp
-    RL_PIXELFORMAT_COMPRESSED_ETC1_RGB = 15, // 4 bpp
-    RL_PIXELFORMAT_COMPRESSED_ETC2_RGB = 16, // 4 bpp
-    RL_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA = 17, // 8 bpp
-    RL_PIXELFORMAT_COMPRESSED_PVRT_RGB = 18, // 4 bpp
-    RL_PIXELFORMAT_COMPRESSED_PVRT_RGBA = 19, // 4 bpp
-    RL_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA = 20, // 8 bpp
-    RL_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA = 21 // 2 bpp
-}
-
-// Texture parameters: filter mode
-// NOTE 1: Filtering considers mipmaps if available in the texture
-// NOTE 2: Filter is accordingly set for minification and magnification
-enum rlTextureFilter
-{
-    RL_TEXTURE_FILTER_POINT = 0, // No filter, just pixel aproximation
-    RL_TEXTURE_FILTER_BILINEAR = 1, // Linear filtering
-    RL_TEXTURE_FILTER_TRILINEAR = 2, // Trilinear filtering (linear with mipmaps)
-    RL_TEXTURE_FILTER_ANISOTROPIC_4X = 3, // Anisotropic filtering 4x
-    RL_TEXTURE_FILTER_ANISOTROPIC_8X = 4, // Anisotropic filtering 8x
-    RL_TEXTURE_FILTER_ANISOTROPIC_16X = 5 // Anisotropic filtering 16x
-}
-
-// Color blending modes (pre-defined)
-enum rlBlendMode
-{
-    RL_BLEND_ALPHA = 0, // Blend textures considering alpha (default)
-    RL_BLEND_ADDITIVE = 1, // Blend textures adding colors
-    RL_BLEND_MULTIPLIED = 2, // Blend textures multiplying colors
-    RL_BLEND_ADD_COLORS = 3, // Blend textures adding colors (alternative)
-    RL_BLEND_SUBTRACT_COLORS = 4, // Blend textures subtracting colors (alternative)
-    RL_BLEND_CUSTOM = 5 // Belnd textures using custom src/dst factors (use SetBlendModeCustom())
-}
-
-// Shader location point type
-enum rlShaderLocationIndex
-{
-    RL_SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position
-    RL_SHADER_LOC_VERTEX_TEXCOORD01 = 1, // Shader location: vertex attribute: texcoord01
-    RL_SHADER_LOC_VERTEX_TEXCOORD02 = 2, // Shader location: vertex attribute: texcoord02
-    RL_SHADER_LOC_VERTEX_NORMAL = 3, // Shader location: vertex attribute: normal
-    RL_SHADER_LOC_VERTEX_TANGENT = 4, // Shader location: vertex attribute: tangent
-    RL_SHADER_LOC_VERTEX_COLOR = 5, // Shader location: vertex attribute: color
-    RL_SHADER_LOC_MATRIX_MVP = 6, // Shader location: matrix uniform: model-view-projection
-    RL_SHADER_LOC_MATRIX_VIEW = 7, // Shader location: matrix uniform: view (camera transform)
-    RL_SHADER_LOC_MATRIX_PROJECTION = 8, // Shader location: matrix uniform: projection
-    RL_SHADER_LOC_MATRIX_MODEL = 9, // Shader location: matrix uniform: model (transform)
-    RL_SHADER_LOC_MATRIX_NORMAL = 10, // Shader location: matrix uniform: normal
-    RL_SHADER_LOC_VECTOR_VIEW = 11, // Shader location: vector uniform: view
-    RL_SHADER_LOC_COLOR_DIFFUSE = 12, // Shader location: vector uniform: diffuse color
-    RL_SHADER_LOC_COLOR_SPECULAR = 13, // Shader location: vector uniform: specular color
-    RL_SHADER_LOC_COLOR_AMBIENT = 14, // Shader location: vector uniform: ambient color
-    RL_SHADER_LOC_MAP_ALBEDO = 15, // Shader location: sampler2d texture: albedo (same as: RL_SHADER_LOC_MAP_DIFFUSE)
-    RL_SHADER_LOC_MAP_METALNESS = 16, // Shader location: sampler2d texture: metalness (same as: RL_SHADER_LOC_MAP_SPECULAR)
-    RL_SHADER_LOC_MAP_NORMAL = 17, // Shader location: sampler2d texture: normal
-    RL_SHADER_LOC_MAP_ROUGHNESS = 18, // Shader location: sampler2d texture: roughness
-    RL_SHADER_LOC_MAP_OCCLUSION = 19, // Shader location: sampler2d texture: occlusion
-    RL_SHADER_LOC_MAP_EMISSION = 20, // Shader location: sampler2d texture: emission
-    RL_SHADER_LOC_MAP_HEIGHT = 21, // Shader location: sampler2d texture: height
-    RL_SHADER_LOC_MAP_CUBEMAP = 22, // Shader location: samplerCube texture: cubemap
-    RL_SHADER_LOC_MAP_IRRADIANCE = 23, // Shader location: samplerCube texture: irradiance
-    RL_SHADER_LOC_MAP_PREFILTER = 24, // Shader location: samplerCube texture: prefilter
-    RL_SHADER_LOC_MAP_BRDF = 25 // Shader location: sampler2d texture: brdf
-}
-
-enum RL_SHADER_LOC_MAP_DIFFUSE = rlShaderLocationIndex.RL_SHADER_LOC_MAP_ALBEDO;
-enum RL_SHADER_LOC_MAP_SPECULAR = rlShaderLocationIndex.RL_SHADER_LOC_MAP_METALNESS;
-
-// Shader uniform data type
-enum rlShaderUniformDataType
-{
-    RL_SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float
-    RL_SHADER_UNIFORM_VEC2 = 1, // Shader uniform type: vec2 (2 float)
-    RL_SHADER_UNIFORM_VEC3 = 2, // Shader uniform type: vec3 (3 float)
-    RL_SHADER_UNIFORM_VEC4 = 3, // Shader uniform type: vec4 (4 float)
-    RL_SHADER_UNIFORM_INT = 4, // Shader uniform type: int
-    RL_SHADER_UNIFORM_IVEC2 = 5, // Shader uniform type: ivec2 (2 int)
-    RL_SHADER_UNIFORM_IVEC3 = 6, // Shader uniform type: ivec3 (3 int)
-    RL_SHADER_UNIFORM_IVEC4 = 7, // Shader uniform type: ivec4 (4 int)
-    RL_SHADER_UNIFORM_SAMPLER2D = 8 // Shader uniform type: sampler2d
-}
-
-// Shader attribute data types
-enum rlShaderAttributeDataType
-{
-    RL_SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float
-    RL_SHADER_ATTRIB_VEC2 = 1, // Shader attribute type: vec2 (2 float)
-    RL_SHADER_ATTRIB_VEC3 = 2, // Shader attribute type: vec3 (3 float)
-    RL_SHADER_ATTRIB_VEC4 = 3 // Shader attribute type: vec4 (4 float)
-}
-
-//------------------------------------------------------------------------------------
-// Functions Declaration - Matrix operations
-//------------------------------------------------------------------------------------
-
-// Prevents name mangling of functions
-
-void rlMatrixMode(int mode); // Choose the current matrix to be transformed
-void rlPushMatrix(); // Push the current matrix to stack
-void rlPopMatrix(); // Pop lattest inserted matrix from stack
-void rlLoadIdentity(); // Reset current matrix to identity matrix
-void rlTranslatef(float x, float y, float z); // Multiply the current matrix by a translation matrix
-void rlRotatef(float angle, float x, float y, float z); // Multiply the current matrix by a rotation matrix
-void rlScalef(float x, float y, float z); // Multiply the current matrix by a scaling matrix
-void rlMultMatrixf(float* matf); // Multiply the current matrix by another matrix
-void rlFrustum(double left, double right, double bottom, double top, double znear, double zfar);
-void rlOrtho(double left, double right, double bottom, double top, double znear, double zfar);
-void rlViewport(int x, int y, int width, int height); // Set the viewport area
-
-//------------------------------------------------------------------------------------
-// Functions Declaration - Vertex level operations
-//------------------------------------------------------------------------------------
-void rlBegin(int mode); // Initialize drawing mode (how to organize vertex)
-void rlEnd(); // Finish vertex providing
-void rlVertex2i(int x, int y); // Define one vertex (position) - 2 int
-void rlVertex2f(float x, float y); // Define one vertex (position) - 2 float
-void rlVertex3f(float x, float y, float z); // Define one vertex (position) - 3 float
-void rlTexCoord2f(float x, float y); // Define one vertex (texture coordinate) - 2 float
-void rlNormal3f(float x, float y, float z); // Define one vertex (normal) - 3 float
-void rlColor4ub(ubyte r, ubyte g, ubyte b, ubyte a); // Define one vertex (color) - 4 byte
-void rlColor3f(float x, float y, float z); // Define one vertex (color) - 3 float
-void rlColor4f(float x, float y, float z, float w); // Define one vertex (color) - 4 float
-
-//------------------------------------------------------------------------------------
-// Functions Declaration - OpenGL style functions (common to 1.1, 3.3+, ES2)
-// NOTE: This functions are used to completely abstract raylib code from OpenGL layer,
-// some of them are direct wrappers over OpenGL calls, some others are custom
-//------------------------------------------------------------------------------------
-
-// Vertex buffers state
-bool rlEnableVertexArray(uint vaoId); // Enable vertex array (VAO, if supported)
-void rlDisableVertexArray(); // Disable vertex array (VAO, if supported)
-void rlEnableVertexBuffer(uint id); // Enable vertex buffer (VBO)
-void rlDisableVertexBuffer(); // Disable vertex buffer (VBO)
-void rlEnableVertexBufferElement(uint id); // Enable vertex buffer element (VBO element)
-void rlDisableVertexBufferElement(); // Disable vertex buffer element (VBO element)
-void rlEnableVertexAttribute(uint index); // Enable vertex attribute index
-void rlDisableVertexAttribute(uint index); // Disable vertex attribute index
-
-// Enable attribute state pointer
-// Disable attribute state pointer
-
-// Textures state
-void rlActiveTextureSlot(int slot); // Select and active a texture slot
-void rlEnableTexture(uint id); // Enable texture
-void rlDisableTexture(); // Disable texture
-void rlEnableTextureCubemap(uint id); // Enable texture cubemap
-void rlDisableTextureCubemap(); // Disable texture cubemap
-void rlTextureParameters(uint id, int param, int value); // Set texture parameters (filter, wrap)
-
-// Shader state
-void rlEnableShader(uint id); // Enable shader program
-void rlDisableShader(); // Disable shader program
-
-// Framebuffer state
-void rlEnableFramebuffer(uint id); // Enable render texture (fbo)
-void rlDisableFramebuffer(); // Disable render texture (fbo), return to default framebuffer
-void rlActiveDrawBuffers(int count); // Activate multiple draw color buffers
-
-// General render state
-void rlEnableColorBlend(); // Enable color blending
-void rlDisableColorBlend(); // Disable color blending
-void rlEnableDepthTest(); // Enable depth test
-void rlDisableDepthTest(); // Disable depth test
-void rlEnableDepthMask(); // Enable depth write
-void rlDisableDepthMask(); // Disable depth write
-void rlEnableBackfaceCulling(); // Enable backface culling
-void rlDisableBackfaceCulling(); // Disable backface culling
-void rlEnableScissorTest(); // Enable scissor test
-void rlDisableScissorTest(); // Disable scissor test
-void rlScissor(int x, int y, int width, int height); // Scissor test
-void rlEnableWireMode(); // Enable wire mode
-void rlDisableWireMode(); // Disable wire mode
-void rlSetLineWidth(float width); // Set the line drawing width
-float rlGetLineWidth(); // Get the line drawing width
-void rlEnableSmoothLines(); // Enable line aliasing
-void rlDisableSmoothLines(); // Disable line aliasing
-void rlEnableStereoRender(); // Enable stereo rendering
-void rlDisableStereoRender(); // Disable stereo rendering
-bool rlIsStereoRenderEnabled(); // Check if stereo render is enabled
-
-void rlClearColor(ubyte r, ubyte g, ubyte b, ubyte a); // Clear color buffer with color
-void rlClearScreenBuffers(); // Clear used screen buffers (color and depth)
-void rlCheckErrors(); // Check and log OpenGL error codes
-void rlSetBlendMode(int mode); // Set blending mode
-void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation); // Set blending mode factor and equation (using OpenGL factors)
-
-//------------------------------------------------------------------------------------
-// Functions Declaration - rlgl functionality
-//------------------------------------------------------------------------------------
-// rlgl initialization functions
-void rlglInit(int width, int height); // Initialize rlgl (buffers, shaders, textures, states)
-void rlglClose(); // De-inititialize rlgl (buffers, shaders, textures)
-void rlLoadExtensions(void* loader); // Load OpenGL extensions (loader function required)
-int rlGetVersion(); // Get current OpenGL version
-int rlGetFramebufferWidth(); // Get default framebuffer width
-int rlGetFramebufferHeight(); // Get default framebuffer height
-
-uint rlGetTextureIdDefault(); // Get default texture id
-uint rlGetShaderIdDefault(); // Get default shader id
-int* rlGetShaderLocsDefault(); // Get default shader locations
-
-// Render batch management
-// NOTE: rlgl provides a default render batch to behave like OpenGL 1.1 immediate mode
-// but this render batch API is exposed in case of custom batches are required
-rlRenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements); // Load a render batch system
-void rlUnloadRenderBatch(rlRenderBatch batch); // Unload render batch system
-void rlDrawRenderBatch(rlRenderBatch* batch); // Draw render batch data (Update->Draw->Reset)
-void rlSetRenderBatchActive(rlRenderBatch* batch); // Set the active render batch for rlgl (NULL for default internal)
-void rlDrawRenderBatchActive(); // Update and draw internal render batch
-bool rlCheckRenderBatchLimit(int vCount); // Check internal buffer overflow for a given number of vertex
-void rlSetTexture(uint id); // Set current texture for render batch and check buffers limits
-
-//------------------------------------------------------------------------------------------------------------------------
-
-// Vertex buffers management
-uint rlLoadVertexArray(); // Load vertex array (vao) if supported
-uint rlLoadVertexBuffer(void* buffer, int size, bool dynamic); // Load a vertex buffer attribute
-uint rlLoadVertexBufferElement(void* buffer, int size, bool dynamic); // Load a new attributes element buffer
-void rlUpdateVertexBuffer(uint bufferId, void* data, int dataSize, int offset); // Update GPU buffer with new data
-void rlUnloadVertexArray(uint vaoId);
-void rlUnloadVertexBuffer(uint vboId);
-void rlSetVertexAttribute(uint index, int compSize, int type, bool normalized, int stride, void* pointer);
-void rlSetVertexAttributeDivisor(uint index, int divisor);
-void rlSetVertexAttributeDefault(int locIndex, const(void)* value, int attribType, int count); // Set vertex attribute default value
-void rlDrawVertexArray(int offset, int count);
-void rlDrawVertexArrayElements(int offset, int count, void* buffer);
-void rlDrawVertexArrayInstanced(int offset, int count, int instances);
-void rlDrawVertexArrayElementsInstanced(int offset, int count, void* buffer, int instances);
-
-// Textures management
-uint rlLoadTexture(void* data, int width, int height, int format, int mipmapCount); // Load texture in GPU
-uint rlLoadTextureDepth(int width, int height, bool useRenderBuffer); // Load depth texture/renderbuffer (to be attached to fbo)
-uint rlLoadTextureCubemap(void* data, int size, int format); // Load texture cubemap
-void rlUpdateTexture(uint id, int offsetX, int offsetY, int width, int height, int format, const(void)* data); // Update GPU texture with new data
-void rlGetGlTextureFormats(int format, int* glInternalFormat, int* glFormat, int* glType); // Get OpenGL internal formats
-const(char)* rlGetPixelFormatName(uint format); // Get name string for pixel format
-void rlUnloadTexture(uint id); // Unload texture from GPU memory
-void rlGenTextureMipmaps(uint id, int width, int height, int format, int* mipmaps); // Generate mipmap data for selected texture
-void* rlReadTexturePixels(uint id, int width, int height, int format); // Read texture pixel data
-ubyte* rlReadScreenPixels(int width, int height); // Read screen pixel data (color buffer)
-
-// Framebuffer management (fbo)
-uint rlLoadFramebuffer(int width, int height); // Load an empty framebuffer
-void rlFramebufferAttach(uint fboId, uint texId, int attachType, int texType, int mipLevel); // Attach texture/renderbuffer to a framebuffer
-bool rlFramebufferComplete(uint id); // Verify framebuffer is complete
-void rlUnloadFramebuffer(uint id); // Delete framebuffer from GPU
-
-// Shaders management
-uint rlLoadShaderCode(const(char)* vsCode, const(char)* fsCode); // Load shader from code strings
-uint rlCompileShader(const(char)* shaderCode, int type); // Compile custom shader and return shader id (type: RL_VERTEX_SHADER, RL_FRAGMENT_SHADER, RL_COMPUTE_SHADER)
-uint rlLoadShaderProgram(uint vShaderId, uint fShaderId); // Load custom shader program
-void rlUnloadShaderProgram(uint id); // Unload shader program
-int rlGetLocationUniform(uint shaderId, const(char)* uniformName); // Get shader location uniform
-int rlGetLocationAttrib(uint shaderId, const(char)* attribName); // Get shader location attribute
-void rlSetUniform(int locIndex, const(void)* value, int uniformType, int count); // Set shader value uniform
-void rlSetUniformMatrix(int locIndex, Matrix mat); // Set shader value matrix
-void rlSetUniformSampler(int locIndex, uint textureId); // Set shader value sampler
-void rlSetShader(uint id, int* locs); // Set shader currently active (id and locations)
-
-// Compute shader management
-uint rlLoadComputeShaderProgram(uint shaderId); // Load compute shader program
-void rlComputeShaderDispatch(uint groupX, uint groupY, uint groupZ); // Dispatch compute shader (equivalent to *draw* for graphics pilepine)
-
-// Shader buffer storage object management (ssbo)
-uint rlLoadShaderBuffer(ulong size, const(void)* data, int usageHint); // Load shader storage buffer object (SSBO)
-void rlUnloadShaderBuffer(uint ssboId); // Unload shader storage buffer object (SSBO)
-void rlUpdateShaderBufferElements(uint id, const(void)* data, ulong dataSize, ulong offset); // Update SSBO buffer data
-ulong rlGetShaderBufferSize(uint id); // Get SSBO buffer size
-void rlReadShaderBufferElements(uint id, void* dest, ulong count, ulong offset); // Bind SSBO buffer
-void rlBindShaderBuffer(uint id, uint index); // Copy SSBO buffer data
-
-// Buffer management
-void rlCopyBuffersElements(uint destId, uint srcId, ulong destOffset, ulong srcOffset, ulong count); // Copy SSBO buffer data
-void rlBindImageTexture(uint id, uint index, uint format, int readonly); // Bind image texture
-
-// Matrix state management
-Matrix rlGetMatrixModelview(); // Get internal modelview matrix
-Matrix rlGetMatrixProjection(); // Get internal projection matrix
-Matrix rlGetMatrixTransform(); // Get internal accumulated transform matrix
-Matrix rlGetMatrixProjectionStereo(int eye); // Get internal projection matrix for stereo render (selected eye)
-Matrix rlGetMatrixViewOffsetStereo(int eye); // Get internal view offset matrix for stereo render (selected eye)
-void rlSetMatrixProjection(Matrix proj); // Set a custom projection matrix (replaces internal projection matrix)
-void rlSetMatrixModelview(Matrix view); // Set a custom modelview matrix (replaces internal modelview matrix)
-void rlSetMatrixProjectionStereo(Matrix right, Matrix left); // Set eyes projection matrices for stereo rendering
-void rlSetMatrixViewOffsetStereo(Matrix right, Matrix left); // Set eyes view offsets matrices for stereo rendering
-
-// Quick and dirty cube/quad buffers load->draw->unload
-void rlLoadDrawCube(); // Load and draw a cube
-void rlLoadDrawQuad(); // Load and draw a quad
-
-// RLGL_H
-
-/***********************************************************************************
-*
-*   RLGL IMPLEMENTATION
-*
-************************************************************************************/
-
-// OpenGL 1.1 library for OSX
-// OpenGL extensions library
-
-// APIENTRY for OpenGL function pointer declarations is required
-
-// WINGDIAPI definition. Some Windows OpenGL headers need it
-
-// OpenGL 1.1 library
-
-// OpenGL 3 library for OSX
-// OpenGL 3 extensions library for OSX
-
-// GLAD extensions loading library, includes OpenGL headers
-
-//#include <EGL/egl.h>              // EGL library -> not required, platform layer
-// OpenGL ES 2.0 library
-// OpenGL ES 2.0 extensions library
-
-// It seems OpenGL ES 2.0 instancing entry points are not defined on Raspberry Pi
-// provided headers (despite being defined in official Khronos GLES2 headers)
-
-// Required for: malloc(), free()
-// Required for: strcmp(), strlen() [Used in rlglInit(), on extensions loading]
-// Required for: sqrtf(), sinf(), cosf(), floor(), log()
-
-//----------------------------------------------------------------------------------
-// Defines and Macros
-//----------------------------------------------------------------------------------
-
-// Default shader vertex attribute names to set location points
-
-// Binded by default to shader location: 0
-
-// Binded by default to shader location: 1
-
-// Binded by default to shader location: 2
-
-// Binded by default to shader location: 3
-
-// Binded by default to shader location: 4
-
-// Binded by default to shader location: 5
-
-// model-view-projection matrix
-
-// view matrix
-
-// projection matrix
-
-// model matrix
-
-// normal matrix (transpose(inverse(matModelView))
-
-// color diffuse (base tint color, multiplied by texture color)
-
-// texture0 (texture slot active 0)
-
-// texture1 (texture slot active 1)
-
-// texture2 (texture slot active 2)
-
-//----------------------------------------------------------------------------------
-// Types and Structures Definition
-//----------------------------------------------------------------------------------
-
-// Current render batch
-// Default internal render batch
-
-// Current active render batch vertex counter (generic, used for all batches)
-// Current active texture coordinate (added on glVertex*())
-// Current active normal (added on glVertex*())
-// Current active color (added on glVertex*())
-
-// Current matrix mode
-// Current matrix pointer
-// Default modelview matrix
-// Default projection matrix
-// Transform matrix to be used with rlTranslate, rlRotate, rlScale
-// Require transform matrix application to current draw-call vertex (if required)
-// Matrix stack for push/pop
-// Matrix stack counter
-
-// Default texture used on shapes/poly drawing (required by shader)
-// Active texture ids to be enabled on batch drawing (0 active by default)
-// Default vertex shader id (used by default shader program)
-// Default fragment shader id (used by default shader program)
-// Default shader program id, supports vertex color and diffuse texture
-// Default shader locations pointer to be used on rendering
-// Current shader id to be used on rendering (by default, defaultShaderId)
-// Current shader locations pointer to be used on rendering (by default, defaultShaderLocs)
-
-// Stereo rendering flag
-// VR stereo rendering eyes projection matrices
-// VR stereo rendering eyes view offset matrices
-
-// Blending mode active
-// Blending source factor
-// Blending destination factor
-// Blending equation
-
-// Default framebuffer width
-// Default framebuffer height
-
-// Renderer state
-
-// VAO support (OpenGL ES2 could not support VAO extension) (GL_ARB_vertex_array_object)
-// Instancing supported (GL_ANGLE_instanced_arrays, GL_EXT_draw_instanced + GL_EXT_instanced_arrays)
-// NPOT textures full support (GL_ARB_texture_non_power_of_two, GL_OES_texture_npot)
-// Depth textures supported (GL_ARB_depth_texture, GL_WEBGL_depth_texture, GL_OES_depth_texture)
-// float textures support (32 bit per channel) (GL_OES_texture_float)
-// DDS texture compression support (GL_EXT_texture_compression_s3tc, GL_WEBGL_compressed_texture_s3tc, GL_WEBKIT_WEBGL_compressed_texture_s3tc)
-// ETC1 texture compression support (GL_OES_compressed_ETC1_RGB8_texture, GL_WEBGL_compressed_texture_etc1)
-// ETC2/EAC texture compression support (GL_ARB_ES3_compatibility)
-// PVR texture compression support (GL_IMG_texture_compression_pvrtc)
-// ASTC texture compression support (GL_KHR_texture_compression_astc_hdr, GL_KHR_texture_compression_astc_ldr)
-// Clamp mirror wrap mode supported (GL_EXT_texture_mirror_clamp)
-// Anisotropic texture filtering support (GL_EXT_texture_filter_anisotropic)
-// Compute shaders support (GL_ARB_compute_shader)
-// Shader storage buffer object support (GL_ARB_shader_storage_buffer_object)
-
-// Maximum anisotropy level supported (minimum is 2.0f)
-// Maximum bits for depth component
-
-// Extensions supported flags
-
-// OpenGL extension functions loader signature (same as GLADloadproc)
-
-// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
-
-//----------------------------------------------------------------------------------
-// Global Variables Definition
-//----------------------------------------------------------------------------------
-
-// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
-
-// NOTE: VAO functionality is exposed through extensions (OES)
-
-// NOTE: Instancing functionality could also be available through extension
-
-//----------------------------------------------------------------------------------
-// Module specific Functions Declaration
-//----------------------------------------------------------------------------------
-
-// Load default shader
-// Unload default shader
-
-// Get compressed format official GL identifier name
-// RLGL_SHOW_GL_DETAILS_INFO
-// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
-
-// Generate mipmaps data on CPU side
-// Generate next mipmap level on CPU side
-
-// Get pixel data size in bytes (image or texture)
-// Auxiliar matrix math functions
-// Get identity matrix
-// Multiply two matrices
-
-//----------------------------------------------------------------------------------
-// Module Functions Definition - Matrix operations
-//----------------------------------------------------------------------------------
-
-// Fallback to OpenGL 1.1 function calls
-//---------------------------------------
-
-// Choose the current matrix to be transformed
-
-//else if (mode == RL_TEXTURE) // Not supported
-
-// Push the current matrix into RLGL.State.stack
-
-// Pop lattest inserted matrix from RLGL.State.stack
-
-// Reset current matrix to identity matrix
-
-// Multiply the current matrix by a translation matrix
-
-// NOTE: We transpose matrix with multiplication order
-
-// Multiply the current matrix by a rotation matrix
-// NOTE: The provided angle must be in degrees
-
-// Axis vector (x, y, z) normalization
-
-// Rotation matrix generation
-
-// NOTE: We transpose matrix with multiplication order
-
-// Multiply the current matrix by a scaling matrix
-
-// NOTE: We transpose matrix with multiplication order
-
-// Multiply the current matrix by another matrix
-
-// Matrix creation from array
-
-// Multiply the current matrix by a perspective matrix generated by parameters
-
-// Multiply the current matrix by an orthographic matrix generated by parameters
-
-// NOTE: If left-right and top-botton values are equal it could create a division by zero,
-// response to it is platform/compiler dependant
-
-// Set the viewport area (transformation from normalized device coordinates to window coordinates)
-
-//----------------------------------------------------------------------------------
-// Module Functions Definition - Vertex level operations
-//----------------------------------------------------------------------------------
-
-// Fallback to OpenGL 1.1 function calls
-//---------------------------------------
-
-// Initialize drawing mode (how to organize vertex)
-
-// Draw mode can be RL_LINES, RL_TRIANGLES and RL_QUADS
-// NOTE: In all three cases, vertex are accumulated over default internal vertex buffer
-
-// Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4,
-// that way, following QUADS drawing will keep aligned with index processing
-// It implies adding some extra alignment vertex at the end of the draw,
-// those vertex are not processed but they are considered as an additional offset
-// for the next set of vertex to be drawn
-
-// Finish vertex providing
-
-// NOTE: Depth increment is dependant on rlOrtho(): z-near and z-far values,
-// as well as depth buffer bit-depth (16bit or 24bit or 32bit)
-// Correct increment formula would be: depthInc = (zfar - znear)/pow(2, bits)
-
-// Verify internal buffers limits
-// NOTE: This check is combined with usage of rlCheckRenderBatchLimit()
-
-// WARNING: If we are between rlPushMatrix() and rlPopMatrix() and we need to force a rlDrawRenderBatch(),
-// we need to call rlPopMatrix() before to recover *RLGL.State.currentMatrix (RLGL.State.modelview) for the next forced draw call!
-// If we have multiple matrix pushed, it will require "RLGL.State.stackCounter" pops before launching the draw
-
-// Define one vertex (position)
-// NOTE: Vertex position data is the basic information required for drawing
-
-// Transform provided vector if required
-
-// Verify that current vertex buffer elements limit has not been reached
-
-// Add vertices
-
-// Add current texcoord
-
-// TODO: Add current normal
-// By default rlVertexBuffer type does not store normals
-
-// Add current color
-
-// Define one vertex (position)
-
-// Define one vertex (position)
-
-// Define one vertex (texture coordinate)
-// NOTE: Texture coordinates are limited to QUADS only
-
-// Define one vertex (normal)
-// NOTE: Normals limited to TRIANGLES only?
-
-// Define one vertex (color)
-
-// Define one vertex (color)
-
-// Define one vertex (color)
-
-//--------------------------------------------------------------------------------------
-// Module Functions Definition - OpenGL style functions (common to 1.1, 3.3+, ES2)
-//--------------------------------------------------------------------------------------
-
-// Set current texture to use
-
-// NOTE: If quads batch limit is reached, we force a draw call and next batch starts
-
-// Make sure current RLGL.currentBatch->draws[i].vertexCount is aligned a multiple of 4,
-// that way, following QUADS drawing will keep aligned with index processing
-// It implies adding some extra alignment vertex at the end of the draw,
-// those vertex are not processed but they are considered as an additional offset
-// for the next set of vertex to be drawn
-
-// Select and active a texture slot
-
-// Enable texture
-
-// Disable texture
-
-// Enable texture cubemap
-
-// Disable texture cubemap
-
-// Set texture parameters (wrap mode/filter mode)
-
-// Enable shader program
-
-// Disable shader program
-
-// Enable rendering to texture (fbo)
-
-// Disable rendering to texture
-
-// Activate multiple draw color buffers
-// NOTE: One color buffer is always active by default
-
-// NOTE: Maximum number of draw buffers supported is implementation dependant,
-// it can be queried with glGet*() but it must be at least 8
-//GLint maxDrawBuffers = 0;
-//glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
-
-//----------------------------------------------------------------------------------
-// General render state configuration
-//----------------------------------------------------------------------------------
-
-// Enable color blending
-
-// Disable color blending
-
-// Enable depth test
-
-// Disable depth test
-
-// Enable depth write
-
-// Disable depth write
-
-// Enable backface culling
-
-// Disable backface culling
-
-// Enable scissor test
-
-// Disable scissor test
-
-// Scissor test
-
-// Enable wire mode
-
-// NOTE: glPolygonMode() not available on OpenGL ES
-
-// Disable wire mode
-
-// NOTE: glPolygonMode() not available on OpenGL ES
-
-// Set the line drawing width
-
-// Get the line drawing width
-
-// Enable line aliasing
-
-// Disable line aliasing
-
-// Enable stereo rendering
-
-// Disable stereo rendering
-
-// Check if stereo render is enabled
-
-// Clear color buffer with color
-
-// Color values clamp to 0.0f(0) and 1.0f(255)
-
-// Clear used screen buffers (color and depth)
-
-// Clear used buffers: Color and Depth (Depth is used for 3D)
-//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);     // Stencil buffer not used...
-
-// Check and log OpenGL error codes
-
-// Set blend mode
-
-// Set blending mode factor and equation
-
-//----------------------------------------------------------------------------------
-// Module Functions Definition - OpenGL Debug
-//----------------------------------------------------------------------------------
-
-// Ignore non-significant error/warning codes (NVidia drivers)
-// NOTE: Here there are the details with a sample output:
-// - #131169 - Framebuffer detailed info: The driver allocated storage for renderbuffer 2. (severity: low)
-// - #131185 - Buffer detailed info: Buffer object 1 (bound to GL_ELEMENT_ARRAY_BUFFER_ARB, usage hint is GL_ENUM_88e4)
-//             will use VIDEO memory as the source for buffer object operations. (severity: low)
-// - #131218 - Program/shader state performance warning: Vertex shader in program 7 is being recompiled based on GL state. (severity: medium)
-// - #131204 - Texture state usage warning: The texture object (0) bound to texture image unit 0 does not have
-//             a defined base level and cannot be used for texture mapping. (severity: low)
-
-//----------------------------------------------------------------------------------
-// Module Functions Definition - rlgl functionality
-//----------------------------------------------------------------------------------
-
-// Initialize rlgl: OpenGL extensions, default buffers/shaders/textures, OpenGL states
-
-// Enable OpenGL debug context if required
-
-// glDebugMessageControl(GL_DEBUG_SOURCE_API, GL_DEBUG_TYPE_ERROR, GL_DEBUG_SEVERITY_HIGH, 0, 0, GL_TRUE); // TODO: Filter message
-
-// Debug context options:
-//  - GL_DEBUG_OUTPUT - Faster version but not useful for breakpoints
-//  - GL_DEBUG_OUTPUT_SYNCHRONUS - Callback is in sync with errors, so a breakpoint can be placed on the callback in order to get a stacktrace for the GL error
-
-// Init default white texture
-// 1 pixel RGBA (4 bytes)
-
-// Init default Shader (customized for GL 3.3 and ES2)
-// Loaded: RLGL.State.defaultShaderId + RLGL.State.defaultShaderLocs
-
-// Init default vertex arrays buffers
-
-// Init stack matrices (emulating OpenGL 1.1)
-
-// Init internal matrices
-
-// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
-
-// Initialize OpenGL default states
-//----------------------------------------------------------
-// Init state: Depth test
-// Type of depth testing to apply
-// Disable depth testing for 2D (only used for 3D)
-
-// Init state: Blending mode
-// Color blending function (how colors are mixed)
-// Enable color blending (required to work with transparencies)
-
-// Init state: Culling
-// NOTE: All shapes/models triangles are drawn CCW
-// Cull the back face (default)
-// Front face are defined counter clockwise (default)
-// Enable backface culling
-
-// Init state: Cubemap seamless
-
-// Seamless cubemaps (not supported on OpenGL ES 2.0)
-
-// Init state: Color hints (deprecated in OpenGL 3.0+)
-// Improve quality of color and texture coordinate interpolation
-// Smooth shading between vertex (vertex colors interpolation)
-
-// Store screen size into global variables
-
-//----------------------------------------------------------
-
-// Init state: Color/Depth buffers clear
-// Set clear color (black)
-// Set clear depth value (default)
-// Clear color and depth buffers (depth buffer required for 3D)
-
-// Vertex Buffer Object deinitialization (memory free)
-
-// Unload default shader
-
-// Unload default texture
-
-// Load OpenGL extensions
-// NOTE: External loader function must be provided
-
-// Also defined for GRAPHICS_API_OPENGL_21
-// NOTE: glad is generated and contains only required OpenGL 3.3 Core extensions (and lower versions)
-
-// Get number of supported extensions
-
-// Get supported extensions list
-// WARNING: glGetStringi() not available on OpenGL 2.1
-
-// Register supported extensions flags
-// OpenGL 3.3 extensions supported by default (core)
-
-// NOTE: With GLAD, we can check if an extension is supported using the GLAD_GL_xxx booleans
-// Texture compression: DXT
-// Texture compression: ETC2/EAC
-
-// GRAPHICS_API_OPENGL_33
-
-// Get supported extensions list
-
-// Allocate 512 strings pointers (2 KB)
-// One big const string
-
-// NOTE: We have to duplicate string because glGetString() returns a const string
-// Get extensions string size in bytes
-
-// Check required extensions
-
-// Check VAO support
-// NOTE: Only check on OpenGL ES, OpenGL 3.3 has VAO support as core feature
-
-// The extension is supported by our hardware and driver, try to get related functions pointers
-// NOTE: emscripten does not support VAOs natively, it uses emulation and it reduces overall performance...
-
-//glIsVertexArray = (PFNGLISVERTEXARRAYOESPROC)loader("glIsVertexArrayOES");     // NOTE: Fails in WebGL, omitted
-
-// Check instanced rendering support
-// Web ANGLE
-
-// Standard EXT
-
-// Check NPOT textures support
-// NOTE: Only check on OpenGL ES, OpenGL 3.3 has NPOT textures full support as core feature
-
-// Check texture float support
-
-// Check depth texture support
-
-// Check texture compression support: DXT
-
-// Check texture compression support: ETC1
-
-// Check texture compression support: ETC2/EAC
-
-// Check texture compression support: PVR
-
-// Check texture compression support: ASTC
-
-// Check anisotropic texture filter support
-
-// Check clamp mirror wrap mode support
-
-// Free extensions pointers
-
-// Duplicated string must be deallocated
-// GRAPHICS_API_OPENGL_ES2
-
-// Check OpenGL information and capabilities
-//------------------------------------------------------------------------------
-// Show current OpenGL and GLSL version
-
-// NOTE: Anisotropy levels capability is an extension
-
-// Show some OpenGL GPU capabilities
-
-/*
-// Following capabilities are only supported by OpenGL 4.3 or greater
-glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &capability);
-TRACELOG(RL_LOG_INFO, "    GL_MAX_VERTEX_ATTRIB_BINDINGS: %i", capability);
-glGetIntegerv(GL_MAX_UNIFORM_LOCATIONS, &capability);
-TRACELOG(RL_LOG_INFO, "    GL_MAX_UNIFORM_LOCATIONS: %i", capability);
-*/
-// RLGL_SHOW_GL_DETAILS_INFO
-
-// Show some basic info about GL supported features
-
-// RLGL_SHOW_GL_DETAILS_INFO
-
-// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
-
-// Get current OpenGL version
-
-// NOTE: Force OpenGL 3.3 on OSX
-
-// Get default framebuffer width
-
-// Get default framebuffer height
-
-// Get default internal texture (white texture)
-// NOTE: Default texture is a 1x1 pixel UNCOMPRESSED_R8G8B8A8
-
-// Get default shader id
-
-// Get default shader locs
-
-// Render batch management
-//------------------------------------------------------------------------------------------------
-// Load render batch
-
-// Initialize CPU (RAM) vertex buffers (position, texcoord, color data and indexes)
-//--------------------------------------------------------------------------------------------
-
-// 3 float by vertex, 4 vertex by quad
-// 2 float by texcoord, 4 texcoord by quad
-// 4 float by color, 4 colors by quad
-
-// 6 int by quad (indices)
-
-// 6 int by quad (indices)
-
-// Indices can be initialized right now
-
-//--------------------------------------------------------------------------------------------
-
-// Upload to GPU (VRAM) vertex data and initialize VAOs/VBOs
-//--------------------------------------------------------------------------------------------
-
-// Initialize Quads VAO
-
-// Quads - Vertex buffers binding and attributes enable
-// Vertex position buffer (shader-location = 0)
-
-// Vertex texcoord buffer (shader-location = 1)
-
-// Vertex color buffer (shader-location = 3)
-
-// Fill index buffer
-
-// Unbind the current VAO
-
-//--------------------------------------------------------------------------------------------
-
-// Init draw calls tracking system
-//--------------------------------------------------------------------------------------------
-
-//batch.draws[i].vaoId = 0;
-//batch.draws[i].shaderId = 0;
-
-//batch.draws[i].RLGL.State.projection = rlMatrixIdentity();
-//batch.draws[i].RLGL.State.modelview = rlMatrixIdentity();
-
-// Record buffer count
-// Reset draws counter
-// Reset depth value
-//--------------------------------------------------------------------------------------------
-
-// Unload default internal buffers vertex data from CPU and GPU
-
-// Unbind everything
-
-// Unload all vertex buffers data
-
-// Unbind VAO attribs data
-
-// Delete VBOs from GPU (VRAM)
-
-// Delete VAOs from GPU (VRAM)
-
-// Free vertex arrays memory from CPU (RAM)
-
-// Unload arrays
-
-// Draw render batch
-// NOTE: We require a pointer to reset batch and increase current buffer (multi-buffer)
-
-// Update batch vertex buffers
-//------------------------------------------------------------------------------------------------------------
-// NOTE: If there is not vertex data, buffers doesn't need to be updated (vertexCount > 0)
-// TODO: If no data changed on the CPU arrays --> No need to re-update GPU arrays (change flag required)
-
-// Activate elements VAO
-
-// Vertex positions buffer
-
-//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].vertices, GL_DYNAMIC_DRAW);  // Update all buffer
-
-// Texture coordinates buffer
-
-//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].texcoords, GL_DYNAMIC_DRAW); // Update all buffer
-
-// Colors buffer
-
-//glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*4*batch->vertexBuffer[batch->currentBuffer].elementCount, batch->vertexBuffer[batch->currentBuffer].colors, GL_DYNAMIC_DRAW);    // Update all buffer
-
-// NOTE: glMapBuffer() causes sync issue.
-// If GPU is working with this buffer, glMapBuffer() will wait(stall) until GPU to finish its job.
-// To avoid waiting (idle), you can call first glBufferData() with NULL pointer before glMapBuffer().
-// If you do that, the previous data in PBO will be discarded and glMapBuffer() returns a new
-// allocated pointer immediately even if GPU is still working with the previous data.
-
-// Another option: map the buffer object into client's memory
-// Probably this code could be moved somewhere else...
-// batch->vertexBuffer[batch->currentBuffer].vertices = (float *)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
-// if (batch->vertexBuffer[batch->currentBuffer].vertices)
-// {
-// Update vertex data
-// }
-// glUnmapBuffer(GL_ARRAY_BUFFER);
-
-// Unbind the current VAO
-
-//------------------------------------------------------------------------------------------------------------
-
-// Draw batch vertex buffers (considering VR stereo if required)
-//------------------------------------------------------------------------------------------------------------
-
-// Setup current eye viewport (half screen width)
-
-// Set current eye view offset to modelview matrix
-
-// Set current eye projection matrix
-
-// Draw buffers
-
-// Set current shader and upload current MVP matrix
-
-// Create modelview-projection matrix and upload to shader
-
-// Bind vertex attrib: position (shader-location = 0)
-
-// Bind vertex attrib: texcoord (shader-location = 1)
-
-// Bind vertex attrib: color (shader-location = 3)
-
-// Setup some default shader values
-
-// Active default sampler2D: texture0
-
-// Activate additional sampler textures
-// Those additional textures will be common for all draw calls of the batch
-
-// Activate default sampler2D texture0 (one texture is always active for default batch shader)
-// NOTE: Batch system accumulates calls by texture0 changes, additional textures are enabled for all the draw calls
-
-// Bind current draw call texture, activated as GL_TEXTURE0 and binded to sampler2D texture0 by default
-
-// We need to define the number of indices to be processed: elementCount*6
-// NOTE: The final parameter tells the GPU the offset in bytes from the
-// start of the index buffer to the location of the first index to process
-
-// Unbind textures
-
-// Unbind VAO
-
-// Unbind shader program
-
-//------------------------------------------------------------------------------------------------------------
-
-// Reset batch buffers
-//------------------------------------------------------------------------------------------------------------
-// Reset vertex counter for next frame
-
-// Reset depth for next draw
-
-// Restore projection/modelview matrices
-
-// Reset RLGL.currentBatch->draws array
-
-// Reset active texture units for next batch
-
-// Reset draws counter to one draw for the batch
-
-//------------------------------------------------------------------------------------------------------------
-
-// Change to next buffer in the list (in case of multi-buffering)
-
-// Set the active render batch for rlgl
-
-// Update and draw internal render batch
-
-// NOTE: Stereo rendering is checked inside
-
-// Check internal buffer overflow for a given number of vertex
-// and force a rlRenderBatch draw call if required
-
-// NOTE: Stereo rendering is checked inside
-
-// Restore state of last batch so we can continue adding vertices
-
-// Textures data management
-//-----------------------------------------------------------------------------------------
-// Convert image data to OpenGL texture (returns OpenGL valid Id)
-
-// Free any old binding
-
-// Check texture format support by OpenGL 1.1 (compressed textures not supported)
-
-// GRAPHICS_API_OPENGL_11
-
-// Generate texture id
-
-// Mipmap data offset
-
-// Load the different mipmap levels
-
-// Security check for NPOT textures
-
-// Texture parameters configuration
-// NOTE: glTexParameteri does NOT affect texture uploading, just the way it's used
-
-// NOTE: OpenGL ES 2.0 with no GL_OES_texture_npot support (i.e. WebGL) has limited NPOT support, so CLAMP_TO_EDGE must be used
-
-// Set texture to repeat on x-axis
-// Set texture to repeat on y-axis
-
-// NOTE: If using negative texture coordinates (LoadOBJ()), it does not work!
-// Set texture to clamp on x-axis
-// Set texture to clamp on y-axis
-
-// Set texture to repeat on x-axis
-// Set texture to repeat on y-axis
-
-// Magnification and minification filters
-// Alternative: GL_LINEAR
-// Alternative: GL_LINEAR
-
-// Activate Trilinear filtering if mipmaps are available
-
-// At this point we have the texture loaded in GPU and texture parameters configured
-
-// NOTE: If mipmaps were not in data, they are not generated automatically
-
-// Unbind current texture
-
-// Load depth texture/renderbuffer (to be attached to fbo)
-// WARNING: OpenGL ES 2.0 requires GL_OES_depth_texture/WEBGL_depth_texture extensions
-
-// In case depth textures not supported, we force renderbuffer usage
-
-// NOTE: We let the implementation to choose the best bit-depth
-// Possible formats: GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32 and GL_DEPTH_COMPONENT32F
-
-// Create the renderbuffer that will serve as the depth attachment for the framebuffer
-// NOTE: A renderbuffer is simpler than a texture and could offer better performance on embedded devices
-
-// Load texture cubemap
-// NOTE: Cubemap data is expected to be 6 images in a single data array (one after the other),
-// expected the following convention: +X, -X, +Y, -Y, +Z, -Z
-
-// Load cubemap faces
-
-// Instead of using a sized internal texture format (GL_RGB16F, GL_RGB32F), we let the driver to choose the better format for us (GL_RGB)
-
-// Set cubemap texture sampling parameters
-
-// Flag not supported on OpenGL ES 2.0
-
-// Update already loaded texture in GPU with new data
-// NOTE: We don't know safely if internal texture format is the expected one...
-
-// Get OpenGL internal formats and data type from raylib PixelFormat
-
-// NOTE: on OpenGL ES 2.0 (WebGL), internalFormat must match format and options allowed are: GL_LUMINANCE, GL_RGB, GL_RGBA
-
-// NOTE: Requires extension OES_texture_float
-// NOTE: Requires extension OES_texture_float
-// NOTE: Requires extension OES_texture_float
-
-// NOTE: Requires OpenGL ES 2.0 or OpenGL 4.3
-// NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3
-// NOTE: Requires OpenGL ES 3.0 or OpenGL 4.3
-// NOTE: Requires PowerVR GPU
-// NOTE: Requires PowerVR GPU
-// NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3
-// NOTE: Requires OpenGL ES 3.1 or OpenGL 4.3
-
-// Unload texture from GPU memory
-
-// Generate mipmap data for selected texture
-
-// Check if texture is power-of-two (POT)
-
-// WARNING: Manual mipmap generation only works for RGBA 32bit textures!
-
-// Retrieve texture data from VRAM
-
-// NOTE: Texture data size is reallocated to fit mipmaps data
-// NOTE: CPU mipmap generation only supports RGBA 32bit data
-
-// Load the mipmaps
-
-// Once mipmaps have been generated and data has been uploaded to GPU VRAM, we can discard RAM data
-
-//glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);   // Hint for mipmaps generation algorythm: GL_FASTEST, GL_NICEST, GL_DONT_CARE
-// Generate mipmaps automatically
-
-// Activate Trilinear filtering for mipmaps
-
-// Read texture pixel data
-
-// NOTE: Using texture id, we can retrieve some texture info (but not on OpenGL ES 2.0)
-// Possible texture info: GL_TEXTURE_RED_SIZE, GL_TEXTURE_GREEN_SIZE, GL_TEXTURE_BLUE_SIZE, GL_TEXTURE_ALPHA_SIZE
-//int width, height, format;
-//glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
-//glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
-//glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &format);
-
-// NOTE: Each row written to or read from by OpenGL pixel operations like glGetTexImage are aligned to a 4 byte boundary by default, which may add some padding.
-// Use glPixelStorei to modify padding with the GL_[UN]PACK_ALIGNMENT setting.
-// GL_PACK_ALIGNMENT affects operations that read from OpenGL memory (glReadPixels, glGetTexImage, etc.)
-// GL_UNPACK_ALIGNMENT affects operations that write to OpenGL memory (glTexImage, etc.)
-
-// glGetTexImage() is not available on OpenGL ES 2.0
-// Texture width and height are required on OpenGL ES 2.0. There is no way to get it from texture id.
-// Two possible Options:
-// 1 - Bind texture to color fbo attachment and glReadPixels()
-// 2 - Create an fbo, activate it, render quad with texture, glReadPixels()
-// We are using Option 1, just need to care for texture format on retrieval
-// NOTE: This behaviour could be conditioned by graphic driver...
-
-// Attach our texture to FBO
-
-// We read data as RGBA because FBO texture is configured as RGBA, despite binding another texture format
-
-// Clean up temporal fbo
-
-// Read screen pixel data (color buffer)
-
-// NOTE 1: glReadPixels returns image flipped vertically -> (0,0) is the bottom left corner of the framebuffer
-// NOTE 2: We are getting alpha channel! Be careful, it can be transparent if not cleared properly!
-
-// Flip image vertically!
-
-// Flip line
-
-// Set alpha component value to 255 (no trasparent image retrieval)
-// NOTE: Alpha value has already been applied to RGB in framebuffer, we don't need it!
-
-// NOTE: image data should be freed
-
-// Framebuffer management (fbo)
-//-----------------------------------------------------------------------------------------
-// Load a framebuffer to be used for rendering
-// NOTE: No textures attached
-
-// Create the framebuffer object
-// Unbind any framebuffer
-
-// Attach color buffer texture to an fbo (unloads previous attachment)
-// NOTE: Attach type: 0-Color, 1-Depth renderbuffer, 2-Depth texture
-
-// Verify render texture is complete
-
-// Unload framebuffer from GPU memory
-// NOTE: All attached textures/cubemaps/renderbuffers are also deleted
-
-// Query depth attachment to automatically delete texture/renderbuffer
-
-// Bind framebuffer to query depth texture type
-
-// NOTE: If a texture object is deleted while its image is attached to the *currently bound* framebuffer,
-// the texture image is automatically detached from the currently bound framebuffer.
-
-// Vertex data management
-//-----------------------------------------------------------------------------------------
-// Load a new attributes buffer
-
-// Load a new attributes element buffer
-
-// Enable vertex buffer (VBO)
-
-// Disable vertex buffer (VBO)
-
-// Enable vertex buffer element (VBO element)
-
-// Disable vertex buffer element (VBO element)
-
-// Update vertex buffer with new data
-// NOTE: dataSize and offset must be provided in bytes
-
-// Update vertex buffer elements with new data
-// NOTE: dataSize and offset must be provided in bytes
-
-// Enable vertex array object (VAO)
-
-// Disable vertex array object (VAO)
-
-// Enable vertex attribute index
-
-// Disable vertex attribute index
-
-// Draw vertex array
-
-// Draw vertex array elements
-
-// Draw vertex array instanced
-
-// Draw vertex array elements instanced
-
-// Enable vertex state pointer
-
-//case GL_INDEX_ARRAY: if (buffer != NULL) glIndexPointer(GL_SHORT, 0, buffer); break; // Indexed colors
-
-// Disable vertex state pointer
-
-// Load vertex array object (VAO)
-
-// Set vertex attribute
-
-// Set vertex attribute divisor
-
-// Unload vertex array object (VAO)
-
-// Unload vertex buffer (VBO)
-
-//TRACELOG(RL_LOG_INFO, "VBO: Unloaded vertex data from VRAM (GPU)");
-
-// Shaders management
-//-----------------------------------------------------------------------------------------------
-// Load shader from code strings
-// NOTE: If shader string is NULL, using default vertex/fragment shaders
-
-// Detach shader before deletion to make sure memory is freed
-
-// Detach shader before deletion to make sure memory is freed
-
-// Get available shader uniforms
-// NOTE: This information is useful for debug...
-
-// Assume no variable names longer than 256
-
-// Get the name of the uniforms
-
-// Compile custom shader and return shader id
-
-//case GL_GEOMETRY_SHADER:
-
-//case GL_GEOMETRY_SHADER:
-
-// Load custom shader strings and return program id
-
-// NOTE: Default attribute shader locations must be binded before linking
-
-// NOTE: If some attrib name is no found on the shader, it locations becomes -1
-
-// NOTE: All uniform variables are intitialised to 0 when a program links
-
-// Get the size of compiled shader program (not available on OpenGL ES 2.0)
-// NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero.
-//GLint binarySize = 0;
-//glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize);
-
-// Unload shader program
-
-// Get shader location uniform
-
-// Get shader location attribute
-
-// Set shader value uniform
-
-// Set shader value attribute
-
-// Set shader value uniform matrix
-
-// Set shader value uniform sampler
-
-// Check if texture is already active
-
-// Register a new active texture for the internal batch system
-// NOTE: Default texture is always activated as GL_TEXTURE0
-
-// Activate new texture unit
-// Save texture id for binding on drawing
-
-// Set shader currently active (id and locations)
-
-// Load compute shader program
-
-// NOTE: All uniform variables are intitialised to 0 when a program links
-
-// Get the size of compiled shader program (not available on OpenGL ES 2.0)
-// NOTE: If GL_LINK_STATUS is GL_FALSE, program binary length is zero.
-//GLint binarySize = 0;
-//glGetProgramiv(id, GL_PROGRAM_BINARY_LENGTH, &binarySize);
-
-// Dispatch compute shader (equivalent to *draw* for graphics pilepine)
-
-// Load shader storage buffer object (SSBO)
-
-// Unload shader storage buffer object (SSBO)
-
-// Update SSBO buffer data
-
-// Get SSBO buffer size
-
-// Read SSBO buffer data
-
-// Bind SSBO buffer
-
-// Copy SSBO buffer data
-
-// Bind image texture
-
-// Matrix state management
-//-----------------------------------------------------------------------------------------
-// Get internal modelview matrix
-
-// Get internal projection matrix
-
-// Get internal accumulated transform matrix
-
-// TODO: Consider possible transform matrices in the RLGL.State.stack
-// Is this the right order? or should we start with the first stored matrix instead of the last one?
-//Matrix matStackTransform = rlMatrixIdentity();
-//for (int i = RLGL.State.stackCounter; i > 0; i--) matStackTransform = rlMatrixMultiply(RLGL.State.stack[i], matStackTransform);
-
-// Get internal projection matrix for stereo render (selected eye)
-
-// Get internal view offset matrix for stereo render (selected eye)
-
-// Set a custom modelview matrix (replaces internal modelview matrix)
-
-// Set a custom projection matrix (replaces internal projection matrix)
-
-// Set eyes projection matrices for stereo rendering
-
-// Set eyes view offsets matrices for stereo rendering
-
-// Load and draw a quad in NDC
-
-// Positions         Texcoords
-
-// Gen VAO to contain VBO
-
-// Gen and fill vertex buffer (VBO)
-
-// Bind vertex attributes (position, texcoords)
-
-// Positions
-
-// Texcoords
-
-// Draw quad
-
-// Delete buffers (VBO and VAO)
-
-// Load and draw a cube in NDC
-
-// Positions          Normals               Texcoords
-
-// Gen VAO to contain VBO
-
-// Gen and fill vertex buffer (VBO)
-
-// Bind vertex attributes (position, normals, texcoords)
-
-// Positions
-
-// Normals
-
-// Texcoords
-
-// Draw cube
-
-// Delete VBO and VAO
-
-// Get name string for pixel format
-
-// 8 bit per pixel (no alpha)
-// 8*2 bpp (2 channels)
-// 16 bpp
-// 24 bpp
-// 16 bpp (1 bit alpha)
-// 16 bpp (4 bit alpha)
-// 32 bpp
-// 32 bpp (1 channel - float)
-// 32*3 bpp (3 channels - float)
-// 32*4 bpp (4 channels - float)
-// 4 bpp (no alpha)
-// 4 bpp (1 bit alpha)
-// 8 bpp
-// 8 bpp
-// 4 bpp
-// 4 bpp
-// 8 bpp
-// 4 bpp
-// 4 bpp
-// 8 bpp
-// 2 bpp
-
-//----------------------------------------------------------------------------------
-// Module specific Functions Definition
-//----------------------------------------------------------------------------------
-
-// Load default shader (just vertex positioning and texture coloring)
-// NOTE: This shader program is used for internal buffers
-// NOTE: Loaded: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs
-
-// NOTE: All locations must be reseted to -1 (no location)
-
-// Vertex shader directly defined, no external file required
-
-// Fragment shader directly defined, no external file required
-
-// Precision required for OpenGL ES2 (WebGL)
-
-// NOTE: Compiled vertex/fragment shaders are kept for re-use
-// Compile default vertex shader
-// Compile default fragment shader
-
-// Set default shader locations: attributes locations
-
-// Set default shader locations: uniform locations
-
-// Unload default shader
-// NOTE: Unloads: RLGL.State.defaultShaderId, RLGL.State.defaultShaderLocs
-
-// Get compressed format official GL identifier name
-
-// GL_EXT_texture_compression_s3tc
-
-// GL_3DFX_texture_compression_FXT1
-
-// GL_IMG_texture_compression_pvrtc
-
-// GL_OES_compressed_ETC1_RGB8_texture
-
-// GL_ARB_texture_compression_rgtc
-
-// GL_ARB_texture_compression_bptc
-
-// GL_ARB_ES3_compatibility
-
-// GL_KHR_texture_compression_astc_hdr
-
-// RLGL_SHOW_GL_DETAILS_INFO
-
-// GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
-
-// Mipmaps data is generated after image data
-// NOTE: Only works with RGBA (4 bytes) data!
-
-// Required mipmap levels count (including base level)
-
-// Size in bytes (will include mipmaps...), RGBA only
-
-// Count mipmap levels required
-
-// Add mipmap size (in bytes)
-
-// RGBA: 4 bytes
-
-// Generate mipmaps
-// NOTE: Every mipmap data is stored after data (RGBA - 4 bytes)
-
-// Size of last mipmap
-
-// Mipmap size to store after offset
-
-// Add mipmap to data
-
-// free mipmap data
-
-// Manual mipmap generation (basic scaling algorithm)
-
-// Scaling algorithm works perfectly (box-filter)
-
-// GRAPHICS_API_OPENGL_11
-
-// Get pixel data size in bytes (image or texture)
-// NOTE: Size depends on pixel format
-
-// Size in bytes
-// Bits per pixel
-
-// Total data size in bytes
-
-// Most compressed formats works on 4x4 blocks,
-// if texture is smaller, minimum dataSize is 8 or 16
-
-// Auxiliar math functions
-
-// Get identity matrix
-
-// Get two matrix multiplication
-// NOTE: When multiplying matrices... the order matters!
-
-// RLGL_IMPLEMENTATION
+public import raylib.rlgl;