瀏覽代碼

Updated Lua binding

raysan5 9 年之前
父節點
當前提交
80789e6140
共有 1 個文件被更改,包括 574 次插入118 次删除
  1. 574 118
      src/rlua.h

+ 574 - 118
src/rlua.h

@@ -15,7 +15,7 @@
 *       local x2 = rec.x + rec.width
 *
 *   The following types:
-*       Image, Texture2D, SpriteFont
+*       Image, Texture2D, RenderTexture2D, SpriteFont
 *   are immutable, and you can only read their non-pointer arguments (e.g. sprfnt.size).
 *
 *   All other object types are opaque, that is, you cannot access or
@@ -126,9 +126,11 @@ RLUADEF void CloseLuaDevice(void);                  // De-initialize Lua system
 #define LuaPush_SpriteFont(L, sf) LuaPushOpaqueTypeWithMetatable(L, sf, SpriteFont)
 #define LuaPush_Mesh(L, vd) LuaPushOpaqueType(L, vd)
 #define LuaPush_Shader(L, s) LuaPushOpaqueType(L, s)
+#define LuaPush_Light(L, light) LuaPushOpaqueType(L, light)
 #define LuaPush_Sound(L, snd) LuaPushOpaqueType(L, snd)
 #define LuaPush_Wave(L, wav) LuaPushOpaqueType(L, wav)
 #define LuaPush_Music(L, mus) LuaPushOpaqueType(L, mus)
+#define LuaPush_AudioStream(L, aud) LuaPushOpaqueType(L, aud)
 
 #define LuaGetArgument_string luaL_checkstring
 #define LuaGetArgument_int (int)luaL_checkinteger
@@ -142,9 +144,11 @@ RLUADEF void CloseLuaDevice(void);                  // De-initialize Lua system
 #define LuaGetArgument_SpriteFont(L, sf) *(SpriteFont*)LuaGetArgumentOpaqueTypeWithMetatable(L, sf, "SpriteFont")
 #define LuaGetArgument_Mesh(L, vd) *(Mesh*)LuaGetArgumentOpaqueType(L, vd)
 #define LuaGetArgument_Shader(L, s) *(Shader*)LuaGetArgumentOpaqueType(L, s)
+#define LuaGetArgument_Light(L, light) *(Light*)LuaGetArgumentOpaqueType(L, light)
 #define LuaGetArgument_Sound(L, snd) *(Sound*)LuaGetArgumentOpaqueType(L, snd)
 #define LuaGetArgument_Wave(L, wav) *(Wave*)LuaGetArgumentOpaqueType(L, wav)
 #define LuaGetArgument_Music(L, mus) *(Music*)LuaGetArgumentOpaqueType(L, mus)
+#define LuaGetArgument_AudioStream(L, aud) *(AudioStream*)LuaGetArgumentOpaqueType(L, aud)
 
 #define LuaPushOpaqueType(L, str) LuaPushOpaque(L, &str, sizeof(str))
 #define LuaPushOpaqueTypeWithMetatable(L, str, meta) LuaPushOpaqueWithMetatable(L, &str, sizeof(str), #meta)
@@ -263,7 +267,18 @@ static int LuaIndexTexture2D(lua_State* L)
 	return 1;
 }
 
-// TODO: Build opaque metatable for RenderTexture2D?
+static int LuaIndexRenderTexture2D(lua_State* L)
+{
+	RenderTexture2D img = LuaGetArgument_RenderTexture2D(L, 1);
+	const char *key = luaL_checkstring(L, 2);
+	if (!strcmp(key, "texture"))
+		LuaPush_Texture2D(L, img.texture);
+	else if (!strcmp(key, "depth"))
+		LuaPush_Texture2D(L, img.depth);
+	else
+		return 0;
+	return 1;
+}
 
 static int LuaIndexSpriteFont(lua_State* L)
 {
@@ -292,13 +307,11 @@ static void LuaBuildOpaqueMetatables(void)
 	lua_setfield(L, -2, "__index");
 	lua_pop(L, 1);
     
-    // TODO: Build opaque metatable for RenderTexture2D?
-    /*
     luaL_newmetatable(L, "RenderTexture2D");
 	lua_pushcfunction(L, &LuaIndexRenderTexture2D);
 	lua_setfield(L, -2, "__index");
 	lua_pop(L, 1);
-    */
+
 	luaL_newmetatable(L, "SpriteFont");
 	lua_pushcfunction(L, &LuaIndexSpriteFont);
 	lua_setfield(L, -2, "__index");
@@ -403,10 +416,6 @@ static Camera2D LuaGetArgument_Camera2D(lua_State* L, int index)
 	return result;
 }
 
-// TODO: LightData, *Light
-// TODO: MusicData *Music;
-// TODO: AudioStream
-
 static BoundingBox LuaGetArgument_BoundingBox(lua_State* L, int index)
 {
 	BoundingBox result;
@@ -649,6 +658,23 @@ static int lua_Vector3(lua_State* L)
 	return 1;
 }
 
