File: SceneRenderer.h

package info (click to toggle)
bzflag 2.0.13.20080902-1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 27,564 kB
  • ctags: 34,716
  • sloc: cpp: 139,842; ansic: 14,510; sh: 10,715; makefile: 2,454; perl: 477; php: 428; python: 345; objc: 243; xml: 24
file content (369 lines) | stat: -rw-r--r-- 8,251 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
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
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
/* bzflag
 * Copyright (c) 1993 - 2008 Tim Riker
 *
 * This package is free software;  you can redistribute it and/or
 * modify it under the terms of the license found in the file
 * named COPYING that should have accompanied this file.
 *
 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

/* SceneRenderer:
 *	Encapsulates information about rendering a scene.
 */

#ifndef	BZF_SCENE_RENDERER_H
#define	BZF_SCENE_RENDERER_H

#if defined(_MSC_VER)
#pragma warning(disable: 4786)
#endif

/* the common header */
#include "common.h"

/* interface headers */
#include "Singleton.h"

/* system interface headers */
#include <vector>

/* common interface headers */
#include "OpenGLLight.h"
#include "ViewFrustum.h"
#include "RenderNode.h"

#define RENDERER (SceneRenderer::instance())

class SceneDatabase;
class SceneIterator;
class SceneNode;
class BackgroundRenderer;
class HUDRenderer;
class MainWindow;
class Extents;

class FlareLight {
public:
  FlareLight(const float* pos, const float* color);
  ~FlareLight();

public:
  float		pos[3];
  float		color[3];
};


class SceneRenderer : public Singleton<SceneRenderer>
{
public:
  enum ViewType {
    Normal,		// one view
    Stereo,		// binocular stereo
    Stacked,		// top-bottom stereo view
    ThreeChannel,	// one wide view
    Anaglyph,		// red-blue stereo
    Interlaced		// right/left interlaced stereo
  };

  void		setWindow(MainWindow* _window);
  MainWindow&	getWindow() const;

  bool		useABGR() const;
  bool		useStencil() const;
  int		useQuality() const;
  bool		useDepthComplexity() const;
  bool		useWireframe() const;
  bool		useHiddenLine() const;
  float		getPanelOpacity() const;
  int		getRadarSize() const;
  int		getMaxMotionFactor() const;
  bool		isLastFrame() const;
  bool		isSameFrame() const;
  ViewType	getViewType() const;

  void		setSmoothing(bool on);
  void		setZBuffer(bool on);
  void		setZBufferSplit(bool on);
  void		setQuality(int value);
  void		setDepthComplexity(bool on);
  void		setWireframe(bool on);
  void		setHiddenLine(bool on);
  void		setPanelOpacity(float opacity);
  void		setRadarSize(int size);
  void		setMaxMotionFactor(int size);
  void		setDim(bool on);
  void		setViewType(ViewType);
  void		setRebuildTanks();

  void		setExposed();

  void		clearRadar(float opacity);

  void		getGroundUV(const float p[2], float uv[2]) const;

  bool		getBlank() const;
  bool		getInvert() const;
  void		setBlank(bool blank = true);
  void		setInvert(bool invert = true);

  const ViewFrustum&	getViewFrustum() const;
  ViewFrustum&	getViewFrustum();

  int			getNumLights() const;
  int			getNumAllLights() const;
  const OpenGLLight&	getLight(int index) const;
  void		enableLight(int index, bool = true);
  void		clearLights();
  void		addLight(OpenGLLight&);
  void		addFlareLight(const float* pos, const float* color);

  // temporarily turn off non-applicable lights for big meshes
  void		disableLights(const float mins[3], const float maxs[3]);
  void		reenableLights();

  void		setupSun(); // setup sun lighting params
  void		enableSun(bool = true); // toggle light state

  void		setTimeOfDay(double julianDay);

  const GLfloat*	getSunColor() const;
  const GLfloat*	getSunScaledColor() const;
  GLfloat		getSunBrightness() const;
  const GLfloat*	getSunDirection() const;
  const GLfloat*	getAmbientColor() const;
  const GLfloat*	getCelestialTransform() const;

  SceneDatabase*	getSceneDatabase() const;
  void			setSceneDatabase(SceneDatabase*);

  const Extents*	getVisualExtents() const;
  float			getLengthPerPixel() const;

  int			getFrameTriangleCount() const;

  BackgroundRenderer*	getBackground();
  void			setBackground(BackgroundRenderer*);

  const RenderNodeList& getShadowList() const;

  void		render(bool lastFrame = true,
		       bool sameFrame = false,
		       bool fullWindow = false);
  void		renderScene(bool lastFrame = true,
			    bool sameFrame = false,
			    bool fullWindow = false);
  void		notifyStyleChange();
  void		addRenderNode(RenderNode* node, const OpenGLGState*);
  void		addShadowNode(RenderNode* node);

protected:
  friend class Singleton<SceneRenderer>;

private:
  // disallowed -- don't want to deal with potential state problems
  SceneRenderer();
  ~SceneRenderer();

