瀏覽代碼

Support rlPushMatrix() and rlPopMatrix() on mesh drawing

Ray 5 年之前
父節點
當前提交
97abaff4c5
共有 2 個文件被更改,包括 51 次插入85 次删除
  1. 48 79
      examples/models/models_solar_system.c
  2. 3 6
      src/rlgl.h

+ 48 - 79
examples/models/models_solar_system.c

@@ -13,6 +13,7 @@
 #include "rlgl.h"
 
 #define MAX_BODY_CHILDREN 10
+
 float rotationSpeed = 0.2;
 
 // A celestial body that has children bodies orbiting around
@@ -37,7 +38,7 @@ typedef struct Body {
 Body CreateBody(float radius, float orbitRadius, float orbitPeriod, const char *label, const char *texture); // Initializes a new Body with the given parameters
 void AddBodyChildren(Body *parent, Body *children); // Add a children body to the parent body
 void DrawBody(Body *body, Camera *camera);          // Draw body and its children, updating labelPosition
-void DrawLabels(Body *body);                        // Draw body label and its children labels
+void DrawBodyLabel(Body *body);                        // Draw body label and its children labels
 
 //------------------------------------------------------------------------------------
 // Program main entry point
@@ -46,19 +47,14 @@ int main(void)
 {
     // Initialization
     //--------------------------------------------------------------------------------------
-    const int screenWidth = 1024;
-    const int screenHeight = 768;
-    const char *text;
-    bool gridEnabled = true;
-    bool helpEnabled = false;
-    bool labelEnabled = true;
-    bool cameraParametersEnabled = true;
+    const int screenWidth = 800;
+    const int screenHeight = 450;
 
     InitWindow(screenWidth, screenHeight, "raylib [models] example - solar system");
 
     // Define the camera to look into our 3d world
     Camera camera = { 0 };
-    camera.position = (Vector3){ 16.0f, 16.0f, 16.0f };
+    camera.position = (Vector3){ 20.0f, 12.0f, 20.0f };
     camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
     camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
     camera.fovy = 45.0f;
@@ -66,12 +62,9 @@ int main(void)
 
     SetCameraMode(camera, CAMERA_FREE);
 
-    SetTargetFPS(60);                   // Set our game to run at 60 frames-per-second
-    //--------------------------------------------------------------------------------------
-
     // Create Bodies
     Body sun        = CreateBody(0.2,     0.0,     0, "sun",      "2k_sun");
-    Body moon       = CreateBody(0.05,  0.200,    24, "moon",     "2k_moon");
+    Body moon       = CreateBody(0.02,  0.200,    24, "moon",     "2k_moon");
     Body mercury    = CreateBody(0.05,  0.396,    90, "mercury",  "2k_mercury");
     Body venus      = CreateBody(0.05,  0.723,   210, "venus",    "2k_venus_atmosphere");
     Body earth      = CreateBody(0.05,  1.000,   365, "earth",    "2k_earth_daymap");
@@ -83,9 +76,9 @@ int main(void)
     Body pluto      = CreateBody(0.05, 39.463, 89310, "pluto",    "2k_eris_fictional");
 
     AddBodyChildren(&sun, &mercury);
-    // AddBodyChildren(&sun, &venus);
+    AddBodyChildren(&sun, &venus);
     AddBodyChildren(&sun, &earth);
-    // AddBodyChildren(&sun, &mars);
+    AddBodyChildren(&sun, &mars);
     // AddBodyChildren(&sun, &jupiter);
     // AddBodyChildren(&sun, &saturn);
     // AddBodyChildren(&sun, &uranus);
@@ -94,6 +87,12 @@ int main(void)
 
     AddBodyChildren(&earth, &moon);
 
+    bool showHelpMenu = false;
+    bool showBodyLabels = true;
+
+    SetTargetFPS(60);                   // Set our game to run at 60 frames-per-second
+    //--------------------------------------------------------------------------------------
+
     // Main game loop
     while (!WindowShouldClose())        // Detect window close button or ESC key
     {
@@ -101,29 +100,12 @@ int main(void)
         //----------------------------------------------------------------------------------
         UpdateCamera(&camera);
 
-        if (IsKeyPressed(KEY_G)) {
-          gridEnabled = !gridEnabled;
-        }
-
-        if (IsKeyPressed(KEY_H)) {
-            helpEnabled = !helpEnabled;
-        }
-
-        if (IsKeyPressed(KEY_L)) {
-            labelEnabled = !labelEnabled;
-        }
-
-        if (IsKeyPressed(KEY_P)) {
-          cameraParametersEnabled = !cameraParametersEnabled;
-        }
+        if (IsKeyPressed(KEY_H)) showHelpMenu = !showHelpMenu;
+        if (IsKeyPressed(KEY_L)) showBodyLabels = !showBodyLabels;
 
-        if (IsKeyPressed(KEY_LEFT)) {
-            rotationSpeed -= 0.1;
-        }
-
-        if (IsKeyPressed(KEY_RIGHT)) {
-            rotationSpeed += 0.1;
-        }
+        if (IsKeyPressed(KEY_LEFT)) rotationSpeed -= 0.1;
+        if (IsKeyPressed(KEY_RIGHT)) rotationSpeed += 0.1;
+        //----------------------------------------------------------------------------------
 
         // Draw
         //----------------------------------------------------------------------------------
@@ -133,36 +115,18 @@ int main(void)
 
             BeginMode3D(camera);
 
+                // NOTE: DrawBody calls recusively body childrens
                 DrawBody(&sun, &camera);
 
-                // Some reference elements (not affected by previous matrix transformations)
-                if (gridEnabled) {
-                  DrawGrid(80, 1.0f);
-                }
-
             EndMode3D();
 
-            if (labelEnabled) {
-                DrawLabels(&sun);
-            }
-
-            DrawText("FULL SOLAR SYSTEM", 400, 10, 20, YELLOW);
-            text = FormatText("SPEED: %2.2f", rotationSpeed);
-            DrawText(text, 1024 / 2 - MeasureText(text, 20) / 2, 30, 20, YELLOW);
-
-            if (cameraParametersEnabled) {
-                text = FormatText("Camera\nposition: [%3.3f, %3.3f, %3.3f]\ntarget: [%3.3f, %3.3f, %3.3f]\nup: [%3.3f, %3.3f, %3.3f]",
-                                    camera.position.x, camera.position.y, camera.position.z,
-                                    camera.target.x, camera.target.y, camera.target.z,
-                                    camera.up.x, camera.up.y, camera.up.z);
-                DrawText(text, 10, 50, 20, YELLOW);
-            }
-
-            if (helpEnabled) {
-                DrawText("Keys:\n- [g] toggle grid\n- [h] toggle help\n- [l] toggle labels\n- [p] toggle camera parameters\n- [left/right arrows] increase/decrease speed by 0.1", 200, 200, 20, YELLOW);
-            } else {
-                DrawText("press [h] for help", 1016 - MeasureText("press [h] for help", 20), 740, 20, YELLOW);
-            }
+            if (showBodyLabels) DrawBodyLabel(&sun);
+
+            DrawText(FormatText("FULL SOLAR SYSTEM - SPEED: %2.2f", rotationSpeed), 120, 10, 20, LIME);
+
+            if (showHelpMenu) DrawText("- [h] Toggle help\n- [l] Toggle labels\n- [left/right arrows] Increase/decrease rotation speed", 10, 40, 10, GREEN);
+            else DrawText("Press [h] for help", 10, 40, 10, GREEN);
+            
             DrawFPS(10, 10);
 
         EndDrawing();
@@ -184,8 +148,8 @@ int main(void)
 // Creates a new body
 Body CreateBody(float radius, float orbitRadius, float orbitPeriod, const char *label, const char *texture_name)
 {
-    Body body;
-    Texture2D texture = LoadTexture(FormatText("resources/solar_system/%s.png", texture_name));
+    Body body = { 0 };
+    Texture2D texture = LoadTexture(FormatText("resources/solar_system/%s.png", texture_name)); // GenImageCellular()
 
     GenTextureMipmaps(&texture);
 
@@ -193,17 +157,19 @@ Body CreateBody(float radius, float orbitRadius, float orbitPeriod, const char *
     body.radius = radius * 10;
     body.orbitRadius = orbitRadius * 10;
     body.orbitPeriod = orbitPeriod;
-    body.model = LoadModel("resources/solar_system/sphere.obj");
+    body.model = LoadModel("resources/solar_system/sphere.obj");    // GenMeshSphere()
     body.model.materials[0].maps[MAP_DIFFUSE].texture = texture;
     body.childrenCount = 0;
     body.orbitPosition = 0.0;
+    
     return body;
 }
 
-void AddBodyChildren(Body *parent, Body *children) {
-    if (parent->childrenCount >= MAX_BODY_CHILDREN) {
-        TraceLog(LOG_ERROR, "BODY HAS TOO MANY CHILDREN");
-    } else {
+void AddBodyChildren(Body *parent, Body *children) 
+{
+    if (parent->childrenCount >= MAX_BODY_CHILDREN) TraceLog(LOG_ERROR, "ERROR: Body has too many children!");
+    else
+    {
         parent->children[parent->childrenCount] = children;
         parent->childrenCount++;
     }
@@ -212,13 +178,16 @@ void AddBodyChildren(Body *parent, Body *children) {
 // Draw body and its children
 void DrawBody(Body *body, Camera *camera)
 {
-    DrawModel(body->model, (Vector3) { 0.0f, 0.0f, 0.0f}, body->radius, WHITE);
+    DrawModel(body->model, (Vector3){ 0.0f, 0.0f, 0.0f}, body->radius, WHITE);
 
-    body->labelPosition = GetWorldToScreen((Vector3) { body->orbitRadius, body->radius, 0.0 }, *camera);
+    // TODO: labelPosition is not transformed to drawing position
+    body->labelPosition = GetWorldToScreen((Vector3){ body->orbitRadius, body->radius, 0.0 }, *camera);
 
-    for (int i = 0; i < body->childrenCount; i++) {
+    for (int i = 0; i < body->childrenCount; i++) 
+    {
         Body *child = body->children[i];
-        child->orbitPosition += rotationSpeed * 360 / child->orbitPeriod;
+        child->orbitPosition += rotationSpeed*360/child->orbitPeriod;
+        
         rlPushMatrix();
             rlRotatef(child->orbitPosition, 0.0, 1.0, 0.0);
             rlTranslatef(child->orbitRadius, 0.0, 0.0);
@@ -232,13 +201,13 @@ void DrawBody(Body *body, Camera *camera)
 }
 
 // Draw body label and its children labels
-void DrawLabels(Body *body)
+void DrawBodyLabel(Body *body)
 {
-    DrawText(body->label, body->labelPosition.x - MeasureText(body->label, 20) / 2, body->labelPosition.y, 20, WHITE);
+    DrawText(body->label, body->labelPosition.x - MeasureText(body->label, 20)/2, body->labelPosition.y, 20, WHITE);
 
-    for (int i = 0; i < body->childrenCount; i++) {
+    for (int i = 0; i < body->childrenCount; i++)
+    {
         Body *child = body->children[i];
-
-        DrawLabels(child);
+        DrawBodyLabel(child);
     }
 }

+ 3 - 6
src/rlgl.h

@@ -2664,16 +2664,13 @@ void rlDrawMesh(Mesh mesh, Material material, Matrix transform)
     Matrix matView = modelview;         // View matrix (camera)
     Matrix matProjection = projection;  // Projection matrix (perspective)
 
-    // TODO: Matrix nightmare! Trying to combine stack matrices with view matrix and local model transform matrix..
-    // There is some problem in the order matrices are multiplied... it requires some time to figure out...
-    Matrix matStackTransform = MatrixIdentity();
-
     // TODO: Consider possible transform matrices in the stack
     // Is this the right order? or should we start with the first stored matrix instead of the last one?
+    //Matrix matStackTransform = MatrixIdentity();
     //for (int i = stackCounter; i > 0; i--) matStackTransform = MatrixMultiply(stack[i], matStackTransform);
 
-    Matrix matModel = MatrixMultiply(transform, matStackTransform); // Apply local model transformation
-    Matrix matModelView = MatrixMultiply(matModel, matView);        // Transform to camera-space coordinates
+    // Transform to camera-space coordinates
+    Matrix matModelView = MatrixMultiply(transform, MatrixMultiply(transformMatrix, matView));
     //-----------------------------------------------------
 
     // Bind active texture maps (if available)