Overte C++ Documentation
Args.h
1 //
2 // Created by Brad Hefta-Gaub on 10/29/14.
3 // Copyright 2013-2014 High Fidelity, Inc.
4 //
5 // Distributed under the Apache License, Version 2.0.
6 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7 //
8 
9 #pragma once
10 #ifndef hifi_render_Args_h
11 #define hifi_render_Args_h
12 
13 #include <functional>
14 #include <memory>
15 #include <stack>
16 #include <unordered_set>
17 
18 #include <GLMHelpers.h>
19 #include <ViewFrustum.h>
20 #include <StencilMaskMode.h>
21 #include <UUIDHasher.h>
22 
23 #include <gpu/Forward.h>
24 #include "Forward.h"
25 
26 class AABox;
27 
28 namespace render {
29  class RenderDetails {
30  public:
31  enum Type {
32  ITEM,
33  SHADOW,
34  OTHER
35  };
36 
37  struct Item {
38  int _considered = 0;
39  int _outOfView = 0;
40  int _tooSmall = 0;
41  int _rendered = 0;
42  };
43 
44  int _materialSwitches = 0;
45  int _trianglesRendered = 0;
46 
47  Item _item;
48  Item _shadow;
49  Item _other;
50 
51  Item& edit(Type type) {
52  switch (type) {
53  case SHADOW:
54  return _shadow;
55  case ITEM:
56  return _item;
57  default:
58  return _other;
59  }
60  }
61  };
62 
63 
64  class Args {
65  public:
66  enum RenderMode { DEFAULT_RENDER_MODE, SHADOW_RENDER_MODE, MIRROR_RENDER_MODE, SECONDARY_CAMERA_RENDER_MODE };
67  enum DisplayMode { MONO, STEREO_MONITOR, STEREO_HMD };
68  enum RenderMethod { DEFERRED, FORWARD };
69  enum DebugFlags {
70  RENDER_DEBUG_NONE = 0,
71  RENDER_DEBUG_HULLS = 1
72  };
73 
74  Args() {}
75 
76  Args(const gpu::ContextPointer& context,
77  float sizeScale = 1.0f,
78  int boundaryLevelAdjust = 0,
79  float lodFarAngleHalfTan = 0.1f,
80  float lodNearAngleHalfTan = 0.01f,
81  //float lodAngleHalfTan = 0.1f,
82  float lodFarDist = 200.0f,
83  float lodNearDist = 4.0f,
84  RenderMode renderMode = DEFAULT_RENDER_MODE,
85  DisplayMode displayMode = MONO,
86  RenderMethod renderMethod = DEFERRED,
87  DebugFlags debugFlags = RENDER_DEBUG_NONE,
88  gpu::Batch* batch = nullptr) :
89  _context(context),
90  _sizeScale(sizeScale),
91  _boundaryLevelAdjust(boundaryLevelAdjust),
92  _lodFarAngleHalfTan(lodFarAngleHalfTan),
93  _lodFarAngleHalfTanSq(lodFarAngleHalfTan * lodFarAngleHalfTan),
94  _lodNearAngleHalfTan(lodNearAngleHalfTan),
95  _lodNearAngleHalfTanSq(lodNearAngleHalfTan * lodNearAngleHalfTan),
96  _lodFarDist(lodFarDist),
97  _lodNearDist(lodNearDist),
98  _lodFarDistSq(lodFarDist * lodFarDist),
99  _lodNearDistSq(lodNearDist * lodNearDist),
100  _renderMode(renderMode),
101  _displayMode(displayMode),
102  _renderMethod(renderMethod),
103  _debugFlags(debugFlags),
104  _batch(batch) {
105  }
106 
107  bool hasViewFrustum() const { return _viewFrustums.size() > 0; }
108  void setViewFrustum(const ViewFrustum& viewFrustum) {
109  while (_viewFrustums.size() > 0) {
110  _viewFrustums.pop();
111  }
112  _viewFrustums.push(viewFrustum);
113  }
114  const ViewFrustum& getViewFrustum() const { assert(_viewFrustums.size() > 0); return _viewFrustums.top(); }
115  void pushViewFrustum(const ViewFrustum& viewFrustum) { _viewFrustums.push(viewFrustum); }
116  void popViewFrustum() { _viewFrustums.pop(); }
117 
118  bool isStereo() const { return _displayMode != MONO; }
119 
120  std::shared_ptr<gpu::Context> _context;
121  std::shared_ptr<gpu::Framebuffer> _blitFramebuffer;
122  std::shared_ptr<render::ShapePipeline> _shapePipeline;
123  std::stack<ViewFrustum> _viewFrustums;
124  glm::ivec4 _viewport { 0.0f, 0.0f, 1.0f, 1.0f };
125  glm::vec3 _boomOffset { 0.0f, 0.0f, 1.0f };
126 
127  float _sizeScale { 1.0f };
128  int _boundaryLevelAdjust { 0 };
129  float _lodFarAngleHalfTan{ 0.1f };
130  float _lodFarAngleHalfTanSq{ _lodFarAngleHalfTan * _lodFarAngleHalfTan };
131  float _lodNearAngleHalfTan{ 0.01f };
132  float _lodNearAngleHalfTanSq{ _lodNearAngleHalfTan * _lodNearAngleHalfTan };
133  float _lodFarDist { 200.0f };
134  float _lodNearDist { 4.0f };
135  float _lodFarDistSq { _lodFarDist * _lodFarDist };
136  float _lodNearDistSq { _lodNearDist * _lodNearDist };
137 
138  RenderMode _renderMode { DEFAULT_RENDER_MODE };
139  DisplayMode _displayMode { MONO };
140  RenderMethod _renderMethod { DEFERRED };
141  DebugFlags _debugFlags { RENDER_DEBUG_NONE };
142  gpu::Batch* _batch = nullptr;
143 
144  uint32_t _globalShapeKey { 0 };
145  uint32_t _itemShapeKey { 0 };
146  bool _enableTexturing { true };
147  bool _enableBlendshape { true };
148  bool _enableSkinning { true };
149 
150  bool _enableFade { false };
151 
152  RenderDetails _details;
153  render::ScenePointer _scene;
154  int8_t _cameraMode { -1 };
155 
156  std::function<void(gpu::Batch&, const gpu::TexturePointer&)> _hudOperator { nullptr };
157  gpu::TexturePointer _hudTexture { nullptr };
158 
159  bool _takingSnapshot { false };
160  StencilMaskMode _stencilMaskMode { StencilMaskMode::NONE };
161  std::function<void(gpu::Batch&)> _stencilMaskOperator;
162  };
163 
164 }
165 
166 using RenderArgs = render::Args;
167 
168 #endif // hifi_render_Args_h