dbf_amiga
diff src/scene.cc @ 0:87dfe0e10235
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 31 Aug 2015 07:38:37 +0300 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/scene.cc Mon Aug 31 07:38:37 2015 +0300 1.3 @@ -0,0 +1,79 @@ 1.4 +#include "scene.h" 1.5 +#include "opengl.h" 1.6 +#include "opt.h" 1.7 +#include "game.h" 1.8 +#include "scnload.h" 1.9 + 1.10 +static int max_lights = -1; 1.11 + 1.12 +Scene::~Scene() 1.13 +{ 1.14 + clear(); 1.15 +} 1.16 + 1.17 +void Scene::clear() 1.18 +{ 1.19 + for(size_t i=0; i<objects.size(); i++) { 1.20 + delete objects[i]; 1.21 + } 1.22 + objects.clear(); 1.23 + 1.24 + for(size_t i=0; i<lights.size(); i++) { 1.25 + delete lights[i]; 1.26 + } 1.27 + lights.clear(); 1.28 +} 1.29 + 1.30 +void Scene::add_object(Object *obj) 1.31 +{ 1.32 + objects.push_back(obj); 1.33 +} 1.34 + 1.35 +void Scene::add_lights(Light *lt) 1.36 +{ 1.37 + lights.push_back(lt); 1.38 +} 1.39 + 1.40 +bool Scene::load(const char *fname) 1.41 +{ 1.42 + if(load_obj(this, fname)) { 1.43 + return true; 1.44 + } 1.45 + 1.46 + fprintf(stderr, "failed to load scene file: %s\n", fname); 1.47 + return false; 1.48 +} 1.49 + 1.50 +void Scene::dump(FILE *fp) 1.51 +{ 1.52 + fprintf(fp, "SCENE DUMP\n"); 1.53 + fprintf(fp, "%d objects, %d lights\n", (int)objects.size(), (int)lights.size()); 1.54 + 1.55 + for(size_t i=0; i<objects.size(); i++) { 1.56 + fprintf(fp, "OBJECT %d:\n", (int)i); 1.57 + objects[i]->get_mesh()->dump(fp); 1.58 + } 1.59 +} 1.60 + 1.61 +void Scene::draw(unsigned int flags) const 1.62 +{ 1.63 + if(max_lights == -1) { 1.64 + glGetIntegerv(GL_MAX_LIGHTS, &max_lights); 1.65 + printf("max lights: %d\n", max_lights); 1.66 + } 1.67 + 1.68 + for(size_t i=0; i<lights.size(); i++) { 1.69 + lights[i]->setup(i); 1.70 + } 1.71 + 1.72 + for(size_t i=0; i<objects.size(); i++) { 1.73 + unsigned int mask = objects[i]->rop.transparent ? DRAW_TRANSPARENT : DRAW_SOLID; 1.74 + if(mask & flags) { 1.75 + if(dbg_wireframe) { 1.76 + objects[i]->draw_wire(); 1.77 + } else { 1.78 + objects[i]->draw(); 1.79 + } 1.80 + } 1.81 + } 1.82 +}