| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -703,6 +703,64 @@ void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float h | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlPopMatrix(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Draw a cylinder with base at startPos and top at endPos | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: It could be also used for pyramid and cone | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (sides < 3) sides = 3; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int numVertex = sides*6; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlCheckRenderBatchLimit(numVertex); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if(sides < 3) sides = 3; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    Vector3 direction = { endPos.x - startPos.x, endPos.y - startPos.y, endPos.z - startPos.z }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Construct a basis of the base and the top face: | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    Vector3 b1 = Vector3Normalize(Vector3Perpendicular(direction)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    Vector3 b2 = Vector3Normalize(Vector3CrossProduct(b1, direction)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float baseAngle = (2.0*PI)/sides; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlBegin(RL_TRIANGLES); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlColor4ub(color.r, color.g, color.b, color.a); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        for (int i = 0; i < sides; i++) { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // compute the four vertices | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float s1 = sinf(baseAngle*(i + 0))*startRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float c1 = cosf(baseAngle*(i + 0))*startRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            Vector3 w1 = { startPos.x + s1*b1.x + c1*b2.x, startPos.y + s1*b1.y + c1*b2.y, startPos.z + s1*b1.z + c1*b2.z }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float s2 = sinf(baseAngle*(i + 1))*startRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float c2 = cosf(baseAngle*(i + 1))*startRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            Vector3 w2 = { startPos.x + s2*b1.x + c2*b2.x, startPos.y + s2*b1.y + c2*b2.y, startPos.z + s2*b1.z + c2*b2.z }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float s3 = sinf(baseAngle*(i + 0))*endRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float c3 = cosf(baseAngle*(i + 0))*endRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            Vector3 w3 = { endPos.x + s3*b1.x + c3*b2.x, endPos.y + s3*b1.y + c3*b2.y, endPos.z + s3*b1.z + c3*b2.z }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float s4 = sinf(baseAngle*(i + 1))*endRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float c4 = cosf(baseAngle*(i + 1))*endRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            Vector3 w4 = { endPos.x + s4*b1.x + c4*b2.x, endPos.y + s4*b1.y + c4*b2.y, endPos.z + s4*b1.z + c4*b2.z }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if (startRadius > 0) {                              // | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                rlVertex3f(startPos.x, startPos.y, startPos.z); // | | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                rlVertex3f(w2.x, w2.y, w2.z);                   // T0 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                rlVertex3f(w1.x, w1.y, w1.z);                   // | | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            }                                                   // | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                                                                //          w2 x.-----------x startPos | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w1.x, w1.y, w1.z);                       // |           |\'.  T0    / | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w2.x, w2.y, w2.z);                       // T1          | \ '.     / | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w3.x, w3.y, w3.z);                       // |           |T \  '.  / | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                                                                //             | 2 \ T 'x w1 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w2.x, w2.y, w2.z);                       // |        w4 x.---\-1-|---x endPos | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w4.x, w4.y, w4.z);                       // T2            '.  \  |T3/ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w3.x, w3.y, w3.z);                       // |               '. \ | / | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                                                                //                   '.\|/ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            if (endRadius > 0) {                                //                     'x w3 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                rlVertex3f(endPos.x, endPos.y, endPos.z);       // | | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                rlVertex3f(w3.x, w3.y, w3.z);                   // T3 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			                rlVertex3f(w4.x, w4.y, w4.z);                   // | | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            }                                                   // | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlEnd(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Draw a wired cylinder | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: It could be also used for pyramid and cone | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int sides, Color color) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -736,6 +794,54 @@ void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, fl | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlPopMatrix(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Draw a wired cylinder with base at startPos and top at endPos | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// NOTE: It could be also used for pyramid and cone | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if (sides < 3) sides = 3; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    int numVertex = sides*6; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlCheckRenderBatchLimit(numVertex); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    Vector3 difference = Vector3Subtract(endPos, startPos); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    // Construct a basis of the base and the top face: | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    Vector3 b1 = Vector3Normalize(Vector3Perpendicular(difference)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    Vector3 b2 = Vector3Normalize(Vector3CrossProduct(b1, difference)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float baseAngle = (2.0*PI)/sides; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlBegin(RL_LINES); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        rlColor4ub(color.r, color.g, color.b, color.a); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        for (int i = 0; i < sides; i++) { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            // compute the four vertices | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float s1 = sinf(baseAngle*(i + 0))*startRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float c1 = cosf(baseAngle*(i + 0))*startRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            Vector3 w1 = { startPos.x + s1*b1.x + c1*b2.x, startPos.y + s1*b1.y + c1*b2.y, startPos.z + s1*b1.z + c1*b2.z }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float s2 = sinf(baseAngle*(i + 1))*startRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float c2 = cosf(baseAngle*(i + 1))*startRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            Vector3 w2 = { startPos.x + s2*b1.x + c2*b2.x, startPos.y + s2*b1.y + c2*b2.y, startPos.z + s2*b1.z + c2*b2.z }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float s3 = sinf(baseAngle*(i + 0))*endRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float c3 = cosf(baseAngle*(i + 0))*endRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            Vector3 w3 = { endPos.x + s3*b1.x + c3*b2.x, endPos.y + s3*b1.y + c3*b2.y, endPos.z + s3*b1.z + c3*b2.z }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float s4 = sinf(baseAngle*(i + 1))*endRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            float c4 = cosf(baseAngle*(i + 1))*endRadius; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            Vector3 w4 = { endPos.x + s4*b1.x + c4*b2.x, endPos.y + s4*b1.y + c4*b2.y, endPos.z + s4*b1.z + c4*b2.z }; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w1.x, w1.y, w1.z); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w2.x, w2.y, w2.z); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w1.x, w1.y, w1.z); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w3.x, w3.y, w3.z); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w3.x, w3.y, w3.z); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			            rlVertex3f(w4.x, w4.y, w4.z); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    rlEnd(); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			// Draw a plane | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			void DrawPlane(Vector3 centerPos, Vector2 size, Color color) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |