mirror of
				https://github.com/raysan5/raylib.git
				synced 2025-11-04 09:44:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			169 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*******************************************************************************************
 | 
						|
*
 | 
						|
*   raylib [models] example - rlgl module usage with push/pop matrix transformations
 | 
						|
*
 | 
						|
*   This example uses [rlgl] module funtionality (pseudo-OpenGL 1.1 style coding)
 | 
						|
*
 | 
						|
*   This example has been created using raylib 2.2 (www.raylib.com)
 | 
						|
*   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
 | 
						|
*
 | 
						|
*   Copyright (c) 2018 Ramon Santamaria (@raysan5)
 | 
						|
*
 | 
						|
********************************************************************************************/
 | 
						|
 | 
						|
#include "raylib.h"
 | 
						|
#include "rlgl.h"
 | 
						|
 | 
						|
//------------------------------------------------------------------------------------
 | 
						|
// Module Functions Declaration
 | 
						|
//------------------------------------------------------------------------------------
 | 
						|
void DrawSphereBasic(Color color);      // Draw sphere without any matrix transformation
 | 
						|
 | 
						|
//------------------------------------------------------------------------------------
 | 
						|
// Program main entry point
 | 
						|
//------------------------------------------------------------------------------------
 | 
						|
int main()
 | 
						|
{
 | 
						|
    // Initialization
 | 
						|
    //--------------------------------------------------------------------------------------
 | 
						|
    const int screenWidth = 800;
 | 
						|
    const int screenHeight = 450;
 | 
						|
    
 | 
						|
    const float sunRadius = 4.0f;
 | 
						|
    const float earthRadius = 0.6f;
 | 
						|
    const float earthOrbitRadius = 8.0f;
 | 
						|
    const float moonRadius = 0.16f;
 | 
						|
    const float moonOrbitRadius = 1.5f;
 | 
						|
 | 
						|
    InitWindow(screenWidth, screenHeight, "raylib [models] example - rlgl module usage with push/pop matrix transformations");
 | 
						|
 | 
						|
    // Define the camera to look into our 3d world
 | 
						|
    Camera camera = { 0 };
 | 
						|
    camera.position = (Vector3){ 16.0f, 16.0f, 16.0f };
 | 
						|
    camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
 | 
						|
    camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
 | 
						|
    camera.fovy = 45.0f;
 | 
						|
    camera.type = CAMERA_PERSPECTIVE;
 | 
						|
    
 | 
						|
    SetCameraMode(camera, CAMERA_FREE);
 | 
						|
       
 | 
						|
    float rotationSpeed = 0.2f;         // General system rotation speed
 | 
						|
    
 | 
						|
    float earthRotation = 0.0f;         // Rotation of earth around itself (days) in degrees
 | 
						|
    float earthOrbitRotation = 0.0f;    // Rotation of earth around the Sun (years) in degrees
 | 
						|
    float moonRotation = 0.0f;          // Rotation of moon around itself
 | 
						|
    float moonOrbitRotation = 0.0f;     // Rotation of moon around earth in degrees
 | 
						|
 | 
						|
    SetTargetFPS(60);   // Set our game to run at 60 frames-per-second
 | 
						|
    //--------------------------------------------------------------------------------------
 | 
						|
 | 
						|
    // Main game loop
 | 
						|
    while (!WindowShouldClose())    // Detect window close button or ESC key
 | 
						|
    {
 | 
						|
        // Update
 | 
						|
        //----------------------------------------------------------------------------------
 | 
						|
        UpdateCamera(&camera);
 | 
						|
        
 | 
						|
        earthRotation += (5.0f*rotationSpeed);
 | 
						|
        earthOrbitRotation += (365/360.0f*(5.0f*rotationSpeed)*rotationSpeed);
 | 
						|
        moonRotation += (2.0f*rotationSpeed);
 | 
						|
        moonOrbitRotation += (8.0f*rotationSpeed);
 | 
						|
        //----------------------------------------------------------------------------------
 | 
						|
 | 
						|
        // Draw
 | 
						|
        //----------------------------------------------------------------------------------
 | 
						|
        BeginDrawing();
 | 
						|
 | 
						|
            ClearBackground(RAYWHITE);
 | 
						|
 | 
						|
            BeginMode3D(camera);
 | 
						|
            
 | 
						|
                rlPushMatrix();
 | 
						|
                    rlScalef(sunRadius, sunRadius, sunRadius);          // Scale Sun
 | 
						|
                    DrawSphereBasic(GOLD);                              // Draw the Sun
 | 
						|
                rlPopMatrix();
 | 
						|
                
 | 
						|
                rlPushMatrix();
 | 
						|
                    rlRotatef(earthOrbitRotation, 0.0f, 1.0f, 0.0f);    // Rotation for Earth orbit around Sun
 | 
						|
                    rlTranslatef(earthOrbitRadius, 0.0f, 0.0f);         // Translation for Earth orbit
 | 
						|
                    rlRotatef(-earthOrbitRotation, 0.0f, 1.0f, 0.0f);   // Rotation for Earth orbit around Sun inverted
 | 
						|
 | 
						|
                    rlPushMatrix();
 | 
						|
                        rlRotatef(earthRotation, 0.25, 1.0, 0.0);       // Rotation for Earth itself
 | 
						|
                        rlScalef(earthRadius, earthRadius, earthRadius);// Scale Earth
 | 
						|
                        
 | 
						|
                        DrawSphereBasic(BLUE);                          // Draw the Earth
 | 
						|
                    rlPopMatrix();
 | 
						|
                    
 | 
						|
                    rlRotatef(moonOrbitRotation, 0.0f, 1.0f, 0.0f);     // Rotation for Moon orbit around Earth
 | 
						|
                    rlTranslatef(moonOrbitRadius, 0.0f, 0.0f);          // Translation for Moon orbit
 | 
						|
                    rlRotatef(-moonOrbitRotation, 0.0f, 1.0f, 0.0f);    // Rotation for Moon orbit around Earth inverted
 | 
						|
                    rlRotatef(moonRotation, 0.0f, 1.0f, 0.0f);          // Rotation for Moon itself
 | 
						|
                    rlScalef(moonRadius, moonRadius, moonRadius);       // Scale Moon
 | 
						|
                    
 | 
						|
                    DrawSphereBasic(LIGHTGRAY);                         // Draw the Moon
 | 
						|
                rlPopMatrix();
 | 
						|
                
 | 
						|
                // Some reference elements (not affected by previous matrix transformations)
 | 
						|
                DrawCircle3D((Vector3){ 0.0f, 0.0f, 0.0f }, earthOrbitRadius, (Vector3){ 1, 0, 0 }, 90.0f, Fade(RED, 0.5f));
 | 
						|
                DrawGrid(20, 1.0f);
 | 
						|
 | 
						|
            EndMode3D();
 | 
						|
 | 
						|
            DrawText("EARTH ORBITING AROUND THE SUN!", 400, 10, 20, MAROON);
 | 
						|
            DrawFPS(10, 10);
 | 
						|
 | 
						|
        EndDrawing();
 | 
						|
        //----------------------------------------------------------------------------------
 | 
						|
    }
 | 
						|
 | 
						|
    // De-Initialization
 | 
						|
    //--------------------------------------------------------------------------------------
 | 
						|
    CloseWindow();        // Close window and OpenGL context
 | 
						|
    //--------------------------------------------------------------------------------------
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
//--------------------------------------------------------------------------------------------
 | 
						|
// Module Functions Definitions (local)
 | 
						|
//--------------------------------------------------------------------------------------------
 | 
						|
 | 
						|
// Draw sphere without any matrix transformation
 | 
						|
// NOTE: Sphere is drawn in world position ( 0, 0, 0 ) with radius 1.0f
 | 
						|
void DrawSphereBasic(Color color)
 | 
						|
{
 | 
						|
    int rings = 16;
 | 
						|
    int slices = 16;
 | 
						|
    
 | 
						|
    rlBegin(RL_TRIANGLES);
 | 
						|
        rlColor4ub(color.r, color.g, color.b, color.a);
 | 
						|
 | 
						|
        for (int i = 0; i < (rings + 2); i++)
 | 
						|
        {
 | 
						|
            for (int j = 0; j < slices; j++)
 | 
						|
            {
 | 
						|
                rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*i))*sinf(DEG2RAD*(j*360/slices)),
 | 
						|
                           sinf(DEG2RAD*(270+(180/(rings + 1))*i)),
 | 
						|
                           cosf(DEG2RAD*(270+(180/(rings + 1))*i))*cosf(DEG2RAD*(j*360/slices)));
 | 
						|
                rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*sinf(DEG2RAD*((j+1)*360/slices)),
 | 
						|
                           sinf(DEG2RAD*(270+(180/(rings + 1))*(i+1))),
 | 
						|
                           cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*cosf(DEG2RAD*((j+1)*360/slices)));
 | 
						|
                rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*sinf(DEG2RAD*(j*360/slices)),
 | 
						|
                           sinf(DEG2RAD*(270+(180/(rings + 1))*(i+1))),
 | 
						|
                           cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*cosf(DEG2RAD*(j*360/slices)));
 | 
						|
 | 
						|
                rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*i))*sinf(DEG2RAD*(j*360/slices)),
 | 
						|
                           sinf(DEG2RAD*(270+(180/(rings + 1))*i)),
 | 
						|
                           cosf(DEG2RAD*(270+(180/(rings + 1))*i))*cosf(DEG2RAD*(j*360/slices)));
 | 
						|
                rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*(i)))*sinf(DEG2RAD*((j+1)*360/slices)),
 | 
						|
                           sinf(DEG2RAD*(270+(180/(rings + 1))*(i))),
 | 
						|
                           cosf(DEG2RAD*(270+(180/(rings + 1))*(i)))*cosf(DEG2RAD*((j+1)*360/slices)));
 | 
						|
                rlVertex3f(cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*sinf(DEG2RAD*((j+1)*360/slices)),
 | 
						|
                           sinf(DEG2RAD*(270+(180/(rings + 1))*(i+1))),
 | 
						|
                           cosf(DEG2RAD*(270+(180/(rings + 1))*(i+1)))*cosf(DEG2RAD*((j+1)*360/slices)));
 | 
						|
            }
 | 
						|
        }
 | 
						|
    rlEnd();
 | 
						|
}
 |