| 
								
							 | 
							
								/*******************************************************************************************
							 | 
						
						
						
							| 
								
							 | 
							
								*
							 | 
						
						
						
							| 
								
							 | 
							
								*   raylib [models] example - rlgl module usage with push/pop matrix transformations
							 | 
						
						
						
							| 
								
							 | 
							
								*
							 | 
						
						
						
							| 
								
							 | 
							
								*   NOTE: This example uses [rlgl] module functionality (pseudo-OpenGL 1.1 style coding)
							 | 
						
						
						
							| 
								
							 | 
							
								*
							 | 
						
						
						
							| 
								
							 | 
							
								*   Example originally created with raylib 2.5, last time updated with raylib 4.0
							 | 
						
						
						
							| 
								
							 | 
							
								*
							 | 
						
						
						
							| 
								
							 | 
							
								*   Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
							 | 
						
						
						
							| 
								
							 | 
							
								*   BSD-like license that allows static linking with closed source software
							 | 
						
						
						
							| 
								
							 | 
							
								*
							 | 
						
						
						
							| 
								
							 | 
							
								*   Copyright (c) 2018-2023 Ramon Santamaria (@raysan5)
							 | 
						
						
						
							| 
								
							 | 
							
								*
							 | 
						
						
						
							| 
								
							 | 
							
								********************************************************************************************/
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								#include "raylib.h"
							 | 
						
						
						
							| 
								
							 | 
							
								#include "rlgl.h"
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								#include <math.h>           // Required for: cosf(), sinf()
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								//------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								// Module Functions Declaration
							 | 
						
						
						
							| 
								
							 | 
							
								//------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								void DrawSphereBasic(Color color);      // Draw sphere without any matrix transformation
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								//------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								// Program main entry point
							 | 
						
						
						
							| 
								
							 | 
							
								//------------------------------------------------------------------------------------
							 | 
						
						
						
							| 
								
							 | 
							
								int main(void)
							 | 
						
						
						
							| 
								
							 | 
							
								{
							 | 
						
						
						
							| 
								
							 | 
							
								    // 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 position
							 | 
						
						
						
							| 
								
							 | 
							
								    camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };      // Camera looking at point
							 | 
						
						
						
							| 
								
							 | 
							
								    camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };          // Camera up vector (rotation towards target)
							 | 
						
						
						
							| 
								
							 | 
							
								    camera.fovy = 45.0f;                                // Camera field-of-view Y
							 | 
						
						
						
							| 
								
							 | 
							
								    camera.projection = CAMERA_PERSPECTIVE;             // Camera projection type
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								    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, CAMERA_ORBITAL);
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								        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
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								                    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(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;
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								    // Make sure there is enough space in the internal render batch
							 | 
						
						
						
							| 
								
							 | 
							
								    // buffer to store all required vertex, batch is reseted if required
							 | 
						
						
						
							| 
								
							 | 
							
								    rlCheckRenderBatchLimit((rings + 2)*slices*6);
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								    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();
							 | 
						
						
						
							| 
								
							 | 
							
								}
							 |