]> git.lizzy.rs Git - shadowclad.git/commitdiff
Finish moving to scene tree implementation; clean up unused code
authoroutfrost <kotlet.bahn@gmail.com>
Tue, 26 May 2020 23:10:23 +0000 (01:10 +0200)
committeroutfrost <kotlet.bahn@gmail.com>
Tue, 26 May 2020 23:10:23 +0000 (01:10 +0200)
src/engine/render.c
src/engine/render.h
src/engine/scene.c
src/engine/scene.h
src/game/level.c
src/game/level.h
src/game/player.c
src/game/player.h
src/main.c

index 3b88d44274ab05ec001010a36b0fc1906bfacdc0..a26cfab5206219f04cc1a3b29f83314467d9319d 100644 (file)
@@ -1,23 +1,22 @@
 #include <GL/glut.h>
 #include <stdbool.h>
 
-#include "game/level.h"
-#include "game/player.h"
-
 #include "geometry.h"
 #include "performance.h"
 #include "scene.h"
 
-const float AXIS_RADIUS = 5.0f;
+float viewportAspectRatio = 1.0f;
+const Scene* cameraAnchor;
+
+static const float AXIS_RADIUS = 5.0f;
 
+static void renderScene(const Scene*);
 static void setupCamera();
-static void moveCameraTo(const Vector3D pos);
+static void moveCameraTo(const Scene* scene);
 static void drawAxes();
-static void renderBlockGrid(const BlockGrid grid);
-static void renderCharacter(const Character* character, const Vector3D pos);
 static void drawSolid(const Solid* solid);
 
-float viewportAspectRatio = 1.0f;
+
 
 void initRender() {
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
@@ -37,29 +36,25 @@ void initRender() {
        glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.005f);
 }
 
-
-
-void renderSceneNew(const Scene*);
-
 void renderFrame() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-       
+
        glEnable(GL_NORMALIZE);
        glEnable(GL_CULL_FACE);
        glEnable(GL_DEPTH_TEST);
-       
+
        setupCamera();
-       moveCameraTo(playerPos);
-       
-       renderSceneNew(currentScene);
-       
+       moveCameraTo(cameraAnchor);
+
+       renderScene(currentScene);
+
        glFlush();
        glutSwapBuffers();
        frameRendered();
        glutPostRedisplay();
 }
 
