93 |
const int RENDERABLE0 = 0x0800000; |
const int RENDERABLE0 = 0x0800000; |
94 |
const int RENDERABLE1 = 0x1000000; |
const int RENDERABLE1 = 0x1000000; |
95 |
const int RENDERABLE2 = 0x2000000; |
const int RENDERABLE2 = 0x2000000; |
96 |
|
const int RENDERABLE3 = 0x3000000; |
97 |
const int RMASK = 0xf800000; |
const int RMASK = 0xf800000; |
98 |
|
|
99 |
class ShaderRect { |
class ShaderRect { |
145 |
virtual void render(Coords::CoordSys &c1, Coords::CoordSys &c2) \ |
virtual void render(Coords::CoordSys &c1, Coords::CoordSys &c2) \ |
146 |
{ renderImpl(c1, c2); } \ |
{ renderImpl(c1, c2); } \ |
147 |
|
|
148 |
|
/** An OpenGL thing which starts in one coordinate |
149 |
|
* system and ends in another. Used for connections. |
150 |
|
* The third coordinate system is used for leaving |
151 |
|
* unnecessary stuff without rendering. |
152 |
|
*/ |
153 |
|
struct Renderable3 { |
154 |
|
virtual ~Renderable3() { } |
155 |
|
virtual void render(Coords::CoordSys &c1, Coords::CoordSys &c2, |
156 |
|
Coords::CoordSys &c3) = 0; |
157 |
|
}; |
158 |
|
|
159 |
|
#define IMPLEMENTRENDER3 \ |
160 |
|
virtual void render(Coords::CoordSys &c1, Coords::CoordSys &c2, \ |
161 |
|
Coords::CoordSys &c3) \ |
162 |
|
{ renderImpl(c1, c2, c3); } \ |
163 |
|
|
164 |
|
|
165 |
using std::vector; |
using std::vector; |
167 |
class Renderer { |
class Renderer { |
168 |
Coords::CoordSet coordset; |
Coords::CoordSet coordset; |
169 |
public: |
public: |
170 |
|
// TODO: RENDERABLE3 setPoints() |
171 |
void setPoints( int ninds, |
void setPoints( int ninds, |
172 |
int *inds1, float *points1, |
int *inds1, float *points1, |
173 |
int *interpinds, |
int *interpinds, |
184 |
void renderScene(int *codes, |
void renderScene(int *codes, |
185 |
ObjectStorer<Renderable0> &r0s, |
ObjectStorer<Renderable0> &r0s, |
186 |
ObjectStorer<Renderable1> &r1s, |
ObjectStorer<Renderable1> &r1s, |
187 |
ObjectStorer<Renderable2> &r2s) { |
ObjectStorer<Renderable2> &r2s, |
188 |
|
ObjectStorer<Renderable3> &r3s) { |
189 |
int i=0; |
int i=0; |
190 |
if(dbg) std::cout << "renderScene\n"; |
if(dbg) std::cout << "renderScene\n"; |
191 |
while(codes[i] != 0) { |
while(codes[i] != 0) { |
192 |
if(dbg) std::cout << "Rendercode "<<i<<" "<<codes[i]<<"\n"; |
if(dbg) std::cout << "Rendercode "<<i<<" "<<codes[i]<<"\n"; |
193 |
// cout << "Code: "<<codes[i]<<"\n"; |
// cout << "Code: "<<codes[i]<<"\n"; |
194 |
int code = codes[i] & ~RMASK; |
int code = codes[i] & ~RMASK; |
195 |
if(codes[i] & RENDERABLE0) { |
if((codes[i] & RMASK) == RENDERABLE0) { |
196 |
if(dbg) std::cout << "rend0 "<<r0s[code]<<"\n"; |
if(dbg) std::cout << "rend0 "<<r0s[code]<<"\n"; |
197 |
r0s[code]->render(); |
r0s[code]->render(); |
198 |
i += 1; |
i += 1; |
199 |
} |
} |
200 |
else if(codes[i] & RENDERABLE1) { |
else if((codes[i] & RMASK) == RENDERABLE1) { |
201 |
Coords::CoordSys *cs1 = coordset.get(codes[i+1]); |
Coords::CoordSys *cs1 = coordset.get(codes[i+1]); |
202 |
if(dbg) std::cout << "rend1 "<<r1s[code]<<": "<<codes[i+1]<<" "<<cs1<<"\n"; |
if(dbg) std::cout << "rend1 "<<r1s[code]<<": "<<codes[i+1]<<" "<<cs1<<"\n"; |
203 |
if(cs1) |
if(cs1) |
204 |
r1s[code]->render(*cs1); |
r1s[code]->render(*cs1); |
205 |
i += 2; |
i += 2; |
206 |
} |
} |
207 |
else if(codes[i] & RENDERABLE2) { |
else if((codes[i] & RMASK) == RENDERABLE2) { |
208 |
Coords::CoordSys *cs1 = coordset.get(codes[i+1]); |
Coords::CoordSys *cs1 = coordset.get(codes[i+1]); |
209 |
Coords::CoordSys *cs2 = coordset.get(codes[i+2]); |
Coords::CoordSys *cs2 = coordset.get(codes[i+2]); |
210 |
if(dbg) std::cout << "rend2 "<<r2s[code]<<": " |
if(dbg) std::cout << "rend2 "<<r2s[code]<<": " |
213 |
r2s[code]->render(*cs1, *cs2); |
r2s[code]->render(*cs1, *cs2); |
214 |
i += 3; |
i += 3; |
215 |
} |
} |
216 |
|
else if((codes[i] & RMASK) == RENDERABLE3) { |
217 |
|
Coords::CoordSys *cs1 = coordset.get(codes[i+1]); |
218 |
|
Coords::CoordSys *cs2 = coordset.get(codes[i+2]); |
219 |
|
Coords::CoordSys *cs3 = coordset.get(codes[i+3]); |
220 |
|
if(dbg) std::cout << "rend3 "<<r3s[code]<<": " |
221 |
|
<<codes[i+1]<<" "<<cs1<<" "<<codes[i+2]<<" "<<cs2<<" " |
222 |
|
<<cs3<<" "<<codes[i+3]<<"\n"; |
223 |
|
if(cs1 && cs2 && cs3) |
224 |
|
r3s[code]->render(*cs1, *cs2, *cs3); |
225 |
|
i += 4; |
226 |
|
} |
227 |
else { |
else { |
228 |
// We have a problem |
// We have a problem |
229 |
cout << "HELP!\n"; |
cout << "HELP!\n"; |
238 |
} |
} |
239 |
|
|
240 |
|
|
241 |
|
|
242 |
|
|
243 |
|
|
244 |
|
|
245 |
|
|
246 |
|
|
247 |
|
|
248 |
|
|
249 |
|
|
250 |
|
|
251 |
|
|
252 |
|
|
253 |
|
|
254 |
|
|
255 |
|
|
256 |
|
|
257 |
|
|
258 |
|
|
259 |
|
|
260 |
|
|
261 |
|
|
262 |
|
|