  SceneRenderer(const SceneRenderer&);
  SceneRenderer&	operator=(const SceneRenderer&);

  void		setupBackgroundMaterials();

  void		getLights();
  void		getRenderNodes();

  void		doRender();
  void		renderDepthComplexity();
  void		renderPreDimming();
  void		renderPostDimming();

  MainWindow*		window;
  bool			blank;
  bool			invert;
  bool			mirror;
  bool			drawGround;
  bool			clearZbuffer;
  ViewFrustum		frustum;
  float			lengthPerPixel;
  GLint			maxLights;
  GLint			reservedLights;
  GLint			dynamicLights;
  int			lightsSize;
  int			lightsCount;
  OpenGLLight**		lights;
  OpenGLLight		theSun;
  bool			sunOrMoonUp;
  GLfloat		sunDirection[3];	// or moon
  GLfloat		sunColor[4];
  GLfloat		sunScaledColor[4];
  GLfloat		celestialTransform[4][4];
  GLfloat		sunBrightness;
  GLfloat		ambientColor[4];
  SceneDatabase*	scene;
  BackgroundRenderer*	background;
  int			triangleCount;
  static const GLint	SunLight;

  static const float dimDensity;
  static const GLfloat dimnessColor[4];
  static const GLfloat blindnessColor[4];
  float teleporterProximity;

  bool		abgr;
  int		useQualityValue;
  bool		useDepthComplexityOn;
  bool		useWireframeOn;
  bool		useHiddenLineOn;
  float		panelOpacity;
  int		radarSize;
  int		maxMotionFactor;
  bool		useFogHack;
  bool		useStencilOn;
  ViewType	viewType;
  bool		inOrder;
  int		depthRange;
  int		numDepthRanges;
  double	depthRangeSize;
  bool		useDimming;
  bool		canUseHiddenLine;
  bool		exposed;
  bool		lastFrame;
  bool		sameFrame;
  bool		needStyleUpdate;
  bool		rebuildTanks;

  std::vector<FlareLight>	flareLightList;
  RenderNodeList		shadowList;
  RenderNodeGStateList		orderedList;
};


//
// SceneRenderer
//

inline MainWindow&		SceneRenderer::getWindow() const
{
  return *window;
}

inline bool			SceneRenderer::getBlank() const
{
  return blank;
}

inline void			SceneRenderer::setBlank(bool _blank)
{
  blank = _blank;
}

inline bool			SceneRenderer::getInvert() const
{
  return invert;
}

inline void			SceneRenderer::setInvert(bool _invert)
{
  invert = _invert;
}

inline const ViewFrustum&	SceneRenderer::getViewFrustum() const
{
  return frustum;
}

inline ViewFrustum&		SceneRenderer::getViewFrustum()
{
  return frustum;
}

inline float			SceneRenderer::getLengthPerPixel() const
{
  return lengthPerPixel;
}

inline const OpenGLLight&	SceneRenderer::getLight(int index) const
{
  return *(lights[index]);
}

inline const GLfloat*		SceneRenderer::getSunColor() const
{
  return sunColor;
}

inline const GLfloat*		SceneRenderer::getSunScaledColor() const
{
  return sunScaledColor;
}

inline GLfloat			SceneRenderer::getSunBrightness() const
{
  return sunBrightness;
}

inline const GLfloat* SceneRenderer::getAmbientColor() const
{
  return ambientColor;
}

inline const GLfloat*		SceneRenderer::getCelestialTransform() const
{
  return &celestialTransform[0][0];
}

inline SceneDatabase*		SceneRenderer::getSceneDatabase() const
{
  return scene;
}

inline BackgroundRenderer*	SceneRenderer::getBackground()
{
  return background;
}

inline bool			SceneRenderer::isLastFrame() const
{
  return lastFrame;
}

inline bool			SceneRenderer::isSameFrame() const
{
  return sameFrame;
}

inline int			SceneRenderer::useQuality() const
{
  return useQualityValue;
}

inline void SceneRenderer::addRenderNode(RenderNode* node,
					 const OpenGLGState* gstate)
{
  if (inOrder || gstate->getNeedsSorting()) {
    // nodes will be drawn in the same order received
    orderedList.append(node, gstate);
  } else {
    // store node in gstate bucket
    gstate->addRenderNode(node);
  }
}

inline void SceneRenderer::addShadowNode(RenderNode* node)
{
  shadowList.append(node);
}


#endif // BZF_SCENE_RENDERER_H

// Local Variables: ***
// mode: C++ ***
// tab-width: 8 ***
// c-basic-offset: 2 ***
// indent-tabs-mode: t ***
// End: ***
// ex: shiftwidth=2 tabstop=8