mirror of
				https://github.com/raysan5/raylib.git
				synced 2025-11-04 09:44:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			173 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*******************************************************************************************
 | 
						|
*
 | 
						|
*   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();
 | 
						|
}
 |