dbf_amiga

annotate 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
rev   line source
nuclear@0 1 #include "scene.h"
nuclear@0 2 #include "opengl.h"
nuclear@0 3 #include "opt.h"
nuclear@0 4 #include "game.h"
nuclear@0 5 #include "scnload.h"
nuclear@0 6
nuclear@0 7 static int max_lights = -1;
nuclear@0 8
nuclear@0 9 Scene::~Scene()
nuclear@0 10 {
nuclear@0 11 clear();
nuclear@0 12 }
nuclear@0 13
nuclear@0 14 void Scene::clear()
nuclear@0 15 {
nuclear@0 16 for(size_t i=0; i<objects.size(); i++) {
nuclear@0 17 delete objects[i];
nuclear@0 18 }
nuclear@0 19 objects.clear();
nuclear@0 20
nuclear@0 21 for(size_t i=0; i<lights.size(); i++) {
nuclear@0 22 delete lights[i];
nuclear@0 23 }
nuclear@0 24 lights.clear();
nuclear@0 25 }
nuclear@0 26
nuclear@0 27 void Scene::add_object(Object *obj)
nuclear@0 28 {
nuclear@0 29 objects.push_back(obj);
nuclear@0 30 }
nuclear@0 31
nuclear@0 32 void Scene::add_lights(Light *lt)
nuclear@0 33 {
nuclear@0 34 lights.push_back(lt);
nuclear@0 35 }
nuclear@0 36
nuclear@0 37 bool Scene::load(const char *fname)
nuclear@0 38 {
nuclear@0 39 if(load_obj(this, fname)) {
nuclear@0 40 return true;
nuclear@0 41 }
nuclear@0 42
nuclear@0 43 fprintf(stderr, "failed to load scene file: %s\n", fname);
nuclear@0 44 return false;
nuclear@0 45 }
nuclear@0 46
nuclear@0 47 void Scene::dump(FILE *fp)
nuclear@0 48 {
nuclear@0 49 fprintf(fp, "SCENE DUMP\n");
nuclear@0 50 fprintf(fp, "%d objects, %d lights\n", (int)objects.size(), (int)lights.size());
nuclear@0 51
nuclear@0 52 for(size_t i=0; i<objects.size(); i++) {
nuclear@0 53 fprintf(fp, "OBJECT %d:\n", (int)i);
nuclear@0 54 objects[i]->get_mesh()->dump(fp);
nuclear@0 55 }
nuclear@0 56 }
nuclear@0 57
nuclear@0 58 void Scene::draw(unsigned int flags) const
nuclear@0 59 {
nuclear@0 60 if(max_lights == -1) {
nuclear@0 61 glGetIntegerv(GL_MAX_LIGHTS, &max_lights);
nuclear@0 62 printf("max lights: %d\n", max_lights);
nuclear@0 63 }
nuclear@0 64
nuclear@0 65 for(size_t i=0; i<lights.size(); i++) {
nuclear@0 66 lights[i]->setup(i);
nuclear@0 67 }
nuclear@0 68
nuclear@0 69 for(size_t i=0; i<objects.size(); i++) {
nuclear@0 70 unsigned int mask = objects[i]->rop.transparent ? DRAW_TRANSPARENT : DRAW_SOLID;
nuclear@0 71 if(mask & flags) {
nuclear@0 72 if(dbg_wireframe) {
nuclear@0 73 objects[i]->draw_wire();
nuclear@0 74 } else {
nuclear@0 75 objects[i]->draw();
nuclear@0 76 }
nuclear@0 77 }
nuclear@0 78 }
nuclear@0 79 }