+static int lua_Quaternion(lua_State* L)
+{
+	LuaPush_Quaternion(L, (Quaternion) { (float)luaL_checknumber(L, 1), (float)luaL_checknumber(L, 2), (float)luaL_checknumber(L, 3), (float)luaL_checknumber(L, 4) });
+	return 1;
+}
+
+/*
+static int lua_Matrix(lua_State* L)
+{
+	LuaPush_Matrix(L, (Matrix) { (float)luaL_checknumber(L, 1), (float)luaL_checknumber(L, 2), (float)luaL_checknumber(L, 3), (float)luaL_checknumber(L, 4),
+                                 (float)luaL_checknumber(L, 5), (float)luaL_checknumber(L, 6), (float)luaL_checknumber(L, 7), (float)luaL_checknumber(L, 8),
+                                 (float)luaL_checknumber(L, 9), (float)luaL_checknumber(L, 10), (float)luaL_checknumber(L, 11), (float)luaL_checknumber(L, 12),
+                                 (float)luaL_checknumber(L, 13), (float)luaL_checknumber(L, 14), (float)luaL_checknumber(L, 15), (float)luaL_checknumber(L, 16) });
+	return 1;
+}
+*/
+
 static int lua_Rectangle(lua_State* L)
 {
 	LuaPush_Rectangle(L, (Rectangle) { (int)luaL_checkinteger(L, 1), (int)luaL_checkinteger(L, 2), (int)luaL_checkinteger(L, 3), (int)luaL_checkinteger(L, 4) });
@@ -663,6 +689,14 @@ static int lua_Ray(lua_State* L)
 	return 1;
 }
 
+static int lua_BoundingBox(lua_State* L)
+{
+	Vector3 min = LuaGetArgument_Vector3(L, 1);
+	Vector3 max = LuaGetArgument_Vector3(L, 2);
+	LuaPush_BoundingBox(L, (BoundingBox) { { min.x, min.y }, { max.x, max.y } });
+	return 1;
+}
+
 static int lua_Camera(lua_State* L)
 {
 	Vector3 pos = LuaGetArgument_Vector3(L, 1);
@@ -683,6 +717,22 @@ static int lua_Camera2D(lua_State* L)
 	return 1;
 }
 
+/*
+// NOTE: does it make sense to have this constructor? Probably not...
+static int lua_Material(lua_State* L)
+{
+	Shader sdr = LuaGetArgument_Shader(L, 1);
+	Texture2D td = LuaGetArgument_Texture2D(L, 2);
+	Texture2D tn = LuaGetArgument_Texture2D(L, 3);
+	Texture2D ts = LuaGetArgument_Texture2D(L, 4);
+	Color cd = LuaGetArgument_Color(L, 5);
+	Color ca = LuaGetArgument_Color(L, 6);
+	Color cs = LuaGetArgument_Color(L, 7);
+    float gloss = LuaGetArgument_float(L, 8);
+	LuaPush_Material(L, (Material) { sdr, td, tn, ts cd, ca, cs, gloss });
+	return 1;
+}
+*/
 
 /*************************************************************************************
 *  raylib Lua Functions Bindings
@@ -914,12 +964,47 @@ int lua_GetHexValue(lua_State* L)
 	return 1;
 }
 
-// TODO:
-/*
-float *ColorToFloat(Color color);                           // Converts Color to float array and normalizes
-float *VectorToFloat(Vector3 vec);                          // Converts Vector3 to float array
-float *MatrixToFloat(Matrix mat);                           // Converts Matrix to float array
-*/
+int lua_ColorToFloat(lua_State* L)
+{
+	Color arg1 = LuaGetArgument_Color(L, 1);
+	float * result = ColorToFloat(arg1);
+	lua_createtable(L, 4, 0);
+	for (int i = 0; i < 4; i++)
+	{
+		lua_pushnumber(L, result[i]);
+		lua_rawseti(L, -2, i + 1);
+	}
+	free(result);
+	return 1;
+}
+
+int lua_VectorToFloat(lua_State* L)
+{
+	Vector3 arg1 = LuaGetArgument_Vector3(L, 1);
+	float * result = VectorToFloat(arg1);
+	lua_createtable(L, 3, 0);
+	for (int i = 0; i < 3; i++)
+	{
+		lua_pushnumber(L, result[i]);
+		lua_rawseti(L, -2, i + 1);
+	}
+	free(result);
+	return 1;
+}
+
+int lua_MatrixToFloat(lua_State* L)
+{
+	Matrix arg1 = LuaGetArgument_Matrix(L, 1);
+	float * result = MatrixToFloat(arg1);
+	lua_createtable(L, 16, 0);
+	for (int i = 0; i < 16; i++)
+	{
+		lua_pushnumber(L, result[i]);
+		lua_rawseti(L, -2, i + 1);
+	}
+	free(result);
+	return 1;
+}
 
 int lua_GetRandomValue(lua_State* L)
 {
@@ -1227,8 +1312,6 @@ int lua_IsGestureDetected(lua_State* L)
 	return 1;
 }
 