-void renderSceneNew(const Scene* scene) {
+void renderScene(const Scene* scene) {
        if (!scene) {
                return;
        }
@@ -80,39 +75,10 @@ void renderSceneNew(const Scene* scene) {
        }
 
        for (size_t i = 0; i < scene->numChildren; ++i) {
-               renderSceneNew(scene->children[i]);
+               renderScene(scene->children[i]);
        }
 }
 
-
-
-void renderScene() {
-       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-       
-       glEnable(GL_NORMALIZE);
-       glEnable(GL_CULL_FACE);
-       glEnable(GL_DEPTH_TEST);
-       
-       setupCamera();
-       moveCameraTo(playerPos);
-       
-       glDisable(GL_LIGHTING);
-       drawAxes();
-       glEnable(GL_LIGHTING);
-       
-       glEnable(GL_LIGHT0);
-       glEnable(GL_TEXTURE_2D);
-       renderBlockGrid(levelGrid);
-       renderCharacter(&playerCharacter, playerPos);
-       glDisable(GL_TEXTURE_2D);
-       glDisable(GL_LIGHT0);
-       
-       glFlush();
-       glutSwapBuffers();
-       frameRendered();
-       glutPostRedisplay();
-}
-
 static void setupCamera() {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
@@ -126,8 +92,10 @@ static void setupCamera() {
        glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
 }
 
-static void moveCameraTo(const Vector3D pos) {
+static void moveCameraTo(const Scene* anchor) {
        glMatrixMode(GL_PROJECTION);
+       // TODO This needs to account for parent nodes as well
+       Vector3D pos = translationOf(anchor->transform);
        glTranslatef(-pos.x, -pos.y, -pos.z);
 }
 
@@ -153,26 +121,6 @@ static void drawAxes() {
        glEnd();
 }
 
-static void renderBlockGrid(const BlockGrid grid) {
-       glMatrixMode(GL_MODELVIEW);
-       for (size_t z = 0; z < grid.depth; ++z) {
-               glLoadIdentity();
-               glTranslatef(0.0f, 0.0f, z * BLOCKGRID_CELL_SIZE);
-               for (size_t x = 0; x < grid.width; ++x) {
-                       drawSolid(getBlockFromGrid(grid, x, z)->solid);
-                       glTranslatef(BLOCKGRID_CELL_SIZE, 0.0f, 0.0f);
-               }
-       }
-       glLoadIdentity();
-}
-
-static void renderCharacter(const Character* character, const Vector3D pos) {
-       glMatrixMode(GL_MODELVIEW);
-       glTranslatef(pos.x, pos.y, pos.z);
-       drawSolid(character->solid);
-       glLoadIdentity();
-}
-
 static void drawSolid(const Solid* solid) {
        if (solid == NULL) {
                return;
index 2aea8827c032992d8a580696abfb52bd0623c3de..df18281a2be1301b254438e1024973b9a68fafa0 100644 (file)
@@ -4,9 +4,9 @@
 #include "scene.h"
 
 float viewportAspectRatio;
+const Scene* cameraAnchor;
 
 void initRender();
 void renderFrame();
-void renderScene();
 
 #endif
index e1a4cee5f5c39101168ccf98e665f43266d769d2..5cbe4052a091948a09479a8f0430010f515d0d4a 100644 (file)
@@ -6,10 +6,14 @@
 
 Scene* currentScene = NULL;
 
-static Transform identity = { .a1 = 1.0f, .a2 = 0.0f, .a3 = 0.0f, .a4 = 0.0f,
-                              .b1 = 0.0f, .b2 = 1.0f, .b3 = 0.0f, .b4 = 0.0f,
-                              .c1 = 0.0f, .c2 = 0.0f, .c3 = 1.0f, .c4 = 0.0f,
-                              .d1 = 0.0f, .d2 = 0.0f, .d3 = 0.0f, .d4 = 1.0f };
+
+
+Transform identity() {
+       return (Transform) { .a1 = 1.0f, .a2 = 0.0f, .a3 = 0.0f, .a4 = 0.0f,
+                            .b1 = 0.0f, .b2 = 1.0f, .b3 = 0.0f, .b4 = 0.0f,
+                            .c1 = 0.0f, .c2 = 0.0f, .c3 = 1.0f, .c4 = 0.0f,
+                            .d1 = 0.0f, .d2 = 0.0f, .d3 = 0.0f, .d4 = 1.0f };
+}
 
 void multiply(Transform* transform, Transform by) {
        GLfloat* a = (GLfloat*) &by;
@@ -33,12 +37,16 @@ void translate(Transform* transform, Vector3D vec) {
                                       .d1 = 0.0f, .d2 = 0.0f, .d3 = 0.0f, .d4 = 1.0f });
 }
 
+Vector3D translationOf(Transform transform) {
+       return (Vector3D) { transform.a4, transform.b4, transform.c4 };
+}
+
 Scene* newScene() {
        Scene* scene = malloc(sizeof(Scene));
        *scene = (Scene) { .parent = NULL,
                           .numChildren = 0u,
                           .children = NULL,
-                          .transform = identity,
+                          .transform = identity(),
                           .solid = NULL };
        return scene;
 }
@@ -61,3 +69,34 @@ void insertChildScene(Scene* scene, Scene* newChild) {
 
        newChild->parent = scene;
 }
+
+void reparentScene(Scene* scene, Scene* newParent) {
+       if (!scene) {
+               return;
+       }
+
+       if (scene->parent) {
+               Scene* parent = scene->parent;
+               size_t indexInParent = parent->numChildren;
+               for (size_t i = 0; i < parent->numChildren; ++i) {
+                       if (parent->children[i] == scene) {
+                               indexInParent = i;
+                               break;
+                       }
+               }
+               // This includes the hopefully impossible case where parent->numChildren == 0
+               if (indexInParent == parent->numChildren) {
+                       logError("Scene %p not found in children of parent %p", scene, parent);
+               }
+               else {
+                       for (size_t i = indexInParent; i < parent->numChildren - 1; ++i) {
+                               parent->children[i] = parent->children[i + 1];
+                       }
+                       parent->children = realloc(parent->children, --(parent->numChildren) * sizeof(Scene*));
+               }
+       }
+
+       scene->parent = NULL;
+
+       insertChildScene(newParent, scene);
+}
index 1abc11cdda89e46f2b33c0fe219a4a55dd5d02dc..24b308a1a90436667b92b4e5030886a7c951cd79 100644 (file)
@@ -23,8 +23,12 @@ struct Scene {
 
 Scene* currentScene;
 
+Transform identity();
 void translate(Transform* transform, Vector3D vec);
+Vector3D translationOf(Transform transform);
+
 Scene* newScene();
 void insertChildScene(Scene* scene, Scene* newChild);
+void reparentScene(Scene* scene, Scene* newParent);
 
 #endif // SCENE_H_
index 0dd1d6146ee20416bc159faf3a5bfcc26c4d57cf..ad1158e44d4b63d08e021ebfd4f4bd725ed0e541 100644 (file)
@@ -7,31 +7,29 @@
 #include "level.h"
 #include "player.h"
 
+BlockGrid levelGrid;
+
 static Block blockEmpty = { .type = BLOCKTYPE_SPACE,
                             .solid = NULL };
 static Block blockWall01 = { .type = BLOCKTYPE_OBSTACLE,
                              .solid = NULL };
 
-static Block* testBlocks[9] = { &blockWall01, &blockWall01, &blockWall01,
-                                &blockEmpty, &blockEmpty, &blockEmpty,
-                                &blockWall01, &blockEmpty, &blockWall01 };
-
-BlockGrid levelGrid = { .width = 3,
-                        .depth = 3,
-                        .blocks = testBlocks };
-
-#define DEFAULT_PLAYER_SPAWN_POS { -BLOCKGRID_CELL_SIZE, 0.0f, -BLOCKGRID_CELL_SIZE }
-Vector3D playerSpawnPos = DEFAULT_PLAYER_SPAWN_POS;
+static Transform playerSpawnTransform;
 
 
 
 void initLevel() {
+       playerSpawnTransform = identity();
+       translate(&playerSpawnTransform, (Vector3D) { .x = -BLOCKGRID_CELL_SIZE,
+                                                     .y = 0.0f,
+                                                     .z = -BLOCKGRID_CELL_SIZE });
+
        blockWall01.solid = importSolid("assets/wall01.3ds");
-       
+
        buildLevelFromImage(readTga("assets/level01.tga"));
-       
+
        Scene* levelScene = newScene();
-       
+
        for (size_t z = 0; z < levelGrid.depth; ++z) {
                for (size_t x = 0; x < levelGrid.width; ++x) {
                        Scene* blockScene = newScene();
@@ -46,6 +44,10 @@ void initLevel() {
        currentScene = levelScene;
 }
 
+void startLevel() {
+       spawnPlayer(playerSpawnTransform);
+}
+
 void buildLevelFromImage(TgaImage* image) {
        if (image == NULL) {
                logError("Null image received, cannot build level");
@@ -62,7 +64,6 @@ void buildLevelFromImage(TgaImage* image) {
                              .blocks = malloc(image->header.imageWidth
                                               * image->header.imageHeight
                                               * sizeof(Block*)) };
-       playerSpawnPos = (Vector3D) DEFAULT_PLAYER_SPAWN_POS;
        
        for (size_t row = 0; row < newGrid.depth; ++row) {
                for (size_t x = 0; x < newGrid.width; ++x) {
@@ -77,7 +78,10 @@ void buildLevelFromImage(TgaImage* image) {
                                        break;
                                case 0xFF00FFFF:
                                        block = &blockEmpty;
-                                       playerSpawnPos = (Vector3D) { x * BLOCKGRID_CELL_SIZE, 0.0f, z * BLOCKGRID_CELL_SIZE };
+                                       playerSpawnTransform = identity();
+                                       translate(&playerSpawnTransform, (Vector3D) { .x = x * BLOCKGRID_CELL_SIZE,
+                                                                                     .y = 0.0f,
+                                                                                     .z = z * BLOCKGRID_CELL_SIZE });
                                        break;
                                default:
                                        block = &blockEmpty;
@@ -88,5 +92,4 @@ void buildLevelFromImage(TgaImage* image) {
        }
        
        levelGrid = newGrid;
-       spawnPlayer();
 }
index ccde120b00710f95432cd5d05d397f365b264435..4795d5de7d7819544c391ecf33604d85cec6965e 100644 (file)
@@ -27,9 +27,9 @@ typedef struct {
 #define BLOCKGRID_CELL_SIZE 2.5f
 
 BlockGrid levelGrid;
-Vector3D playerSpawnPos;
 
 void initLevel();
+void startLevel();
 void buildLevelFromImage(TgaImage* image);
 
 static inline Block* getBlockFromGrid(BlockGrid grid, size_t x, size_t z) {
index 6aafb2443f97d09dc456a285232f0eaf0cf95cab..144d0cfd4416486fc0a1d8e5649d2117f4601821 100644 (file)
@@ -1,16 +1,19 @@
-#include "engine/logger.h"
+#include "engine/asset.h"
+#include "engine/render.h"
 
-#include "level.h"
 #include "player.h"
 
-Character playerCharacter = { .solid = NULL };
+Scene* playerCharacter;
 
 
 
 void initPlayer() {
-       playerCharacter.solid = importSolid("assets/playercharacter.3ds");
+       playerCharacter = newScene();
+       cameraAnchor = playerCharacter;
+       playerCharacter->solid = importSolid("assets/playercharacter.3ds");
 }
 
-void spawnPlayer() {
-       playerPos = playerSpawnPos;
+void spawnPlayer(Transform transform) {
+       playerCharacter->transform = transform;
+       reparentScene(playerCharacter, currentScene);
 }
index aeeabc4efba70beacd440a7968fb2cd5539de193..9a7c25045f8e95a5d714fa6c1ae1c58b340c3010 100644 (file)
@@ -3,16 +3,12 @@
 
 #include <GL/gl.h>
 
-#include "engine/asset.h"
+#include "engine/geometry.h"
+#include "engine/scene.h"
 
-typedef struct {
-       const Solid* solid;
-} Character;
-
-Character playerCharacter;
-Vector3D playerPos;
+Scene* playerCharacter;
 
 void initPlayer();
-void spawnPlayer();
+void spawnPlayer(Transform transform);
 
 #endif
index ed887da3daab88899ad64e804d0c5b4c276d582e..fa9ed02453ac8c72864e6c1fcc2be6f653319cba 100644 (file)
@@ -62,6 +62,7 @@ int main(int argc, char** argv) {
        //initPerformanceMetering();
        initLevel();
        initPlayer();
+       startLevel();
        
        glutMainLoop();
        return 0;