From d46c2a98a3a44cc62b0110fea6ef1b8a12ba2305 Mon Sep 17 00:00:00 2001 From: outfrost Date: Thu, 14 Feb 2019 03:43:07 +0100 Subject: [PATCH] Render player character and make the camera follow it --- main.c | 1 + player.c | 5 +---- player.h | 5 ++++- render.c | 47 +++++++++++++++++++++++++++++++++++++++++------ render.h | 2 ++ ui.c | 16 +++------------- 6 files changed, 52 insertions(+), 24 deletions(-) diff --git a/main.c b/main.c index f054e3a..262860b 100644 --- a/main.c +++ b/main.c @@ -55,6 +55,7 @@ int main(int argc, char** argv) { initRender(); //initPerformanceMetering(); initLevel(); + initPlayer(); glutMainLoop(); return 0; diff --git a/player.c b/player.c index d81d78b..4e12613 100644 --- a/player.c +++ b/player.c @@ -2,15 +2,12 @@ #include "logger.h" #include "player.h" -PlayerCharacter playerCharacter = { .asset3D = NULL }; - -static Vector3D playerPos; +Character playerCharacter = { .asset3D = NULL }; void initPlayer() { playerCharacter.asset3D = importAsset("assets/playercharacter.3ds"); - // TODO import textures } void spawnPlayer() { diff --git a/player.h b/player.h index 9a0eb92..19898d5 100644 --- a/player.h +++ b/player.h @@ -7,7 +7,10 @@ typedef struct { const Asset3D* asset3D; -} PlayerCharacter; +} Character; + +Character playerCharacter; +Vector3D playerPos; void spawnPlayer(); diff --git a/render.c b/render.c index 05ab0c1..27190c6 100644 --- a/render.c +++ b/render.c @@ -3,13 +3,19 @@ #include "level.h" #include "performance.h" +#include "player.h" #include "typedefs.h" const float AXIS_RADIUS = 5.0f; +static void setupCamera(); +static void moveCameraTo(const Vector3D pos); static void drawAxes(); static void renderBlockGrid(const BlockGrid grid); -static void drawBlock(const Block* block); +static void renderCharacter(const Character* character, const Vector3D pos); +static void drawAsset3D(const Asset3D* asset3D); + +float viewportAspectRatio = 1.0f; @@ -33,12 +39,14 @@ void initRender() { void renderScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glLoadIdentity(); glEnable(GL_NORMALIZE); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); + setupCamera(); + moveCameraTo(playerPos); + glDisable(GL_LIGHTING); drawAxes(); glEnable(GL_LIGHTING); @@ -46,6 +54,7 @@ void renderScene() { glEnable(GL_LIGHT0); glEnable(GL_TEXTURE_2D); renderBlockGrid(levelGrid); + renderCharacter(&playerCharacter, playerPos); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHT0); @@ -55,7 +64,26 @@ void renderScene() { glutPostRedisplay(); } +static void setupCamera() { + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-16.0, + 16.0, + -16.0/viewportAspectRatio, + 16.0/viewportAspectRatio, + -128.0, + 128.0); + glRotatef(45.0f, 1.0f, 0.0f, 0.0f); + glRotatef(45.0f, 0.0f, 1.0f, 0.0f); +} + +static void moveCameraTo(const Vector3D pos) { + glMatrixMode(GL_PROJECTION); + glTranslatef(-pos.x, -pos.y, -pos.z); +} + static void drawAxes() { + glMatrixMode(GL_MODELVIEW); // X axis glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_LINES); @@ -82,21 +110,28 @@ static void renderBlockGrid(const BlockGrid grid) { glLoadIdentity(); glTranslatef(0.0f, 0.0f, z * BLOCKGRID_CELL_SIZE); for (int x = 0; x < grid.width; ++x) { - drawBlock(getBlockFromGrid(grid, x, z)); + drawAsset3D(getBlockFromGrid(grid, x, z)->asset3D); glTranslatef(BLOCKGRID_CELL_SIZE, 0.0f, 0.0f); } } glLoadIdentity(); } -static void drawBlock(const Block* block) { - if (block->asset3D == NULL) { +static void renderCharacter(const Character* character, const Vector3D pos) { + glMatrixMode(GL_MODELVIEW); + glTranslatef(pos.x, pos.y, pos.z); + drawAsset3D(character->asset3D); + glLoadIdentity(); +} + +static void drawAsset3D(const Asset3D* asset3D) { + if (asset3D == NULL) { return; } + glMatrixMode(GL_MODELVIEW); glColor3f(0.5f, 1.0f, 0.0f); - const Asset3D* asset3D = block->asset3D; for (int meshIndex = 0; meshIndex < asset3D->numMeshes; ++meshIndex) { const Mesh mesh = asset3D->meshes[meshIndex]; glBindTexture(GL_TEXTURE_2D, diff --git a/render.h b/render.h index e4c46d4..9251b16 100644 --- a/render.h +++ b/render.h @@ -1,6 +1,8 @@ #ifndef RENDER_H_ #define RENDER_H_ +float viewportAspectRatio; + void initRender(); void renderScene(); diff --git a/ui.c b/ui.c index 71effdb..a5b8b1e 100644 --- a/ui.c +++ b/ui.c @@ -1,22 +1,12 @@ #include +#include "render.h" + void resizeStage(GLsizei width, GLsizei height) { if (height == 0) height = 1; - // Set device viewport dimensions glViewport(0, 0, width, height); - // Switch to projection matrix - glMatrixMode(GL_PROJECTION); - // Reset the projection matrix - glLoadIdentity(); - - GLfloat aspectRatio = (GLfloat) width / (GLfloat) height; - - glOrtho(-8.0, 24.0, -16.0/aspectRatio, 16.0/aspectRatio, -128.0, 128.0); - - glRotatef(45.0f, 1.0f, 0.0f, 0.0f); - glRotatef(45.0f, 0.0f, 1.0f, 0.0f); - glMatrixMode(GL_MODELVIEW); + viewportAspectRatio = (float) width / (float) height; } -- 2.44.0