-// TODO: void ProcessGestureEvent(GestureEvent event);
-
 int lua_UpdateGestures(lua_State* L)
 {
 	UpdateGestures();
@@ -1704,7 +1787,7 @@ int lua_LoadTexture(lua_State* L)
 
 int lua_LoadTextureEx(lua_State* L)
 {
-	void * arg1 = LuaGetArgument_string(L, 1);  // NOTE: getting argument as string
+	void * arg1 = (char *)LuaGetArgument_string(L, 1);  // NOTE: getting argument as string
     int arg2 = LuaGetArgument_int(L, 2);
 	int arg3 = LuaGetArgument_int(L, 3);
 	int arg4 = LuaGetArgument_int(L, 4);
@@ -1800,26 +1883,172 @@ int lua_ImageFormat(lua_State* L)
 	return 1;
 }
 
-// TODO:
-/*
-void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp);                            // Dither image data to 16bpp or lower (Floyd-Steinberg dithering)
-Image ImageCopy(Image image);                                                                      // Create an image duplicate (useful for transformations)
-void ImageCrop(Image *image, Rectangle crop);                                                      // Crop an image to a defined rectangle
-void ImageResize(Image *image, int newWidth, int newHeight);                                       // Resize and image (bilinear filtering)
-void ImageResizeNN(Image *image,int newWidth,int newHeight);                                       // Resize and image (Nearest-Neighbor scaling algorithm)
-Image ImageText(const char *text, int fontSize, Color color);                                      // Create an image from text (default font)
-Image ImageTextEx(SpriteFont font, const char *text, int fontSize, int spacing, Color tint);       // Create an image from text (custom sprite font)
-void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec);                         // Draw a source image within a destination image
-void ImageDrawText(Image *dst, Vector2 position, const char *text, int fontSize, Color color);     // Draw text (default font) within an image (destination)
-void ImageDrawTextEx(Image *dst, Vector2 position, SpriteFont font, const char *text, int fontSize, int spacing, Color color); // Draw text (custom sprite font) within an image (destination)
-void ImageFlipVertical(Image *image);                                                              // Flip image vertically
-void ImageFlipHorizontal(Image *image);                                                            // Flip image horizontally
-void ImageColorTint(Image *image, Color color);                                                    // Modify image color: tint
-void ImageColorInvert(Image *image);                                                               // Modify image color: invert
-void ImageColorGrayscale(Image *image);                                                            // Modify image color: grayscale
-void ImageColorContrast(Image *image, float contrast);                                             // Modify image color: contrast (-100 to 100)
-void ImageColorBrightness(Image *image, int brightness);                                           // Modify image color: brightness (-255 to 255)
-*/
+int lua_ImageDither(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+    int arg2 = LuaGetArgument_int(L, 2);
+    int arg3 = LuaGetArgument_int(L, 3);
+    int arg4 = LuaGetArgument_int(L, 4);
+    int arg5 = LuaGetArgument_int(L, 5);
+	ImageDither(&arg1, arg2, arg3, arg4, arg5);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageCopy(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	Image result = ImageCopy(arg1);
+	LuaPush_Image(L, result);
+	return 1;
+}
+
+int lua_ImageCrop(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	Rectangle arg2 = LuaGetArgument_Rectangle(L, 2);
+	ImageCrop(&arg1, arg2);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageResize(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	int arg2 = LuaGetArgument_int(L, 2);
+	int arg3 = LuaGetArgument_int(L, 3);
+	ImageResize(&arg1, arg2, arg3);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageResizeNN(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	int arg2 = LuaGetArgument_int(L, 2);
+	int arg3 = LuaGetArgument_int(L, 3);
+	ImageResizeNN(&arg1, arg2, arg3);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageText(lua_State* L)
+{
+	const char * arg1 = LuaGetArgument_string(L, 1);
+	int arg2 = LuaGetArgument_int(L, 2);
+	Color arg3 = LuaGetArgument_Color(L, 3);
+	Image result = ImageText(arg1, arg2, arg3);
+	LuaPush_Image(L, result);
+	return 1;
+}
+
+int lua_ImageTextEx(lua_State* L)
+{
+    SpriteFont arg1 = LuaGetArgument_SpriteFont(L, 1);
+	const char * arg2 = LuaGetArgument_string(L, 2);
+	int arg3 = LuaGetArgument_int(L, 3);
+	int arg4 = LuaGetArgument_int(L, 4);
+	Color arg5 = LuaGetArgument_Color(L, 5);
+	Image result = ImageTextEx(arg1, arg2, arg3, arg4, arg5);
+	LuaPush_Image(L, result);
+	return 1;
+}
+
+int lua_ImageDraw(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	Image arg2 = LuaGetArgument_Image(L, 2);
+	Rectangle arg3 = LuaGetArgument_Rectangle(L, 3);
+	Rectangle arg4 = LuaGetArgument_Rectangle(L, 4);
+	ImageDraw(&arg1, arg2, arg3, arg4);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageDrawText(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	Vector2 arg2 = LuaGetArgument_Vector2(L, 2);
+	const char * arg3 = LuaGetArgument_string(L, 3);
+	int arg4 = LuaGetArgument_int(L, 4);
+	Color arg5 = LuaGetArgument_Color(L, 5);
+	ImageDrawText(&arg1, arg2, arg3, arg4, arg5);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageDrawTextEx(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	Vector2 arg2 = LuaGetArgument_Vector2(L, 2);
+	SpriteFont arg3 = LuaGetArgument_SpriteFont(L, 3);
+	const char * arg4 = LuaGetArgument_string(L, 4);
+	int arg5 = LuaGetArgument_int(L, 5);
+    int arg6 = LuaGetArgument_int(L, 6);
+	Color arg7 = LuaGetArgument_Color(L, 7);
+	ImageDrawTextEx(&arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageFlipVertical(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	ImageFlipVertical(&arg1);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageFlipHorizontal(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	ImageFlipHorizontal(&arg1);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageColorTint(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	Color arg2 = LuaGetArgument_Color(L, 2);
+	ImageColorTint(&arg1, arg2);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageColorInvert(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	ImageColorInvert(&arg1);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageColorGrayscale(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	ImageColorGrayscale(&arg1);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageColorContrast(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	float arg2 = LuaGetArgument_float(L, 2);
+	ImageColorContrast(&arg1, arg2);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
+
+int lua_ImageColorBrightness(lua_State* L)
+{
+	Image arg1 = LuaGetArgument_Image(L, 1);
+	int arg2 = LuaGetArgument_int(L, 2);
+	ImageColorBrightness(&arg1, arg2);
+	LuaPush_Image(L, arg1);
+	return 1;
+}
 
 int lua_GenTextureMipmaps(lua_State* L)
 {
@@ -1831,7 +2060,7 @@ int lua_GenTextureMipmaps(lua_State* L)
 int lua_UpdateTexture(lua_State* L)
 {
 	Texture2D arg1 = LuaGetArgument_Texture2D(L, 1);
-    void * arg2 = LuaGetArgument_string(L, 2);          // NOTE: Getting (void *) as string
+    void * arg2 = (char *)LuaGetArgument_string(L, 2);  // NOTE: Getting (void *) as string?
 	UpdateTexture(arg1, arg2);
 	return 0;
 }
@@ -2097,12 +2326,27 @@ int lua_DrawGizmo(lua_State* L)
 	return 0;
 }
 
-// TODO:
-/*
-void DrawLight(Light light);                                                                       // Draw light in 3D world
-void Draw3DLine(Vector3 startPos, Vector3 endPos, Color color);                                    // Draw a line in 3D world space
-void Draw3DCircle(Vector3 center, float radius, float rotationAngle, Vector3 rotation, Color color);    // Draw a circle in 3D world space
-*/
+// TODO: DrawLight(Light light);
+
+int lua_Draw3DLine(lua_State* L)
+{
+	Vector3 arg1 = LuaGetArgument_Vector3(L, 1);
+	Vector3 arg2 = LuaGetArgument_Vector3(L, 2);
+	Color arg3 = LuaGetArgument_Color(L, 3);
+	Draw3DLine(arg1, arg2, arg3);
+	return 0;
+}
+
+int lua_Draw3DCircle(lua_State* L)
+{
+	Vector3 arg1 = LuaGetArgument_Vector3(L, 1);
+    float arg2 = LuaGetArgument_float(L, 2);
+    float arg3 = LuaGetArgument_float(L, 3);
+	Vector3 arg4 = LuaGetArgument_Vector3(L, 4);
+	Color arg5 = LuaGetArgument_Color(L, 5);
+	Draw3DCircle(arg1, arg2, arg3, arg4, arg5);
+	return 0;
+}
 
 //------------------------------------------------------------------------------------
 // raylib [models] module functions
@@ -2287,19 +2531,42 @@ int lua_CheckCollisionBoxSphere(lua_State* L)
 {
 	BoundingBox arg1 = LuaGetArgument_BoundingBox(L, 1);
 	Vector3 arg2 = LuaGetArgument_Vector3(L, 2);
-	float arg3 = LuaGetArgument_float(L, 4);
+	float arg3 = LuaGetArgument_float(L, 3);
 	bool result = CheckCollisionBoxSphere(arg1, arg2, arg3);
 	lua_pushboolean(L, result);
 	return 1;
 }
 
-// TODO:
-/*
-bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius);                              // Detect collision between ray and sphere
-bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadius, Vector3 *collisionPoint);   // Detect collision between ray and sphere with extended parameters and collision point detection
-bool CheckCollisionRayBox(Ray ray, BoundingBox box);                                                            // Detect collision between ray and box
-Vector3 ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *playerPosition, float radius);   // Detect collision of player radius with cubicmap
-*/
+int lua_CheckCollisionRaySphere(lua_State* L)
+{
+	Ray arg1 = LuaGetArgument_Ray(L, 1);
+	Vector3 arg2 = LuaGetArgument_Vector3(L, 2);
+	float arg3 = LuaGetArgument_float(L, 3);
+	bool result = CheckCollisionRaySphere(arg1, arg2, arg3);
+	lua_pushboolean(L, result);
+	return 1;
+}
+
+int lua_CheckCollisionRaySphereEx(lua_State* L)
+{
+	Ray arg1 = LuaGetArgument_Ray(L, 1);
+	Vector3 arg2 = LuaGetArgument_Vector3(L, 2);
+	float arg3 = LuaGetArgument_float(L, 3);
+    Vector3 arg4 = LuaGetArgument_Vector3(L, 4);
+	bool result = CheckCollisionRaySphereEx(arg1, arg2, arg3, &arg4);
+	lua_pushboolean(L, result);
+    LuaPush_Vector3(L, arg4);
+	return 2;
+}
+
+int lua_CheckCollisionRayBox(lua_State* L)
+{
+	Ray arg1 = LuaGetArgument_Ray(L, 1);
+	BoundingBox arg2 = LuaGetArgument_BoundingBox(L, 2);
+	bool result = CheckCollisionRayBox(arg1, arg2);
+	lua_pushboolean(L, result);
+	return 1;
+}
 
 int lua_ResolveCollisionCubicmap(lua_State* L)
 {
@@ -2431,23 +2698,55 @@ int lua_EndBlendMode(lua_State* L)
 	return 0;
 }
 
-// TODO:
-//Light CreateLight(int type, Vector3 position, Color diffuse);       // Create a new light, initialize it and add to pool
-//void DestroyLight(Light light);                                     // Destroy a light and take it out of the list
+// TODO: Light CreateLight(int type, Vector3 position, Color diffuse);
+// TODO: void DestroyLight(Light light);
 
-// TODO:
-/*
 //------------------------------------------------------------------------------------
 // raylib [rlgl] module functions - VR experience
 //------------------------------------------------------------------------------------
-void InitVrDevice(int vdDevice);            // Init VR device
-void CloseVrDevice(void);                   // Close VR device
-void UpdateVrTracking(void);                // Update VR tracking (position and orientation)
-void BeginVrDrawing(void);                  // Begin VR drawing configuration
-void EndVrDrawing(void);                    // End VR drawing process (and desktop mirror)
-bool IsVrDeviceReady(void);                 // Detect if VR device (or simulator) is ready
-void ToggleVrMode(void);                    // Enable/Disable VR experience (device or simulator)
-*/
+int lua_InitVrDevice(lua_State* L)
+{
+    int arg1 = LuaGetArgument_int(L, 1);
+	InitVrDevice(arg1);
+	return 0;
+}
+
+int lua_CloseVrDevice(lua_State* L)
+{
+	CloseVrDevice();
+	return 0;
+}
+
+int lua_UpdateVrTracking(lua_State* L)
+{
+	UpdateVrTracking();
+	return 0;
+}
+
+int lua_BeginVrDrawing(lua_State* L)
+{
+	BeginVrDrawing();
+	return 0;
+}
+
+int lua_EndVrDrawing(lua_State* L)
+{
+	EndVrDrawing();
+	return 0;
+}
+
+int lua_IsVrDeviceReady(lua_State* L)
+{
+	bool result = IsVrDeviceReady();
+	lua_pushboolean(L, result);
+	return 1;
+}
+
+int lua_ToggleVrMode(lua_State* L)
+{
+	ToggleVrMode();
+	return 0;
+}
 
 //------------------------------------------------------------------------------------
 // raylib [audio] module functions - Audio Loading and Playing
@@ -2570,20 +2869,21 @@ int lua_UnloadMusicStream(lua_State* L)
 	return 0;
 }
 
-int lua_PlayMusicStream(lua_State* L)
+int lua_UpdateMusicStream(lua_State* L)
 {
-	Music arg1 = LuaGetArgument_Music(L, 1);
-	PlayMusicStream(arg1);
+    Music arg1 = LuaGetArgument_Music(L, 1);
+	UpdateMusicStream(arg1);
 	return 0;
 }
 
-int lua_UpdateMusicStream(lua_State* L)
+int lua_PlayMusicStream(lua_State* L)
 {
-    Music arg1 = LuaGetArgument_Music(L, 1);
-	UpdateMusicStream(arg1);
+	Music arg1 = LuaGetArgument_Music(L, 1);
+	PlayMusicStream(arg1);
 	return 0;
 }
 
+
 int lua_StopMusicStream(lua_State* L)
 {
     Music arg1 = LuaGetArgument_Music(L, 1);
@@ -2621,6 +2921,14 @@ int lua_SetMusicVolume(lua_State* L)
 	return 0;
 }
 
+int lua_SetMusicPitch(lua_State* L)
+{
+    Music arg1 = LuaGetArgument_Music(L, 1);
+	float arg2 = LuaGetArgument_float(L, 2);
+	SetMusicPitch(arg1, arg2);
+	return 0;
+}
+
 int lua_GetMusicTimeLength(lua_State* L)
 {
     Music arg1 = LuaGetArgument_Music(L, 1);
@@ -2637,19 +2945,68 @@ int lua_GetMusicTimePlayed(lua_State* L)
 	return 1;
 }
 
-// TODO:
-/*
-AudioStream InitAudioStream(unsigned int sampleRate, 
-                            unsigned int sampleSize, 
-                            unsigned int channels);             // Init audio stream (to stream audio pcm data)
-void UpdateAudioStream(AudioStream stream, void *data, int numSamples); // Update audio stream buffers with data
-void CloseAudioStream(AudioStream stream);                      // Close audio stream and free memory
-bool IsAudioBufferProcessed(AudioStream stream);                // Check if any audio stream buffers requires refill
-void PlayAudioStream(AudioStream stream);                       // Play audio stream
-void PauseAudioStream(AudioStream stream);                      // Pause audio stream
-void ResumeAudioStream(AudioStream stream);                     // Resume audio stream
-void StopAudioStream(AudioStream stream);                       // Stop audio stream
-*/
+int lua_InitAudioStream(lua_State* L)
+{
+	int arg1 = LuaGetArgument_int(L, 1);
+	int arg2 = LuaGetArgument_int(L, 2);
+	int arg3 = LuaGetArgument_int(L, 3);
+    AudioStream result = InitAudioStream(arg1, arg2, arg3);
+	LuaPush_AudioStream(L, result);
+	return 1;
+}
+
+int lua_CloseAudioStream(lua_State* L)
+{
+	AudioStream arg1 = LuaGetArgument_AudioStream(L, 1);
+	CloseAudioStream(arg1);
+	return 0;
+}
+
+int lua_UpdateAudioStream(lua_State* L)
+{
+    AudioStream arg1 = LuaGetArgument_AudioStream(L, 1);
+    void * arg2 = (char *)LuaGetArgument_string(L, 2);
+    int arg3 = LuaGetArgument_int(L, 3);
+	UpdateAudioStream(arg1, arg2, arg3);
+	return 0;
+}
+
+int lua_IsAudioBufferProcessed(lua_State* L)
+{
+    AudioStream arg1 = LuaGetArgument_AudioStream(L, 1);
+	bool result = IsAudioBufferProcessed(arg1);
+	lua_pushboolean(L, result);
+	return 1;
+}
+
+int lua_PlayAudioStream(lua_State* L)
+{
+	AudioStream arg1 = LuaGetArgument_AudioStream(L, 1);
+	PlayAudioStream(arg1);
+	return 0;
+}
+
+
+int lua_StopAudioStream(lua_State* L)
+{
+    AudioStream arg1 = LuaGetArgument_AudioStream(L, 1);
+	StopAudioStream(arg1);
+	return 0;
+}
+
+int lua_PauseAudioStream(lua_State* L)
+{
+    AudioStream arg1 = LuaGetArgument_AudioStream(L, 1);
+	PauseAudioStream(arg1);
+	return 0;
+}
+
+int lua_ResumeAudioStream(lua_State* L)
+{
+    AudioStream arg1 = LuaGetArgument_AudioStream(L, 1);
+	ResumeAudioStream(arg1);
+	return 0;
+}
 
 //----------------------------------------------------------------------------------
 // raylib [utils] module functions
@@ -3114,29 +3471,49 @@ int lua_QuaternionTransform(lua_State* L)
 
 // raylib Functions (and data types) list
 static luaL_Reg raylib_functions[] = {
-	REG(Color)
+	
+    // Register non-opaque data types
+    REG(Color)
 	REG(Vector2)
 	REG(Vector3)
+    //REG(Matrix)
+    REG(Quaternion)
 	REG(Rectangle)
 	REG(Ray)
 	REG(Camera)
-    // TODO: Additional structs
+	REG(Camera2D)
+    REG(BoundingBox)
+    //REG(Material)
 
-    // TODO: Review registered functions
+    // Register functions
 	REG(InitWindow)
 	REG(CloseWindow)
 	REG(WindowShouldClose)
 	REG(IsWindowMinimized)
 	REG(ToggleFullscreen)
-
 	REG(GetScreenWidth)
 	REG(GetScreenHeight)
+    
+	REG(ShowCursor)
+	REG(HideCursor)
+	REG(IsCursorHidden)
+	REG(EnableCursor)
+	REG(DisableCursor)
+
 	REG(ClearBackground)
 	REG(BeginDrawing)
 	REG(EndDrawing)
+    REG(Begin2dMode)
+	REG(End2dMode)
 	REG(Begin3dMode)
 	REG(End3dMode)
+    REG(BeginTextureMode)
+	REG(EndTextureMode)
+    
 	REG(GetMouseRay)
+	REG(GetWorldToScreen)
+	REG(GetCameraMatrix)
+    
 #if defined(PLATFORM_WEB)
 	REG(SetDrawingLoop)
 #else
@@ -3144,21 +3521,39 @@ static luaL_Reg raylib_functions[] = {
 #endif
 	REG(GetFPS)
 	REG(GetFrameTime)
+    
 	REG(GetColor)
 	REG(GetHexValue)
+	REG(ColorToFloat)
+	REG(VectorToFloat)
+	REG(MatrixToFloat)
 	REG(GetRandomValue)
 	REG(Fade)
 	REG(SetConfigFlags)
 	REG(ShowLogo)
+    
 	REG(IsFileDropped)
 	//REG(*GetDroppedFiles)
 	REG(ClearDroppedFiles)
+	REG(StorageSaveValue)
+	REG(StorageLoadValue)
+    
 #if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB)
 	REG(IsKeyPressed)
 	REG(IsKeyDown)
 	REG(IsKeyReleased)
 	REG(IsKeyUp)
 	REG(GetKeyPressed)
+    REG(SetExitKey)
+    
+	REG(IsGamepadAvailable)
+    REG(GetGamepadAxisMovement)
+	REG(IsGamepadButtonPressed)
+	REG(IsGamepadButtonDown)
+	REG(IsGamepadButtonReleased)
+	REG(IsGamepadButtonUp)
+#endif
+
 	REG(IsMouseButtonPressed)
 	REG(IsMouseButtonDown)
 	REG(IsMouseButtonReleased)
@@ -3168,50 +3563,41 @@ static luaL_Reg raylib_functions[] = {
 	REG(GetMousePosition)
 	REG(SetMousePosition)
 	REG(GetMouseWheelMove)
-	REG(ShowCursor)
-	REG(HideCursor)
-	REG(IsCursorHidden)
-#endif
-
-#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
-	REG(IsGamepadAvailable)
-    
-	REG(IsGamepadButtonPressed)
-	REG(IsGamepadButtonDown)
-	REG(IsGamepadButtonReleased)
-	REG(IsGamepadButtonUp)
-#endif
-
-#if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)
 	REG(GetTouchX)
 	REG(GetTouchY)
 	REG(GetTouchPosition)
-#if defined(PLATFORM_WEB)
-	REG(InitGesturesSystem)
-#elif defined(PLATFORM_ANDROID)
-	//REG(InitGesturesSystem)
+
+#if defined(PLATFORM_ANDROID)
+	REG(IsButtonPressed)
+	REG(IsButtonDown)
+	REG(IsButtonReleased)
 #endif
-	REG(UpdateGestures)
-	REG(IsGestureDetected)
-	REG(GetGestureType)
+
 	REG(SetGesturesEnabled)
-	REG(GetGestureDragIntensity)
-	REG(GetGestureDragAngle)
-	REG(GetGestureDragVector)
+	REG(IsGestureDetected)
+	//REG(ProcessGestureEvent)
+	REG(UpdateGestures)
+	REG(GetTouchPointsCount)
+	REG(GetGestureDetected)
 	REG(GetGestureHoldDuration)
-	REG(GetGesturePinchDelta)
+	REG(GetGestureDragVector)
+	REG(GetGestureDragAngle)
+	REG(GetGesturePinchVector)
 	REG(GetGesturePinchAngle)
-#endif
+
 	REG(SetCameraMode)
 	REG(UpdateCamera)
 	REG(UpdateCameraPlayer)
 	REG(SetCameraPosition)
 	REG(SetCameraTarget)
+    REG(SetCameraFovy)
+    
 	REG(SetCameraPanControl)
 	REG(SetCameraAltControl)
 	REG(SetCameraSmoothZoomControl)
 	REG(SetCameraMoveControls)
 	REG(SetCameraMouseSensitivity)
+    
 	REG(DrawPixel)
 	REG(DrawPixelV)
 	REG(DrawLine)
@@ -3230,6 +3616,7 @@ static luaL_Reg raylib_functions[] = {
 	REG(DrawPoly)
 	REG(DrawPolyEx)
 	REG(DrawPolyExLines)
+    
 	REG(CheckCollisionRecs)
 	REG(CheckCollisionCircles)
 	REG(CheckCollisionCircleRec)
@@ -3237,25 +3624,48 @@ static luaL_Reg raylib_functions[] = {
 	REG(CheckCollisionPointRec)
 	REG(CheckCollisionPointCircle)
 	REG(CheckCollisionPointTriangle)
+    
 	REG(LoadImage)
 	REG(LoadImageEx)
 	REG(LoadImageRaw)
 	REG(LoadImageFromRES)
 	REG(LoadTexture)
+	REG(LoadTextureEx)
 	REG(LoadTextureFromRES)
 	REG(LoadTextureFromImage)
+    REG(LoadRenderTexture)
 	REG(UnloadImage)
 	REG(UnloadTexture)
 	REG(GetImageData)
 	REG(GetTextureData)
 	REG(ImageToPOT)
 	REG(ImageFormat)
+    REG(ImageDither)
+    REG(ImageCopy)
+    REG(ImageCrop)
+    REG(ImageResize)
+    REG(ImageResizeNN)
+    REG(ImageText)
+    REG(ImageTextEx)
+    REG(ImageDraw)
+    REG(ImageDrawText)
+    REG(ImageDrawTextEx)
+    REG(ImageFlipVertical)
+    REG(ImageFlipHorizontal)
+    REG(ImageColorTint)
+    REG(ImageColorInvert)
+    REG(ImageColorGrayscale)
+    REG(ImageColorContrast)
+    REG(ImageColorBrightness)
 	REG(GenTextureMipmaps)
+    REG(UpdateTexture)
+    
 	REG(DrawTexture)
 	REG(DrawTextureV)
 	REG(DrawTextureEx)
 	REG(DrawTextureRec)
 	REG(DrawTexturePro)
+    
 	REG(GetDefaultFont)
 	REG(LoadSpriteFont)
 	REG(UnloadSpriteFont)
@@ -3264,6 +3674,9 @@ static luaL_Reg raylib_functions[] = {
 	REG(MeasureText)
 	REG(MeasureTextEx)
 	REG(DrawFPS)
+    //REG(FormatText)
+    //REG(SubText)
+    
 	REG(DrawCube)
 	REG(DrawCubeV)
 	REG(DrawCubeWires)
@@ -3277,49 +3690,92 @@ static luaL_Reg raylib_functions[] = {
 	REG(DrawRay)
 	REG(DrawGrid)
 	REG(DrawGizmo)
+    
 	REG(LoadModel)
 	REG(LoadModelEx)
+    REG(LoadModelFromRES)
 	REG(LoadHeightmap)
 	REG(LoadCubicmap)
 	REG(UnloadModel)
+    //REG(GenMesh*)     // Not ready yet...
+    
 	REG(DrawModel)
 	REG(DrawModelEx)
 	REG(DrawModelWires)
+	REG(DrawModelWiresEx)
 	REG(DrawBillboard)
 	REG(DrawBillboardRec)
+    REG(CalculateBoundingBox)
 	REG(CheckCollisionSpheres)
 	REG(CheckCollisionBoxes)
 	REG(CheckCollisionBoxSphere)
+    REG(CheckCollisionRaySphere)
+    REG(CheckCollisionRaySphereEx)
+    REG(CheckCollisionRayBox)
 	REG(ResolveCollisionCubicmap)
+    
 	REG(LoadShader)
 	REG(UnloadShader)
+    REG(GetDefaultShader)
+    REG(GetStandardShader)
+    REG(GetDefaultTexture)
 	REG(GetShaderLocation)
 	REG(SetShaderValue)
 	REG(SetShaderValuei)
-
+	REG(SetShaderValueMatrix)
+	REG(SetMatrixProjection)
+	REG(SetMatrixModelview)
+	REG(BeginShaderMode)
+	REG(EndShaderMode)
 	REG(BeginBlendMode)
 	REG(EndBlendMode)
+    //REG(CreateLight)
+    //REG(DestroyLight)
+    
+	REG(InitVrDevice)
+	REG(CloseVrDevice)
+	REG(UpdateVrTracking)
+	REG(BeginVrDrawing)
+	REG(EndVrDrawing)
+	REG(IsVrDeviceReady)
+	REG(ToggleVrMode)
+    
 	REG(InitAudioDevice)
 	REG(CloseAudioDevice)
+    REG(IsAudioDeviceReady)
 	REG(LoadSound)
 	REG(LoadSoundFromWave)
 	REG(LoadSoundFromRES)
 	REG(UnloadSound)
 	REG(PlaySound)
 	REG(PauseSound)
+	REG(ResumeSound)
 	REG(StopSound)
 	REG(IsSoundPlaying)
 	REG(SetSoundVolume)
 	REG(SetSoundPitch)
-	REG(PlayMusicStream)
+    
+	REG(LoadMusicStream)
+	REG(UnloadMusicStream)
 	REG(UpdateMusicStream)
+    REG(PlayMusicStream)
 	REG(StopMusicStream)
 	REG(PauseMusicStream)
 	REG(ResumeMusicStream)
 	REG(IsMusicPlaying)
 	REG(SetMusicVolume)
+	REG(SetMusicPitch)
 	REG(GetMusicTimeLength)
 	REG(GetMusicTimePlayed)
+    
+	REG(InitAudioStream)
+	REG(UpdateAudioStream)
+	REG(CloseAudioStream)
+	REG(IsAudioBufferProcessed)
+	REG(PlayAudioStream)
+	REG(PauseAudioStream)
+	REG(ResumeAudioStream)
+	REG(StopAudioStream)
 
 	/// Math and util
 	REG(DecompressData)