dungeon_crawler

annotate prototype/src/renderer.cc @ 41:acfe0c0110fc

- cleaned up the renderer - implemented fallback (non-deferred renderer)
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 30 Aug 2012 05:35:00 +0300
parents 84a56fb24850
children c45c42c3d32e
rev   line source
nuclear@15 1 #include "opengl.h"
nuclear@15 2 #include "renderer.h"
nuclear@23 3 #include "level.h"
nuclear@15 4 #include "sdr.h"
nuclear@15 5 #include "datapath.h"
nuclear@15 6
nuclear@41 7 static unsigned int load_sdr(const char *vfname, const char *pfname);
nuclear@35 8
nuclear@41 9 Renderer *rend;
nuclear@18 10
nuclear@15 11
nuclear@41 12 Renderer::Renderer()
nuclear@41 13 {
nuclear@41 14 width = height = 0;
nuclear@41 15 }
nuclear@17 16
nuclear@41 17 Renderer::~Renderer()
nuclear@41 18 {
nuclear@41 19 }
nuclear@17 20
nuclear@41 21 bool Renderer::init(int xsz, int ysz)
nuclear@41 22 {
nuclear@41 23 width = xsz;
nuclear@41 24 height = ysz;
nuclear@17 25
nuclear@41 26 rend = this;
nuclear@41 27 return true;
nuclear@41 28 }
nuclear@15 29
nuclear@41 30 int Renderer::get_tangent_location() const
nuclear@41 31 {
nuclear@41 32 return -1;
nuclear@41 33 }
nuclear@15 34
nuclear@41 35 unsigned int Renderer::get_current_program() const
nuclear@41 36 {
nuclear@41 37 return 0;
nuclear@41 38 }
nuclear@21 39
nuclear@41 40 void Renderer::resize(int xsz, int ysz)
nuclear@41 41 {
nuclear@41 42 width = xsz;
nuclear@41 43 height = ysz;
nuclear@41 44 }
nuclear@21 45
nuclear@41 46
nuclear@41 47 // ---- fallback forward renderer ----
nuclear@41 48 FwdRenderer::FwdRenderer()
nuclear@17 49 {
nuclear@41 50 sdrprog = 0;
nuclear@41 51 tang_attr = -1;
nuclear@41 52 }
nuclear@41 53
nuclear@41 54 FwdRenderer::~FwdRenderer()
nuclear@41 55 {
nuclear@41 56 if(sdrprog) {
nuclear@41 57 free_program(sdrprog);
nuclear@32 58 }
nuclear@41 59 }
nuclear@21 60
nuclear@41 61 bool FwdRenderer::init(int xsz, int ysz)
nuclear@41 62 {
nuclear@41 63 width = xsz;
nuclear@41 64 height = ysz;
nuclear@19 65
nuclear@41 66 if(glUseProgram && (sdrprog = load_sdr("fallback.v.glsl", "fallback.p.glsl"))) {
nuclear@41 67 tang_attr = get_attrib_loc(sdrprog, "attr_tangent");
nuclear@41 68 set_uniform_int(sdrprog, "tex_dif", 0);
nuclear@41 69 set_uniform_int(sdrprog, "tex_norm", 1);
nuclear@23 70 }
nuclear@17 71 return true;
nuclear@17 72 }
nuclear@17 73
nuclear@41 74 int FwdRenderer::get_tangent_location() const
nuclear@17 75 {
nuclear@41 76 return tang_attr;
nuclear@17 77 }
nuclear@17 78
nuclear@41 79 unsigned int FwdRenderer::get_current_program() const
nuclear@33 80 {
nuclear@41 81 return sdrprog;
nuclear@33 82 }
nuclear@33 83
nuclear@41 84 void FwdRenderer::render(const Level *level) const
nuclear@35 85 {
nuclear@41 86 glPushAttrib(GL_ENABLE_BIT);
nuclear@41 87 glUseProgram(sdrprog);
nuclear@35 88
nuclear@41 89 glEnable(GL_LIGHTING);
nuclear@23 90 level->draw();
nuclear@20 91
nuclear@41 92 glPopAttrib();
nuclear@19 93
nuclear@18 94 glUseProgram(0);
nuclear@17 95 }
nuclear@17 96
nuclear@18 97 static unsigned int load_sdr(const char *vfname, const char *pfname)
nuclear@15 98 {
nuclear@15 99 char vsfile[PATH_MAX], psfile[PATH_MAX];
nuclear@15 100 const char *fname;
nuclear@18 101 unsigned int prog;
nuclear@15 102
nuclear@18 103 if((fname = datafile_path(vfname))) {
nuclear@17 104 strcpy(vsfile, fname);
nuclear@17 105 } else {
nuclear@17 106 vsfile[0] = 0;
nuclear@17 107 }
nuclear@18 108 if((fname = datafile_path(pfname))) {
nuclear@17 109 strcpy(psfile, fname);
nuclear@17 110 } else {
nuclear@17 111 psfile[0] = 0;
nuclear@17 112 }
nuclear@18 113 if(!(prog = create_program_load(vsfile, psfile))) {
nuclear@18 114 fprintf(stderr, "failed to load shader program (%s, %s)\n", vsfile, psfile);
nuclear@18 115 return 0;
nuclear@15 116 }
nuclear@18 117 return prog;
nuclear@15 118 }