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 }
|