All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
RenderCamera.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "VectorMath.h"
6 #include "Frustum.h"
7 
8 namespace Eegeo
9 {
10  namespace Camera
11  {
15  {
16  public:
17 
18  RenderCamera();
19  ~RenderCamera();
20 
23  void SetEcefLocation(const Eegeo::dv3& ecefLocation);
24 
26  const Eegeo::dv3& GetEcefLocation() const { return m_ecefLocation; }
27 
29  float GetAltitude() const { return m_altitude; }
30 
32  void SetOrientationMatrix(const Eegeo::m33& m);
33 
40  void SetViewport(float x, float y, float width, float height);
41 
46  void SetProjection (float nominalVerticalFovRadians, float nearZ, float farZ);
47 
50  void SetProjectionMatrix (m44& projectionMatrix);
51 
55  void Project(const Eegeo::v3& cameraRelativeWorldPosition, Eegeo::v3& screenPosition) const;
56 
61  void Project360(const Eegeo::v3& cameraRelativeWorldPosition, Eegeo::v3& screenPosition) const;
62 
66  void UnProject(const Eegeo::v3& screenPosition, Eegeo::v3& cameraRelativeWorldPosition) const;
67 
69  const Eegeo::m44& GetModelMatrix() const { return m_modelMatrix; }
70 
72  const Eegeo::m44& GetViewMatrix() const;
73 
75  const Eegeo::m44& GetProjectionMatrix() const;
76 
78  const Eegeo::m44& GetViewProjectionMatrix() const;
79 
82 
84  float GetNearClip() const { return m_nearZ; }
85 
87  float GetFarClip() const { return m_farZ; }
88 
90  float GetNearClipRatio() const;
91 
93  float GetFOV() const { return m_fov; }
94 
96  float GetAspect() const { return m_aspect; }
97 
99  float GetViewportWidth() const { return m_viewportWidth; }
100 
102  float GetViewportHeight() const { return m_viewportHeight; }
103 
105  v2 GetViewportOrigin() const { return v2(m_viewportX, m_viewportY); }
106 
108  const Eegeo::Geometry::Frustum& GetFrustum() const;
109 
111  float CalculateEffectiveFOV() const;
112 
113  const static float NominalAspectRatio;
114  const static float MinAspectRatioForPortraitMode;
115 
116  private:
117  float m_nearZ;
118  float m_farZ;
119 
120  float m_fov;
121  float m_aspect;
122 
123  Eegeo::dv3 m_ecefLocation;
124  Eegeo::m44 m_modelMatrix;
125 
126 
127  float m_viewportX;
128  float m_viewportY;
129  float m_viewportWidth;
130  float m_viewportHeight;
131  float m_altitude;
132 
133  class CachedState
134  {
135  private:
136  Eegeo::m44 m_viewMatrix;
137  Eegeo::m44 m_projMatrix;
138  Eegeo::m44 m_viewProjMatrix;
139  Eegeo::m44 m_inverseViewProjMatrix;
140  Eegeo::Geometry::Frustum m_frustum;
141  std::vector<Geometry::Plane> m_scratchFrustumPlanes;
142 
143  bool m_projectionDirty;
144  bool m_viewDirty;
145  bool m_viewProjectionDirty;
146  bool m_frustumDirty;
147  public:
148 
149  CachedState();
150 
151  void InvalidateProjection() { m_projectionDirty = true; }
152  void InvalidateView() { m_viewDirty = true; }
153 
154  void InvalidateCachedTransforms();
155 
156  void SetExplicitProjection(Eegeo::m44& projectionMatrix);
157 
158  const Eegeo::m44& GetViewMatrix(const RenderCamera& camera);
159  const Eegeo::m44& GetProjectionMatrix(const RenderCamera& camera);
160  const Eegeo::m44& GetViewProjectionMatrix(const RenderCamera& camera);
161  const Eegeo::m44& GetInverseViewProjectionMatrix(const RenderCamera& camera);
162  const Eegeo::Geometry::Frustum& GetFrustum(const RenderCamera& camera);
163 
164  };
165 
166  mutable CachedState m_cachedState;
167 
168  void CalculateViewMatrix(Eegeo::m44& viewMatrix) const;
169  void CalculateProjectionMatrix(Eegeo::m44& projectionMatrix) const;
170  void ClipSpaceToScreenSpace(const Eegeo::v4& clipPosition, Eegeo::v3& screenPosition) const;
171  float CalculateTweakedNearPlaneHalfHeight() const;
172  };
173  }
174 }