All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Node.h
1 // Copyright eeGeo Ltd (2012-2014), All Rights Reserved
2 
3 #pragma once
4 
5 #include "Types.h"
6 #include "Models.h"
7 #include "PODNode.h"
8 #include "BoundingBox.h"
9 #include "VectorMath.h"
10 #include "Rendering.h"
11 #include "Lighting.h"
12 
13 #include <vector>
14 
15 #define NODE_NAME_MAXSIZE (100)
16 
17 namespace Eegeo
18 {
19  class FrustumRadar;
20 
21  class Node
22  {
23  private:
24 
25  IO::POD::PODNode m_podNode;
26  char m_szName [NODE_NAME_MAXSIZE];
27  u32 m_nameHash;
28 
29  Node* m_pParentNode;
30  s32 m_parentNodeID;
31 
32  std::vector <Node*> m_pChildNodes;
33 
34  std::vector <Node*>* m_pNodeList;
35 
36  ModelMaterial* m_pMaterial;
37  s32 m_materialID;
38 
39  ModelMesh* m_pMesh;
40  s32 m_meshID;
41 
42  Eegeo::m44 m_localMatrix;
43  Eegeo::m44 m_worldMatrix;
44 
45  Eegeo::m44 m_invPoseMatrix;
46 
47  Eegeo::BoundingBox m_box;
48  Eegeo::v3 m_worldMin;
49  Eegeo::v3 m_worldMax;
50  Eegeo::BoundingBox m_boxSubtree;
51 
52  Eegeo::v3 m_centre;
53  Eegeo::v3 m_centreSubtree;
54  float m_radius;
55  float m_radiusSubtree;
56 
57  bool m_visible;
58  bool m_dirty;
59  bool m_dirtyBB;
60 
61  void SetSkinMatrices ();
62 
63  void CalculateShereSuperset(Eegeo::v3& centre,
64  float& radius,
65  const Eegeo::v3& centre0,
66  float radius0,
67  const Eegeo::v3& centre1,
68  float radius1);
69 
70  void InitFromPODNode(const IO::POD::PODNode* podNode);
71 
72  public:
73 
74  Node();
75  ~Node();
76 
77  static Node* CreateFromPODNode(const IO::POD::PODNode* podNode);
78 
79  //void ParseFile (std::fstream& stream, u32 fileOffset, u32 fileSize);
80  void AssignObjects (std::vector<Node*> &nodeList, std::vector<ModelMesh*> &meshList, std::vector<ModelMaterial*> &materialList);
81 
82  void Update ();
83  void UpdateRecursive (bool dirtyParent = false);
84 
85  void UpdateBB (bool dirtyBB);
86  void UpdateSphere ();
87  void UpdateBBRecursive (bool dirtyParent = false);
88  void UpdateSphereRecursive(bool dirtyParent = false);
89 
90  void Draw (Eegeo::Rendering::GLState& glState, Eegeo::Lighting::GlobalFogging& fogging, Eegeo::FrustumRadar* pFrustum = NULL, const bool drawSolid=true, const bool drawAlpha=true);
91  void DrawSphere (Eegeo::Rendering::GLState& glState, Eegeo::Lighting::GlobalFogging& fogging, Eegeo::FrustumRadar* pFrustum = NULL, const bool drawSolid=true, const bool drawAlpha=true);
92 
93  void DrawRecursive (Eegeo::Rendering::GLState& glState, const Eegeo::Lighting::GlobalFogging& fogging, Eegeo::FrustumRadar* pFrustum, const bool drawSolid=true, const bool drawAlpha=true);
94  void DrawSphereRecursive (Eegeo::Rendering::GLState& glState, Eegeo::Lighting::GlobalFogging& fogging, Eegeo::FrustumRadar* pFrustum, const bool drawSolid=true, const bool drawAlpha=true);
95 
96  void AddChild (Node* pChildNode);
97 
98  void SetParentNode (Node* pParentNode);
99  Node* GetParentNode ();
100 
101  u32 GetNumChildNodes () { return static_cast<u32>(m_pChildNodes.size()); }
102  Node* GetChildNode ( u32 index ) { return m_pChildNodes[index]; }
103 
104  const Eegeo::IO::POD::PODNode& GetPodNode() { return m_podNode; }
105 
106  void SetMaterial (ModelMaterial* pMaterial);
107  ModelMaterial* GetMaterial ();
108 
109  void SetMesh (ModelMesh* pMesh);
110  ModelMesh* GetMesh ();
111 
112  const Eegeo::m44& GetLocalMatrix ();
113  void SetLocalMatrix (const Eegeo::m44& localMatrix);
114 
115  const Eegeo::m44& GetInvPoseMatrix () { return m_invPoseMatrix; }
116  void SetInvPoseMatrix (const Eegeo::m44& invPoseMatrix) { m_invPoseMatrix = invPoseMatrix; }
117 
118  const Eegeo::m44& GetWorldMatrix ();
119 
120  char* GetName ();
121  u32 GetNameHash () { return m_nameHash; }
122 
123  bool IsVisible ();
124  void SetVisible (bool boOnOff);
125 
126  void GetCentre (Eegeo::v3& centre) const { centre = m_centre; }
127  float GetRadius () const { return m_radius; }
128 
129  void GetMinExtent (Eegeo::v3& extent) const { extent = m_worldMin; }
130  void GetMaxExtent (Eegeo::v3& extent) const { extent = m_worldMax; }
131  void GetExtents (Eegeo::v3& min, Eegeo::v3& max) const { GetMinExtent(min); GetMaxExtent(max); }
132 
133  void GetCentreSubtree (Eegeo::v3& centre) const { centre = m_centreSubtree; }
134  float GetRadiusSubtree () const { return m_radiusSubtree; }
135 
136  static u32 TestSphere (Eegeo::FrustumRadar* pFrustum, const Eegeo::v3& centre, float radius);
137 
138  };
139 }