| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -82,8 +82,6 @@ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			*   #define SUPPORT_DATA_STORAGE | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			*       Support saving binary data automatically to a generated storage.data file. This file is managed internally | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			* | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			*   #define SUPPORT_VR_SIMULATOR | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			*       Support VR simulation functionality (stereo rendering) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			* | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			*   DEPENDENCIES: | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			*       rglfw    - Manage graphic device, OpenGL context and inputs on PLATFORM_DESKTOP (Windows, Linux, OSX. FreeBSD, OpenBSD, NetBSD, DragonFly) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -165,7 +163,7 @@ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <stdio.h>                  // Required for: sprintf() [Used in OpenURL()] | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <string.h>                 // Required for: strrchr(), strcmp(), strlen() | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <time.h>                   // Required for: time() [Used in InitTimer()] | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <math.h>                   // Required for: tan() [Used in BeginMode3D()], atan2f() [Used in InitVrSimulator()] | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <math.h>                   // Required for: tan() [Used in BeginMode3D()], atan2f() [Used in LoadVrStereoMode()] | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <sys/stat.h>               // Required for: stat() [Used in GetFileModTime()] | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -480,15 +478,6 @@ typedef struct CoreData { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        unsigned long long base;            // Base time measure for hi-res timer | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } Time; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(SUPPORT_VR_SIMULATOR) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    struct { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        VrStereoConfig config;              // VR stereo configuration for simulator | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        unsigned int stereoFboId;           // VR stereo rendering framebuffer id | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        unsigned int stereoTexId;           // VR stereo color texture (attached to framebuffer) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        bool simulatorReady;                // VR simulator ready flag | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        bool stereoRender;                  // VR stereo rendering enabled/disabled flag | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } Vr;               // VR simulator data | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif  // SUPPORT_VR_SIMULATOR | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} CoreData; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			//---------------------------------------------------------------------------------- | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -2035,6 +2024,161 @@ void EndTextureMode(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Window.currentFbo.height = CORE.Window.screen.height; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Begin custom shader mode | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void BeginShaderMode(Shader shader) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetShader(shader); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// End custom shader mode (returns to default shader) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void EndShaderMode(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetShader(rlGetShaderDefault()); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Begin blending mode (alpha, additive, multiplied) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: Only 3 blending modes supported, default blend mode is alpha | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void BeginBlendMode(int mode) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetBlendMode(mode); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// End blending mode (reset to default: alpha blending) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void EndBlendMode(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetBlendMode(BLEND_ALPHA); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Begin scissor mode (define screen area for following drawing) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: Scissor rec refers to bottom-left corner, we change it to upper-left | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void BeginScissorMode(int x, int y, int width, int height) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlDrawRenderBatchActive();      // Update and draw internal render batch | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlEnableScissorTest(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlScissor(x, CORE.Window.currentFbo.height - (y + height), width, height); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// End scissor mode | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void EndScissorMode(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlDrawRenderBatchActive();      // Update and draw internal render batch | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlDisableScissorTest(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Begin VR drawing configuration | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void BeginVrStereoMode(RenderTexture2D target, VrStereoConfig config) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlEnableFramebuffer(target.id);     // Setup framebuffer for stereo rendering | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //glEnable(GL_FRAMEBUFFER_SRGB);    // Enable SRGB framebuffer (only if required) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlClearScreenBuffers();             // Clear current framebuffer | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlEnableStereoRender(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Set stereo render matrices | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetMatrixProjectionStereo(config.projection[0], config.projection[1]); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetMatrixViewOffsetStereo(config.viewOffset[0], config.viewOffset[1]); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// End VR drawing process (and desktop mirror) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void EndVrStereoMode(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlDisableStereoRender(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlDisableFramebuffer();         // Unbind current framebuffer | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Reset viewport and default projection-modelview matrices | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlViewport(0, 0, GetScreenWidth(), GetScreenHeight()); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetMatrixProjection(MatrixOrtho(0.0, GetScreenWidth(), GetScreenHeight(), 0.0, 0.0, 1.0)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetMatrixModelview(MatrixIdentity()); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlDisableDepthTest(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Load VR stereo config for VR simulator device parameters | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			VrStereoConfig LoadVrStereoMode(VrDeviceInfo device) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    VrStereoConfig config = { 0 }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute aspect ratio | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float aspect = ((float)device.hResolution*0.5f)/(float)device.vResolution; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute lens parameters | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float lensShift = (device.hScreenSize*0.25f - device.lensSeparationDistance*0.5f)/device.hScreenSize; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.leftLensCenter[0] = 0.25f + lensShift; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.leftLensCenter[1] = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.rightLensCenter[0] = 0.75f - lensShift; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.rightLensCenter[1] = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.leftScreenCenter[0] = 0.25f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.leftScreenCenter[1] = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.rightScreenCenter[0] = 0.75f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.rightScreenCenter[1] = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute distortion scale parameters | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // NOTE: To get lens max radius, lensShift must be normalized to [-1..1] | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float lensRadius = fabsf(-1.0f - 4.0f*lensShift); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float lensRadiusSq = lensRadius*lensRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float distortionScale = device.lensDistortionValues[0] + | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                            device.lensDistortionValues[1]*lensRadiusSq + | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                            device.lensDistortionValues[2]*lensRadiusSq*lensRadiusSq + | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                            device.lensDistortionValues[3]*lensRadiusSq*lensRadiusSq*lensRadiusSq; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float normScreenWidth = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float normScreenHeight = 1.0f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.scaleIn[0] = 2.0f/normScreenWidth; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.scaleIn[1] = 2.0f/normScreenHeight/aspect; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.scale[0] = normScreenWidth*0.5f/distortionScale; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.scale[1] = normScreenHeight*0.5f*aspect/distortionScale; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Fovy is normally computed with: 2*atan2f(device.vScreenSize, 2*device.eyeToScreenDistance) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // ...but with lens distortion it is increased (see Oculus SDK Documentation) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //float fovy = 2.0f*atan2f(device.vScreenSize*0.5f*distortionScale, device.eyeToScreenDistance);     // Really need distortionScale? | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float fovy = 2.0f*(float)atan2f(device.vScreenSize*0.5f, device.eyeToScreenDistance); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute camera projection matrices | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float projOffset = 4.0f*lensShift;      // Scaled to projection space coordinates [-1..1] | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    Matrix proj = MatrixPerspective(fovy, aspect, RL_CULL_DISTANCE_NEAR, RL_CULL_DISTANCE_FAR); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			     | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.projection[0] = MatrixMultiply(proj, MatrixTranslate(projOffset, 0.0f, 0.0f)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.projection[1] = MatrixMultiply(proj, MatrixTranslate(-projOffset, 0.0f, 0.0f)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute camera transformation matrices | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // NOTE: Camera movement might seem more natural if we model the head. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Our axis of rotation is the base of our head, so we might want to add | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // some y (base of head to eye level) and -z (center of head to eye protrusion) to the camera positions. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.viewOffset[0] = MatrixTranslate(-device.interpupillaryDistance*0.5f, 0.075f, 0.045f); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.viewOffset[1] = MatrixTranslate(device.interpupillaryDistance*0.5f, 0.075f, 0.045f); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute eyes Viewports | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    /* | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.eyeViewportRight[0] = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.eyeViewportRight[1] = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.eyeViewportRight[2] = device.hResolution/2; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.eyeViewportRight[3] = device.vResolution; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.eyeViewportLeft[0] = device.hResolution/2; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.eyeViewportLeft[1] = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.eyeViewportLeft[2] = device.hResolution/2; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config.eyeViewportLeft[3] = device.vResolution; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    */ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    TRACELOG(LOG_WARNING, "RLGL: VR Simulator not supported on OpenGL 1.1"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return config; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Unload VR stereo config properties  | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void UnloadVrStereoConfig(VrStereoConfig config) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //... | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Load shader from files and bind default locations | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: If shader string is NULL, using default vertex/fragment shaders | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			Shader LoadShader(const char *vsFileName, const char *fsFileName) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -2147,18 +2291,6 @@ void UnloadShader(Shader shader) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Begin custom shader mode | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void BeginShaderMode(Shader shader) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetShader(shader); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// End custom shader mode (returns to default shader) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void EndShaderMode(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetShader(rlGetShaderDefault()); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Get shader uniform location | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			int GetShaderLocation(Shader shader, const char *uniformName) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -2201,176 +2333,6 @@ void SetShaderValueTexture(Shader shader, int locIndex, Texture2D texture) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //rlDisableShader(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Begin blending mode (alpha, additive, multiplied) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: Only 3 blending modes supported, default blend mode is alpha | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void BeginBlendMode(int mode) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetBlendMode(mode); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// End blending mode (reset to default: alpha blending) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void EndBlendMode(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetBlendMode(BLEND_ALPHA); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(SUPPORT_VR_SIMULATOR) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Init VR simulator for selected device parameters | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void InitVrSimulator(VrDeviceInfo device) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Reset CORE.Vr.config for a new values assignment | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    memset(&CORE.Vr.config, 0, sizeof(VrStereoConfig)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute aspect ratio | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float aspect = ((float)device.hResolution*0.5f)/(float)device.vResolution; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute lens parameters | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float lensShift = (device.hScreenSize*0.25f - device.lensSeparationDistance*0.5f)/device.hScreenSize; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.leftLensCenter[0] = 0.25f + lensShift; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.leftLensCenter[1] = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.rightLensCenter[0] = 0.75f - lensShift; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.rightLensCenter[1] = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.leftScreenCenter[0] = 0.25f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.leftScreenCenter[1] = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.rightScreenCenter[0] = 0.75f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.rightScreenCenter[1] = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute distortion scale parameters | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // NOTE: To get lens max radius, lensShift must be normalized to [-1..1] | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float lensRadius = fabsf(-1.0f - 4.0f*lensShift); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float lensRadiusSq = lensRadius*lensRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float distortionScale = device.lensDistortionValues[0] + | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                            device.lensDistortionValues[1]*lensRadiusSq + | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                            device.lensDistortionValues[2]*lensRadiusSq*lensRadiusSq + | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                            device.lensDistortionValues[3]*lensRadiusSq*lensRadiusSq*lensRadiusSq; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float normScreenWidth = 0.5f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float normScreenHeight = 1.0f; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.scaleIn[0] = 2.0f/normScreenWidth; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.scaleIn[1] = 2.0f/normScreenHeight/aspect; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.scale[0] = normScreenWidth*0.5f/distortionScale; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.scale[1] = normScreenHeight*0.5f*aspect/distortionScale; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Fovy is normally computed with: 2*atan2f(device.vScreenSize, 2*device.eyeToScreenDistance) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // ...but with lens distortion it is increased (see Oculus SDK Documentation) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    //float fovy = 2.0f*atan2f(device.vScreenSize*0.5f*distortionScale, device.eyeToScreenDistance);     // Really need distortionScale? | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float fovy = 2.0f*(float)atan2f(device.vScreenSize*0.5f, device.eyeToScreenDistance); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute camera projection matrices | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float projOffset = 4.0f*lensShift;      // Scaled to projection space coordinates [-1..1] | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    Matrix proj = MatrixPerspective(fovy, aspect, RL_CULL_DISTANCE_NEAR, RL_CULL_DISTANCE_FAR); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetMatrixProjectionStereo(MatrixMultiply(proj, MatrixTranslate(projOffset, 0.0f, 0.0f)), MatrixMultiply(proj, MatrixTranslate(-projOffset, 0.0f, 0.0f))); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute camera transformation matrices | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // NOTE: Camera movement might seem more natural if we model the head. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Our axis of rotation is the base of our head, so we might want to add | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // some y (base of head to eye level) and -z (center of head to eye protrusion) to the camera positions. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlSetMatrixViewOffsetStereo(MatrixTranslate(-device.interpupillaryDistance*0.5f, 0.075f, 0.045f), MatrixTranslate(device.interpupillaryDistance*0.5f, 0.075f, 0.045f)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Compute eyes Viewports | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    /* | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.eyeViewportRight[0] = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.eyeViewportRight[1] = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.eyeViewportRight[2] = device.hResolution/2; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.eyeViewportRight[3] = device.vResolution; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.eyeViewportLeft[0] = device.hResolution/2; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.eyeViewportLeft[1] = 0; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.eyeViewportLeft[2] = device.hResolution/2; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.config.eyeViewportLeft[3] = device.vResolution; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    */ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.simulatorReady = true; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#else | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    TRACELOG(LOG_WARNING, "RLGL: VR Simulator not supported on OpenGL 1.1"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Update VR tracking (position and orientation) and camera | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: Camera (position, target, up) gets update with head tracking information | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void UpdateVrTracking(Camera *camera) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // TODO: Simulate 1st person camera system | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Close VR simulator for current device | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void CloseVrSimulator(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    CORE.Vr.simulatorReady = false; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Get stereo rendering configuration parameters | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			VrStereoConfig GetVrConfig(VrDeviceInfo device) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    VrStereoConfig config = { 0 }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    config = CORE.Vr.config; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return config; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Detect if VR simulator is running | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			bool IsVrSimulatorReady(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    return CORE.Vr.simulatorReady; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Begin VR drawing configuration | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void BeginVrDrawing(RenderTexture2D target) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (CORE.Vr.simulatorReady) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlEnableFramebuffer(target.id);     // Setup framebuffer for stereo rendering | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        //glEnable(GL_FRAMEBUFFER_SRGB);    // Enable SRGB framebuffer (only if required) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        //rlViewport(0, 0, buffer.width, buffer.height); // Useful if rendering to separate framebuffers (every eye) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlClearScreenBuffers();             // Clear current framebuffer | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlEnableStereoRender(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// End VR drawing process (and desktop mirror) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void EndVrDrawing(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (CORE.Vr.simulatorReady) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlDisableStereoRender(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlDisableFramebuffer();         // Unbind current framebuffer | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        // Reset viewport and default projection-modelview matrices | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlViewport(0, 0, GetScreenWidth(), GetScreenHeight()); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlSetMatrixProjection(MatrixOrtho(0.0, GetScreenWidth(), GetScreenHeight(), 0.0, 0.0, 1.0)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlSetMatrixModelview(MatrixIdentity()); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlDisableDepthTest(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif          // SUPPORT_VR_SIMULATOR | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Begin scissor mode (define screen area for following drawing) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: Scissor rec refers to bottom-left corner, we change it to upper-left | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void BeginScissorMode(int x, int y, int width, int height) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlDrawRenderBatchActive();      // Update and draw internal render batch | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlEnableScissorTest(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlScissor(x, CORE.Window.currentFbo.height - (y + height), width, height); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// End scissor mode | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void EndScissorMode(void) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlDrawRenderBatchActive();      // Update and draw internal render batch | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlDisableScissorTest(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Returns a ray trace from mouse position | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			Ray GetMouseRay(Vector2 mouse, Camera camera) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |