Browse Source

add renAllocateGroup()

testing
cinnaboot 6 years ago
parent
commit
6ca8cfff2b
  1. 34
      examples/assimp_loading/main.cpp
  2. 1
      include/entity.h
  3. 1
      include/render_object.h
  4. 11
      include/renderer.h
  5. 1
      include/shader_program.h
  6. 22
      src/entity.cpp
  7. 20
      src/renderer.cpp

34
examples/assimp_loading/main.cpp

@ -17,7 +17,7 @@ doFrameCallback(render_state* rs)
} }
void void
doRenderLoop(render_state* rs, frame_callback_fn callback_fn, entity* entities, uint entity_count) doRenderLoop(render_state* rs, frame_callback_fn callback_fn)
{ {
// TODO: move frame delay to renderFrame() // TODO: move frame delay to renderFrame()
const uint TARGET_FPS = 60; const uint TARGET_FPS = 60;
@ -29,7 +29,8 @@ doRenderLoop(render_state* rs, frame_callback_fn callback_fn, entity* entities,
while (running) { while (running) {
frameStart = SDL_GetTicks(); frameStart = SDL_GetTicks();
// TODO: add a better structure for input, and provide a callback to use here // TODO: add a better structure for input, and provide a callback to use
// here
while (SDL_PollEvent(&e)) { while (SDL_PollEvent(&e)) {
if ((e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) if ((e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE)
|| e.type == SDL_QUIT) { || e.type == SDL_QUIT) {
@ -39,13 +40,6 @@ doRenderLoop(render_state* rs, frame_callback_fn callback_fn, entity* entities,
callback_fn(rs); callback_fn(rs);
// TODO: entity pointer and entity count should be stored somewhere on the render_state object
// TODO: render_group should track a group of entity objects. the entity objects
// should keep track of their own render_objects?
/*
* render_group -> entities -> render_object(s)
* -> mesh_info ?
*/
renRenderFrame(rs); renRenderFrame(rs);
SDL_GL_SwapWindow(rs->handles.window); SDL_GL_SwapWindow(rs->handles.window);
frameTime = SDL_GetTicks() - frameStart; frameTime = SDL_GetTicks() - frameStart;
@ -61,13 +55,15 @@ doRenderLoop(render_state* rs, frame_callback_fn callback_fn, entity* entities,
int int
main() main()
{ {
// TODO: would be nice to be able to pass in viewport_dims, window title here // TODO: would be nice to be able to pass in viewport_dims, window title
// here
render_state* rs = renInit(); render_state* rs = renInit();
meInitAssimp(); meInitAssimp();
// TODO: entInit() doesn't allocate memory because we want to do the allocation in // TODO: entInit() doesn't allocate memory because we want to do the
// one big block, but this is really clunky to use // allocation in one big block, but this is really clunky to use
entity spaceship; render_group* group_1 = renAllocateGroup(1, *rs->default_shader);
entity spaceship = group_1->entities[0];
// TODO: this should be handled in entInit // TODO: this should be handled in entInit
entSetWorldPosition(spaceship, 0, 0, 0); entSetWorldPosition(spaceship, 0, 0, 0);
@ -83,14 +79,14 @@ main()
glm::vec3(0,0,1) glm::vec3(0,0,1)
); );
// TODO: renderer::setDefaults() allocates 10 lights based on a MACRO in renderer.cpp // TODO: renderer::setDefaults() allocates 10 lights based on a MACRO in
// probably need an interface to add more than that // renderer.cpp probably need an interface to add more than that add a
// add a light // light
rs->num_lights = 1; rs->num_lights = 1;
rs->lights[0].position = glm::vec3(200, -150, 150); rs->lights[0].position = glm::vec3(200, -150, 150);
// TODO: look into setting up git-annex for large files. git-lfs works fine for gitlab, // TODO: look into setting up git-annex for large files. git-lfs works fine
// but has no real implementation for self-hosting: // for gitlab, but has no real implementation for self-hosting:
// https://github.com/git-lfs/git-lfs/issues/1044 // https://github.com/git-lfs/git-lfs/issues/1044
// https://git-annex.branchable.com/ // https://git-annex.branchable.com/
// //
@ -98,7 +94,7 @@ main()
logDebugAnimationInfo("../data/spaceship.glb"); logDebugAnimationInfo("../data/spaceship.glb");
if (entInit(spaceship, "../data/spaceship.glb")) if (entInit(spaceship, "../data/spaceship.glb"))
doRenderLoop(rs, doFrameCallback, &spaceship, 1); doRenderLoop(rs, doFrameCallback);
else else
LOG(Error) << "Error initializing entity, exiting\n"; LOG(Error) << "Error initializing entity, exiting\n";

1
include/entity.h

@ -32,6 +32,7 @@ bool entInit(entity& e, const char* model_path);
void entFree(entity& e); void entFree(entity& e);
// TODO: just use glm::vec3 here also
void entSetWorldPosition(entity& e, float x, float y, float z); void entSetWorldPosition(entity& e, float x, float y, float z);
void entTranslate(entity& e, glm::vec3 v); void entTranslate(entity& e, glm::vec3 v);

1
include/render_object.h

@ -16,6 +16,7 @@ struct render_object
GLuint index_buffer_id; GLuint index_buffer_id;
}; };
// TODO: make use of glIsBuffer/glDeleteBuffers
void roFree(render_object* ro); void roFree(render_object* ro);
// TODO: implement me! // TODO: implement me!

11
include/renderer.h

@ -30,7 +30,6 @@ struct point_light
float intensity; float intensity;
}; };
/*
// NOTE: array of entities rendered with the same shader program // NOTE: array of entities rendered with the same shader program
struct render_group struct render_group
{ {
@ -39,7 +38,6 @@ struct render_group
shader_program shader; shader_program shader;
}; };
*/
struct render_state struct render_state
{ {
@ -49,8 +47,10 @@ struct render_state
camera cam; camera cam;
util_RGBA clear_col; util_RGBA clear_col;
//render_group* render_groups; render_group** render_groups;
//uint render_group_count; uint render_group_count;
shader_program* default_shader;
point_light* lights; point_light* lights;
uint num_lights; uint num_lights;
@ -61,5 +61,8 @@ render_state* renInit();
void renShutdown(render_state* rs); void renShutdown(render_state* rs);
render_group*
renAllocateGroup(uint entity_count, shader_program shader);
void renRenderFrame(render_state* rs); void renRenderFrame(render_state* rs);

1
include/shader_program.h

@ -20,3 +20,4 @@ struct shader_program
shader_program* shaderInit(const char* vertex_code, const char* frag_code); shader_program* shaderInit(const char* vertex_code, const char* frag_code);
// TODO: make use of glDeleteShader/glDeleteProgram in eg) shaderFree()

22
src/entity.cpp

@ -5,19 +5,27 @@
#include "entity.h" #include "entity.h"
// forward declarations
bool loadMeshIntoGL(entity& e);
#if 0 #if 0
bool initEntityROs(entity& e); bool initEntityROs(entity& e);
bool convertMeshInfo(meMeshInfo* mesh, render_object* ro, bool use_normals, bool use_texture); bool convertMeshInfo(meMeshInfo* mesh, render_object* ro, bool use_normals, bool use_texture);
#endif #endif
// interface
bool bool
entInit(entity& e, const char* model_path) entInit(entity& e, const char* model_path)
{ {
e.world_transform = glm::mat4(1.0); e.world_transform = glm::mat4(1.0);
entScale(e, glm::vec3(1.0)); entScale(e, glm::vec3(1.0));
if (meLoadFromFile(e.mesh_group, model_path)) {
entSetWorldPosition(e, 0, 0, 0); entSetWorldPosition(e, 0, 0, 0);
if (meLoadFromFile(e.mesh_group, model_path)
&& loadMeshIntoGL(e))
{
#if 0 #if 0
initEntityRG(e, shader, e.mesh_group.use_normals); initEntityRG(e, shader, e.mesh_group.use_normals);
@ -64,6 +72,16 @@ entScale(entity& e, glm::vec3 v)
e.world_transform = glm::scale(e.world_transform, v); e.world_transform = glm::scale(e.world_transform, v);
} }
// internal
bool
loadMeshIntoGL(entity& e)
{
LOG(Error) << "TODO: redo GL init for new render_object\n";
return false;
}
#if 0 #if 0
void void
initEntityRG(entity& e, rg_shader_program& shader, bool use_normals) initEntityRG(entity& e, rg_shader_program& shader, bool use_normals)

20
src/renderer.cpp

@ -48,13 +48,21 @@ renInit()
initContext(rs->handles) && initContext(rs->handles) &&
initGlOptions()) initGlOptions())
{ {
rs->default_shader =
shaderInit(DEFAULT_VERTEX_SHADER, DEFAULT_FRAGMENT_SHADER);
if (rs->default_shader != nullptr) {
return rs; return rs;
} else { } else {
LOG(Error) << "renderer initialization failed, aborting\n"; LOG(Error) << "shader loading failed\n";
return nullptr; return nullptr;
} }
} }
LOG(Error) << "renderer initialization failed, aborting\n";
return nullptr;
}
void void
renShutdown(render_state* rs) renShutdown(render_state* rs)
{ {
@ -64,6 +72,16 @@ renShutdown(render_state* rs)
SDL_Quit(); SDL_Quit();
} }
render_group*
renAllocateGroup(uint entity_count, shader_program shader)
{
assert(entity_count > 0);
render_group* rg = UTIL_ALLOC(1, render_group);
rg->entities = UTIL_ALLOC(entity_count, entity);
rg->shader = shader;
return rg;
}
void void
renRenderFrame(render_state* rs) renRenderFrame(render_state* rs)
{ {

Loading…
Cancel
Save