|
|
|
|
@ -1,9 +1,11 @@
|
|
|
|
|
|
|
|
|
|
#include <SDL2/SDL.h> |
|
|
|
|
#include <glm/glm.hpp> |
|
|
|
|
|
|
|
|
|
#include "camera.h" |
|
|
|
|
#include "dumbLog.h" |
|
|
|
|
#include "renderer.h" |
|
|
|
|
#include "mesh.h" |
|
|
|
|
#include "entity.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef void (*frame_callback_fn) (render_state*); |
|
|
|
|
@ -14,8 +16,9 @@ doFrameCallback(render_state* rs)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
doRenderLoop(render_state* rs, frame_callback_fn callback_fn) |
|
|
|
|
doRenderLoop(render_state* rs, frame_callback_fn callback_fn, Entity* entities, uint entity_count) |
|
|
|
|
{ |
|
|
|
|
// TODO: move frame delay to renderFrame()
|
|
|
|
|
const uint TARGET_FPS = 60; |
|
|
|
|
const uint FRAME_DELAY = 1000 / TARGET_FPS; |
|
|
|
|
uint frameStart, frameTime; |
|
|
|
|
@ -25,6 +28,7 @@ doRenderLoop(render_state* rs, frame_callback_fn callback_fn)
|
|
|
|
|
while (running) { |
|
|
|
|
frameStart = SDL_GetTicks(); |
|
|
|
|
|
|
|
|
|
// TODO: add a better structure for input, and provide a callback to use here
|
|
|
|
|
while (SDL_PollEvent(&e)) { |
|
|
|
|
if ((e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) |
|
|
|
|
|| e.type == SDL_QUIT) { |
|
|
|
|
@ -33,7 +37,8 @@ doRenderLoop(render_state* rs, frame_callback_fn callback_fn)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
callback_fn(rs); |
|
|
|
|
renRenderFrame(rs, nullptr, 0); |
|
|
|
|
// TODO: entity pointer and entity count should be stored somewhere on the render_state object
|
|
|
|
|
renRenderFrame(rs, entities, entity_count); |
|
|
|
|
SDL_GL_SwapWindow(rs->handles.window); |
|
|
|
|
frameTime = SDL_GetTicks() - frameStart; |
|
|
|
|
|
|
|
|
|
@ -46,15 +51,34 @@ int
|
|
|
|
|
main() |
|
|
|
|
{ |
|
|
|
|
render_state* rs = renInit(); |
|
|
|
|
|
|
|
|
|
meInitAssimp(); |
|
|
|
|
meMeshGroup mg; |
|
|
|
|
|
|
|
|
|
if (meLoadFromFile(mg, "../data", "../data/spaceship.glb")) { |
|
|
|
|
doRenderLoop(rs, doFrameCallback); |
|
|
|
|
// TODO: entInit() doesn't allocate memory because we want to do the allocation in
|
|
|
|
|
// one big block, but this is really clunky to use
|
|
|
|
|
Entity spaceship; |
|
|
|
|
|
|
|
|
|
// TODO: this should be handled in entInit
|
|
|
|
|
// TODO: utilCopyCStr() can fail, and returns false
|
|
|
|
|
utilCopyCStr(spaceship.model_filename, "../data/spaceship.glb", 256); |
|
|
|
|
entSetWorldPosition(spaceship, 0, 0, 0); |
|
|
|
|
|
|
|
|
|
// set entity scale, rotation, world_transform to defaults :( ...
|
|
|
|
|
|
|
|
|
|
// need to finish loading binary texture data in mesh::loadDiffuseTexture()
|
|
|
|
|
|
|
|
|
|
// setup camera
|
|
|
|
|
glm::vec3 cam_pos(0, -100, 100); |
|
|
|
|
cameraInitPerspective(rs->cam, cam_pos, spaceship.translation, rs->cam.world_up); |
|
|
|
|
|
|
|
|
|
if (entInit(spaceship, "../data", rs->default_shader)) { |
|
|
|
|
doRenderLoop(rs, doFrameCallback, &spaceship, 1); |
|
|
|
|
} else { |
|
|
|
|
LOG(Error) << "Error loading mesh, exiting\n"; |
|
|
|
|
LOG(Error) << "Error initializing entity, exiting\n"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: way more cleanup to do :(, see hexgame::cleanUp()
|
|
|
|
|
meShutdownAssimp(); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|