Various changes
- add release build - control framerate - fix bug that caused camera to shake - enable double-buffering and VSync
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
obj/*
|
obj/*
|
||||||
Game
|
Game
|
||||||
|
Release
|
||||||
*.xcf
|
*.xcf
|
||||||
|
|||||||
10
makefile
10
makefile
@@ -2,17 +2,19 @@ INC = include
|
|||||||
OBJ = obj
|
OBJ = obj
|
||||||
SRC = src
|
SRC = src
|
||||||
EXE = Game
|
EXE = Game
|
||||||
|
REL = Release
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -w -ggdb -I$(INC)
|
CFLAGS = -w -ggdb -I$(INC)
|
||||||
LIBS = -lGLEW -lGLU -lGL -lSDL2 -lcglm -lz -lm
|
LIBS = -lGLEW -lGLU -lGL -lSDL2 -lcglm -lz -lm
|
||||||
|
RELFLAGS = -O3 -s
|
||||||
|
|
||||||
OBJFILES := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(shell find $(SRC) -name '*.c'))
|
OBJFILES := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(shell find $(SRC) -name '*.c'))
|
||||||
OBJDIRS := $(patsubst $(SRC)%, $(OBJ)%, $(shell find $(SRC) -type d))
|
OBJDIRS := $(patsubst $(SRC)%, $(OBJ)%, $(shell find $(SRC) -type d))
|
||||||
CLEANDIRS := $(addsuffix /.clean, $(OBJDIRS));
|
CLEANDIRS := $(addsuffix /.clean, $(OBJDIRS));
|
||||||
|
|
||||||
# Explicit targets
|
# Explicit targets
|
||||||
.PHONY: all clean
|
.PHONY: all release clean
|
||||||
.DEFAULT_GOAL := all
|
.DEFAULT_GOAL := all
|
||||||
|
|
||||||
# Build executable
|
# Build executable
|
||||||
@@ -28,8 +30,12 @@ $(OBJ)/%.o: $(SRC)/%.c | $(OBJDIRS)
|
|||||||
$(OBJDIRS):
|
$(OBJDIRS):
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
|
|
||||||
|
release: $(REL)
|
||||||
|
$(REL): $(OBJFILES) | $(OBJDIRS)
|
||||||
|
$(CC) -o $@ $^ $(CFLAGS) $(LIBS) $(RELFLAGS)
|
||||||
|
|
||||||
# Delete previously built files
|
# Delete previously built files
|
||||||
clean: $(CLEANDIRS)
|
clean: $(CLEANDIRS)
|
||||||
rm -f $(EXE)
|
rm -f $(EXE) $(REL)
|
||||||
%.clean:
|
%.clean:
|
||||||
rm -f $**.o
|
rm -f $**.o
|
||||||
|
|||||||
21
src/game.c
21
src/game.c
@@ -18,6 +18,26 @@ GameState *Game_New()
|
|||||||
|
|
||||||
void Game_Update(GameState *gs)
|
void Game_Update(GameState *gs)
|
||||||
{
|
{
|
||||||
|
const int fps = 60;
|
||||||
|
uint64_t currentTicks = SDL_GetTicks64();
|
||||||
|
uint64_t targetTicks = gs->previousTicks + (1000 / fps);
|
||||||
|
int32_t waitTicks = targetTicks - currentTicks;
|
||||||
|
|
||||||
|
if (waitTicks > 0)
|
||||||
|
{
|
||||||
|
SDL_Delay(waitTicks);
|
||||||
|
currentTicks = SDL_GetTicks64();
|
||||||
|
}
|
||||||
|
else if (waitTicks <= -5)
|
||||||
|
{
|
||||||
|
printf("frame is late by %d ms\n", -waitTicks);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t delta = currentTicks - gs->previousTicks;
|
||||||
|
gs->previousTicks = currentTicks;
|
||||||
|
|
||||||
|
Camera_UpdateVectors(&gs->camera);
|
||||||
|
|
||||||
const float speed = 0.3f;
|
const float speed = 0.3f;
|
||||||
vec3 move, front, right;
|
vec3 move, front, right;
|
||||||
glm_vec3_zero(move);
|
glm_vec3_zero(move);
|
||||||
@@ -47,7 +67,6 @@ void Game_Update(GameState *gs)
|
|||||||
glm_vec3_add(target->position, displacement, gs->camera.position);
|
glm_vec3_add(target->position, displacement, gs->camera.position);
|
||||||
|
|
||||||
Camera_UpdateVectors(&gs->camera);
|
Camera_UpdateVectors(&gs->camera);
|
||||||
SDL_Delay(5);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game_Destroy(GameState *gs)
|
void Game_Destroy(GameState *gs)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include "SDL2/SDL.h"
|
#include "SDL2/SDL.h"
|
||||||
#include "cglm/cglm.h"
|
#include "cglm/cglm.h"
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
@@ -20,6 +21,7 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
bool running;
|
bool running;
|
||||||
|
uint64_t previousTicks;
|
||||||
InputState input;
|
InputState input;
|
||||||
SDL_Window *window;
|
SDL_Window *window;
|
||||||
SDL_GLContext *glContext;
|
SDL_GLContext *glContext;
|
||||||
|
|||||||
@@ -216,11 +216,15 @@ bool Render_Init(GameState *gs)
|
|||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
|
||||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5);
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5);
|
||||||
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
|
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
|
||||||
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||||
|
|
||||||
gs->window = SDL_CreateWindow("Sandbox", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1920, 1080, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);;
|
gs->window = SDL_CreateWindow("Sandbox", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1920, 1080, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);;
|
||||||
gs->glContext = SDL_GL_CreateContext(gs->window);
|
gs->glContext = SDL_GL_CreateContext(gs->window);
|
||||||
printf("Created OpenGL window.\n");
|
printf("Created OpenGL window.\n");
|
||||||
|
|
||||||
|
if (SDL_GL_SetSwapInterval(1) == 0) printf("Enabled VSync.\n");
|
||||||
|
else printf("Failed to enable VSync. SDL Error: %s\n", SDL_GetError());
|
||||||
|
|
||||||
glewInit();
|
glewInit();
|
||||||
gs->shaderProgramId = LoadShaders("./res/glsl/vertex.glsl", "./res/glsl/fragment.glsl");
|
gs->shaderProgramId = LoadShaders("./res/glsl/vertex.glsl", "./res/glsl/fragment.glsl");
|
||||||
gs->modelShaderProgramId = LoadShaders("./res/glsl/model_vertex.glsl", "./res/glsl/fragment.glsl");
|
gs->modelShaderProgramId = LoadShaders("./res/glsl/model_vertex.glsl", "./res/glsl/fragment.glsl");
|
||||||
|
|||||||
Reference in New Issue
Block a user