All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
RoadNamesRenderableFilter.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "Types.h"
6 #include "IRenderableFilter.h"
7 #include "Rendering.h"
8 #include "Roads.h"
9 #include "RoadNamesFadeController.h"
10 #include "VectorMath.h"
11 #include "EnvironmentFlatteningService.h"
12 #include "RenderContext.h"
13 #include "ISceneElementSource.h"
14 #include "TextRenderable.h"
15 #include "SceneElement.h"
16 #include "RenderQueue.h"
17 #include "RenderCamera.h"
18 
19 #include <vector>
20 
21 namespace Eegeo
22 {
23  namespace Resources
24  {
25  namespace Roads
26  {
27  const float FadeOffsetHeight = 5.0f;
28 
30  {
31  public:
34  const Rendering::EnvironmentFlatteningService& environmentFlatteningService,
35  const Resources::Roads::RoadNamesFadeController& roadNamesFadeController
36  )
37  : m_sceneElementsSource(sceneElementsSource)
38  , m_environmentFlatteningService(environmentFlatteningService)
39  , m_roadNamesFadeController(roadNamesFadeController)
40  , m_enabled(true)
41  {
42  }
43 
44  void EnqueueRenderables(const Rendering::RenderContext& renderContext, Rendering::RenderQueue& renderQueue)
45  {
46  if(!m_enabled)
47  return;
48 
49  const float fadeParam = m_roadNamesFadeController.GetFadeParam();
50 
51  if(fadeParam > 0.0f)
52  {
53  const float environmentFlatteningScale = m_environmentFlatteningService.GetCurrentScale();
54  const float fadeOffsetMagnitude = FadeOffsetHeight * (1.0f - fadeParam);
55 
56 
57  const Camera::RenderCamera& renderCamera = renderContext.GetRenderCamera();
58 
59  const dv3& ecefCameraPosition = renderCamera.GetEcefLocation();
60  const m44& viewProjection = renderCamera.GetViewProjectionMatrix();
61 
63  typedef std::vector<TSceneElement*> TSceneElementPtrVec;
64  TSceneElementPtrVec sceneElements;
65  m_sceneElementsSource.GetSceneElements(sceneElements);
66 
67  for (TSceneElementPtrVec::const_iterator it = sceneElements.begin(); it != sceneElements.end(); ++it)
68  {
69  const TSceneElement* pSceneElement = (*it);
70 
71  if(pSceneElement->IsInSceneGraph())
72  {
73  Rendering::Renderables::TextRenderable& renderable = pSceneElement->GetResource();
74 
75  Eegeo::v3 up = renderable.GetEcefPosition().ToSingle().Norm();
76 
77 
78  const v3 flattening = up * (environmentFlatteningScale - 1.f);
79  renderable.SetScale(flattening);
80 
81  const v3 fadeOffset = up*fadeOffsetMagnitude;
82 
83  const m44& mvp = CalcMVP(renderable.GetEcefPosition(), ecefCameraPosition, viewProjection, fadeOffset);
84 
85  renderable.SetModelViewProjection(mvp);
86  renderable.SetAlpha(fadeParam);
87 
88  renderQueue.EnqueueRenderable(&renderable);
89  }
90  }
91  }
92  }
93 
94  void SetEnabled(bool enabled) { m_enabled = enabled;}
95 
96  private:
97  Eegeo::m44 CalcMVP(const dv3& ecefPosition, const dv3& ecefCameraPosition, const m44& viewProjection, const v3& fadeOffset) const
98  {
99  v3 cameraLocalPos = (ecefPosition - ecefCameraPosition).ToSingle();
100  cameraLocalPos += fadeOffset;
101  Eegeo::m44 model, mvp;
102  model.Identity();
103  model.SetRow(3, Eegeo::v4(cameraLocalPos, 1));
104  Eegeo::m44::Mul(mvp, viewProjection, model);
105  return mvp;
106  }
107 
109  const Rendering::EnvironmentFlatteningService& m_environmentFlatteningService;
110  const Resources::Roads::RoadNamesFadeController& m_roadNamesFadeController;
111  bool m_enabled;
112  };
113  }
114  }
115 }