Developer Documentation
IRenderer.hh
1 /*===========================================================================*\
2  * *
3  * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40 \*===========================================================================*/
41 
42 
43 
44 #pragma once
45 
46 
47 #include <ACG/GL/gl.hh>
48 #include <ACG/Math/GLMatrixT.hh>
49 #include <ACG/GL/ShaderGenerator.hh>
50 #include <ACG/GL/RenderObject.hh>
51 
53 #include <ACG/Scenegraph/MaterialNode.hh>
54 
55 
56 
57 namespace GLSL{
58  class Program;
59 }
60 
61 namespace ACG
62 {
63 
64 // forward declaration
65 class VertexDeclaration;
66 class GLState;
67 class FBO;
68 class Texture;
69 class Texture2D;
70 
71 namespace SceneGraph {
72  namespace DrawModes {
73  class DrawModeProperties;
74  }
75  class Material;
76 }
77 
78 class ACGDLLEXPORT IRenderer
79 {
80 public:
81  IRenderer();
82  virtual ~IRenderer();
83 
84 
85 public:
86  //=========================================================================
87  // Callbacks for the scenegraph nodes
88  //=========================================================================
89 
102  virtual void addRenderObject(RenderObject* _renderObject);
103 
104  struct LightData
105  {
106  LightData()
107  : ltype(ACG::SG_LIGHT_DIRECTIONAL),
108  diffuse(1.0f, 1.0f, 1.0f), ambient(1.0f, 1.0f, 1.0f), specular(1.0f, 1.0f, 1.0f),
109  pos(0.0f, 0.0f, 0.0f), dir(1.0f, 0.0f, 0.0f), atten(1.0f, 0.0f, 0.0f),
110  spotCutoffExponent(0.0f, 0.0f)
111  { }
112 
113  ACG::ShaderGenLightType ltype; // directional, spot- or pointlight
114  ACG::Vec3f diffuse, ambient, specular; // light color factor
115  ACG::Vec3f pos, dir; // position, direction in view-space
116  ACG::Vec3f atten; // (constant, linear, quadratic) attenuation
117  ACG::Vec2f spotCutoffExponent; // (cutoff angle, exponent) for spotlights
118  };
119 
121  public:
122  RenderObjectRange() {}
123  RenderObjectRange(std::vector<ACG::RenderObject>::iterator begin,
124  std::vector<ACG::RenderObject>::iterator end) :
125  begin_(begin), end_(end) {}
126 
127  std::vector<ACG::RenderObject>::iterator begin() const {
128  return begin_;
129  }
130 
131  std::vector<ACG::RenderObject>::iterator end() const {
132  return end_;
133  }
134 
135  private:
136  std::vector<ACG::RenderObject>::iterator begin_, end_;
137  };
138 
147  virtual void addLight(const LightData& _light);
148 
160  virtual void addRenderObjectModifier(RenderObjectModifier* _mod);
161 
170  virtual void removeRenderObjectModifier(RenderObjectModifier* _mod);
171 
172  //=========================================================================
173  // Render object collection and OpenGL setup for shader-based rendering
174  //=========================================================================
175 protected:
187  virtual void prepareRenderingPipeline(ACG::GLState* _glState, ACG::SceneGraph::DrawModes::DrawMode _drawMode, ACG::SceneGraph::BaseNode* _scenegraphRoot);
188 
197  virtual void collectRenderObjects(ACG::GLState* _glState, ACG::SceneGraph::DrawModes::DrawMode _drawMode, ACG::SceneGraph::BaseNode* _sceneGraphRoot);
198 
199 
207  void traverseRenderableNodes(ACG::GLState* _glState, ACG::SceneGraph::DrawModes::DrawMode _drawMode, ACG::SceneGraph::BaseNode &_node, const ACG::SceneGraph::Material &_mat);
208 
209 
210 
211  //=========================================================================
212  // Sorting
213  //=========================================================================
214 protected:
215 
220  virtual void sortRenderObjects();
221 
222 
223  //=========================================================================
224  // Rendering
225  //=========================================================================
226 protected:
227 
238  virtual void renderObject(ACG::RenderObject* _obj, GLSL::Program* _prog = 0, bool _constRenderStates = false, const std::vector<unsigned int>* _shaderModifiers = 0);
239 
247  virtual void bindObjectVBO(ACG::RenderObject* _obj,
248  GLSL::Program* _prog);
249 
257  virtual void bindObjectUniforms(ACG::RenderObject* _obj,
258  GLSL::Program* _prog);
259 
268  virtual void bindObjectRenderStates(ACG::RenderObject* _obj);
269 
270 
277  virtual void drawObject(ACG::RenderObject* _obj);
278 
279 
280  //=========================================================================
281  // Restore OpenGL State
282  //=========================================================================
283 
284 protected:
285 
286 
295  virtual void finishRenderingPipeline(bool _drawOverlay = true);
296 
299  virtual void saveInputFbo();
300 
303  virtual void restoreInputFbo();
304 
310  virtual void saveActiveFbo(GLint* _outFboId, GLint* _outViewport, GLint* _outDrawBuffer) const;
311 
317  virtual void restoreFbo(GLint _fboId, const GLint* _outViewport, GLint _drawBuffer) const;
318 
324  virtual void clearInputFbo(const ACG::Vec4f& _clearColor);
325 
326  //=========================================================================
327  // Other Convenience
328  //=========================================================================
329 
330 protected:
331 
344  virtual void copyDepthToBackBuffer(GLuint _depthTex, float _scale = 1.0f);
345 
346 
359  virtual void renderDepthMap(int _viewerID, int _width, int _height);
360 
361 
362  //=========================================================================
363  // Internal shader modifiers
364  //=========================================================================
365 protected:
366 
367  // depth map modifier: writes gl_FragCoord.z to red color channel
369  {
370  public:
371  void modifyFragmentEndCode(QStringList* _code);
372 
373  static DepthMapPass instance;
374  };
375 
376 
377  //=========================================================================
378  // Debugging
379  //=========================================================================
380 public:
381 
388  void dumpRenderObjectsToFile(const char* _fileName, ACG::RenderObject** _sortedList = 0) const;
389 
397  virtual QString dumpCurrentRenderObjectsToString(ACG::RenderObject** _list = 0, bool _outputShaders = false, std::vector<ACG::ShaderModifier*>* _modifiers = 0);
398 
410  void setErrorDetectionLevel(int _level);
411 
413  int getErrorDetectionLevel() const;
414 
415  //=========================================================================
416  // Variables
417  //=========================================================================
418 protected:
419 
421  int getNumRenderObjects() const;
422 
424  int getNumLights() const;
425 
427  ACG::RenderObject* getRenderObject(int i);
428 
430  ACG::RenderObject* getOverlayRenderObject(int i);
431 
433  ACG::RenderObject* getLineGL42RenderObject(int i);
434 
436  LightData* getLight(int i);
437 
438 
440  const ACG::Vec3f& getGlobalAmbientScale() const {return globalLightModelAmbient_;}
441 
442 
444  ACG::SceneGraph::BaseNode* getRenderObjectNode(int i);
445 
447  ACG::SceneGraph::BaseNode* getOverlayRenderObjectNode(int i);
448 
449 
450 
459  void setLineThicknessRenderingGL42(bool _enable);
460 
461 
462  //=========================================================================
463  // Internally called by OpenFlipper core
464  //=========================================================================
465 public:
466 
475  void setViewerID(int _viewerID);
476 
477 
478 
483  void setCoreProfileMode(bool _enable) {coreProfile_ = _enable;}
484 
494  return current_subtree_objects_;
495  }
496 
497 protected:
500 
502  LightData lights_[SG_MAX_SHADER_LIGHTS];
503 
507 
509  std::vector<ACG::RenderObject> renderObjects_;
510 
512  std::vector<int> sortListObjects_;
514  std::vector<int> sortListOverlays_;
515 
517  std::vector<ACG::RenderObject*> sortedObjects_;
518 
520  std::vector<ACG::RenderObject*> overlayObjects_;
521 
523  std::vector<ACG::RenderObjectModifier*> renderObjectModifiers_;
524 
526  std::vector<ACG::SceneGraph::BaseNode*> renderObjectSource_;
527 
529  std::vector<ACG::SceneGraph::BaseNode*> overlayObjectSource_;
530 
536  std::map<int, ACG::FBO*> depthMaps_;
537 
540 
543 
546 
549 
552 
554  GLint prevFbo_;
555 
558 
560  GLint prevViewport_[4];
561 
564 
566  GLint prevVAO_;
567 
570 
573 
574 
577 
578 
580  static int maxClipDistances_;
581 
582  RenderObjectRange current_subtree_objects_;
583 private:
584 
585  //=========================================================================
586  // Default rendering of thick lines
587  //=========================================================================
588 
595 
597  std::vector<RenderObject*> lineGL42Objects_;
598 
600  std::map< int, Texture* > lineColorBuffers_;
601 
602  void renderLineThicknessGL42();
603 
604 
605 };
606 
607 
608 
609 //=============================================================================
610 } // namespace ACG
611 //=============================================================================
int errorDetectionLevel_
error-detection level for checking render objects
Definition: IRenderer.hh:572
bool coreProfile_
core profile mode
Definition: IRenderer.hh:576
bool enableLineThicknessGL42_
Enable/disable gl4.2 based technique for rendering thick lines.
Definition: IRenderer.hh:594
Namespace providing different geometric functions concerning angles.
Interface for modifying render objects.
GLint prevDrawBuffer_
previous drawbuffer target (ie GL_BACK, GL_COLOR_ATTACHMENTi...)
Definition: IRenderer.hh:557
std::vector< ACG::RenderObject > renderObjects_
array of renderobjects, filled by addRenderObject()
Definition: IRenderer.hh:509
std::vector< ACG::SceneGraph::BaseNode * > overlayObjectSource_
source node that added the overlay render object (map renderObjectID -> scenegraph node) ...
Definition: IRenderer.hh:529
int curViewerID_
currently active viewer ID as specified in prepareRenderObjects()
Definition: IRenderer.hh:542
GLSL::Program * depthCopyShader_
shader copies depth of the first front layer to the back buffer
Definition: IRenderer.hh:569
std::map< int, Texture *> lineColorBuffers_
map from viewport id to line buffer
Definition: IRenderer.hh:600
const ACG::Vec3f & getGlobalAmbientScale() const
Get global ambient light contribution from GL_LIGHT_MODEL_AMBIENT.
Definition: IRenderer.hh:440
Vec3f camPosWS_
cam position in world-space
Definition: IRenderer.hh:548
static int maxClipDistances_
max number of clip distance outputs in a vertex shader
Definition: IRenderer.hh:580
GLSL program class.
Definition: GLSLShader.hh:211
std::vector< int > sortListObjects_
map sortedID -> original renderObjectID
Definition: IRenderer.hh:512
bool prevFboSaved_
flag indicating a that saveCurrentFbo() has been called prior restoreFbo()
Definition: IRenderer.hh:563
void setCoreProfileMode(bool _enable)
Tell renderer to use core or compatibility profile.
Definition: IRenderer.hh:483
This namespace contains all the classes and functions for handling GLSL shader and program objects...
Definition: AntiAliasing.hh:66
std::vector< ACG::RenderObject * > overlayObjects_
sorted list of overlay-only renderobjects (sorted in rendering order)
Definition: IRenderer.hh:520
std::vector< ACG::SceneGraph::BaseNode * > renderObjectSource_
source node that added the render object (map renderObjectID -> scenegraph node)
Definition: IRenderer.hh:526
int numLights_
Number of Lights.
Definition: IRenderer.hh:499
Vec3f camDirWS_
direction the camera is looking to in world-space
Definition: IRenderer.hh:551
std::vector< ACG::RenderObjectModifier * > renderObjectModifiers_
active render object modifiers
Definition: IRenderer.hh:523
DrawModeProperties stores a set of properties that defines, how to render an object.
Definition: DrawModes.hh:177
GLint prevVAO_
previously bound VAO
Definition: IRenderer.hh:566
std::map< int, ACG::FBO * > depthMaps_
Definition: IRenderer.hh:536
bool depthMapUsed_
true if at least one renderobject requires a scene depthmap, false otherwise
Definition: IRenderer.hh:539
GLMatrixf viewMatrix_
view transform
Definition: IRenderer.hh:545
std::vector< RenderObject * > lineGL42Objects_
default line render objects that are rendered with gl4.2
Definition: IRenderer.hh:597
std::vector< int > sortListOverlays_
map sortedID -> original renderObjectID
Definition: IRenderer.hh:514
ACG::Vec3f globalLightModelAmbient_
Definition: IRenderer.hh:506
Interface class between scenegraph and renderer.
Definition: RenderObject.hh:98
GLint prevFbo_
previous fbo
Definition: IRenderer.hh:554
const RenderObjectRange & getCollectedSubtreeObjects() const
Definition: IRenderer.hh:493
std::vector< ACG::RenderObject * > sortedObjects_
sorted list of renderobjects without overlay objects (sorted in rendering order)
Definition: IRenderer.hh:517