@ -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 )
{