raSystem  1.0 bata
raNode.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 namespace System
3 {
4  raNode::raNode(raSmartPointer<raDirectX> dx, LPCSTR strName, raNode* pParent) : raRender(dx, NULL, strName)
5  {
6  m_pParent = pParent;
7  m_pChild = NULL;
8  m_pSibling = NULL;
9 
10  m_pMesh = NULL;
11  }
12 
14  {
15  if(m_pMesh) m_pMesh->Destroy();
17  if(m_pChild) m_pChild->Destroy();
18  }
19 
21  {
22  delete m_pMesh;
23  delete m_pSibling;
24  delete m_pChild;
25  }
26 
27  void raNode::SetVisual(raVisual* pVisual)
28  {
29  if(!m_pMesh)m_pMesh = pVisual;
30  FindRoot()->m_Meshes.push_back(pVisual);
31  }
32 
33  void raNode::SetChild(raNode* pChild)
34  {
35  if(! m_pChild) //erstes Kind
36  m_pChild = pChild;
37  else
38  m_pChild->SetSibling(pChild);
39  }
40 
42  {
43  if (strstr(m_Name, "Locator"))
44  {
45  //SetVisual(pVisual);
46  pGroup->AddInstance(*GetWorldMatrix());
47  }
48 
49  //Geschwister
50  if(m_pSibling)
52 
53  //Kinder
54  if(m_pChild)
55  m_pChild->SetLocatorMarkers(pGroup);
56  }
57  void raNode::SetSelected(bool bSelected)
58  {
59  if(m_pMesh)
60  m_pMesh->SetSelected(bSelected);
61 
62  if(m_pSibling)
63  m_pSibling->SetSelected(bSelected);
64 
65  //Kinder
66  if(m_pChild)
67  m_pChild->SetSelected(bSelected);
68  }
69  void raNode::SetSibling(raNode* pSibling)
70  {
71  if(!m_pSibling) //Erstes Geschwister
72  m_pSibling = pSibling;
73  else //Probieren wir's bei den Geschwistern
74  m_pSibling->SetSibling(pSibling);
75  }
76 
77  void raNode::TransformFrame(raMatrix* pParentWorld)
78  {
79  m_WorldTransformed = m_World * (*pParentWorld);
80 
81  if(m_pMesh)
82  {
84  }
85 
86  //Geschwister
87  if(m_pSibling)
88  m_pSibling->TransformFrame(pParentWorld);
89 
90  //Kinder
91  if(m_pChild)
93  }
94 
95  void raNode::SetWorldMatrix (const raMatrix& value)
96  {
98  if(m_pParent)
99  TransformFrame(m_pParent->GetWorldMatrix()); //Weil nicht in Update aufgerufen wird
100  else
101  {
102  raMatrix identity;
103  identity = raMatrixIdentity();
104  TransformFrame(&identity);
105  }
106  }
107 
108  void raNode::SetVisible (bool bVisible)
109  {
110  if(m_pMesh)
111  m_pMesh->SetVisible(bVisible);
112 
113  //Geschwister
114  if(m_pSibling)
115  m_pSibling->SetVisible(bVisible);
116 
117  //Kinder
118  if(m_pChild)
119  m_pChild->SetVisible(bVisible);
120  }
121 
123  {
124  if(m_pMesh) m_pMesh->Create();
125 
126  //Geschwister
127  if(m_pSibling)
128  m_pSibling->Create();
129 
130  //Kinder
131  if(m_pChild)
132  m_pChild->Create();
133 
134  return true;
135  }
136 
137  bool raNode::Render(UINT drawOrder, const raMatrix& pView, const raMatrix& pProj,
138  const raLight* pLight, LPCSTR techniqueName)
139  {
140  if(m_pMesh)
141  {
142  m_pMesh->Render(drawOrder, pView, pProj, pLight, techniqueName);
143  }
144 
145  //Geschwister
146  if(m_pSibling)
147  m_pSibling->Render(drawOrder, pView, pProj, pLight, techniqueName);
148 
149  //Kinder
150  if(m_pChild)
151  m_pChild->Render(drawOrder, pView, pProj, pLight, techniqueName);
152 
153  return true;
154  }
155 
156  bool raNode::Update(float fTime, float fElapsedTime)
157  {
158  if(m_pMesh) m_pMesh->Update(fTime, fElapsedTime);
159 
160  //Geschwister
161  if(m_pSibling)
162  m_pSibling->Update(fTime, fElapsedTime);
163 
164  //Kinder
165  if(m_pChild)
166  m_pChild->Update(fTime, fElapsedTime);
167 
168  return true;
169  }
170 
172  {
173  if(m_pParent) return m_pParent->FindRoot();
174  return this;
175  }
176 
177  raNode* raNode::FindNode(LPCSTR strName)
178  {
179  if(!strcmp(m_Name, strName))
180  {
181  return this;
182  }
183 
184  //Geschwister
185  if(m_pSibling)
186  {
187  raNode* praNode = m_pSibling->FindNode(strName);
188  if(praNode) return praNode;
189  }
190 
191  //Kinder
192  if(m_pChild)
193  {
194  raNode* praNode = m_pChild->FindNode(strName);
195  if(praNode) return praNode;
196  }
197 
198  return NULL;
199  }
200 
201  bool raNode::Intersects(const raVector3* pRayPos,
202  const raVector3* pRayDir,
203  float* pDist)
204  {
205  bool bResult = false;
206  float dist = FLT_MAX;
207 
208  if(m_pMesh)
209  {
210  raVector3 rayPos;
211  raVector3 rayDir;
212 
213  raMatrix inverseWorld;
214  D3DXMatrixInverse((D3DXMATRIX *)&inverseWorld, NULL, (D3DXMATRIX *)&m_WorldTransformed);
215  D3DXVec3TransformCoord ((D3DXVECTOR3*)&rayPos, (D3DXVECTOR3*)pRayPos, (D3DXMATRIX*)&inverseWorld);
216  D3DXVec3TransformNormal((D3DXVECTOR3*)&rayDir, (D3DXVECTOR3*)pRayDir, (D3DXMATRIX*)&inverseWorld);
217 
218  if(m_pMesh->Intersects(&rayPos, &rayDir, &dist))
219  {
220  bResult = true;
221  if(dist < *pDist)
222  *pDist = dist;
223  }
224  }
225 
226  if(m_pSibling)
227  {
228  if(m_pSibling->Intersects(pRayPos, pRayDir, &dist))
229  {
230  bResult = true;
231  if(dist < *pDist)
232  *pDist = dist;
233  }
234  }
235 
236  if(m_pChild)
237  {
238  if(m_pChild->Intersects(pRayPos, pRayDir, &dist))
239  {
240  bResult = true;
241  if(dist < *pDist)
242  *pDist = dist;
243  }
244  }
245  return bResult;
246  }
247 
248  void raNode::TransformFrame(raMatrix* pParentWorld, UINT instanceNo)
249  {
250  m_WorldTransformed = m_World * (*pParentWorld);
251 
252  if(m_pMesh)
253  {
254  ((raGroup* )m_pMesh)->SetWorldMatrix(m_WorldTransformed, instanceNo);
255  }
256 
257  //Geschwister
258  if(m_pSibling)
259  m_pSibling->TransformFrame(pParentWorld, instanceNo);
260 
261  //Kinder
262  if(m_pChild)
264  }
265 };
virtual void Destroy()
Definition: raNode.cpp:13
virtual raMatrix * GetWorldMatrix()
Definition: raNode.h:19
virtual bool Create()
Definition: raNode.cpp:122
Definition: raLight.h:5
virtual void Destroy()
Definition: raVisual.cpp:100
std::vector< raVisual * > m_Meshes
Definition: raNode.h:60
raMatrix raMatrixIdentity()
Definition: raMatrix.h:211
virtual bool Create()
Definition: raVisual.cpp:45
raVisual * m_pMesh
Definition: raNode.h:57
raMatrix m_WorldTransformed
Definition: raNode.h:51
LPCSTR m_Name
Definition: raRender.h:35
raNode * m_pParent
Definition: raNode.h:53
raNode * m_pSibling
Definition: raNode.h:54
void SetLocatorMarkers(raGroup *pGroup)
Definition: raNode.cpp:41
Definition: raNode.h:8
virtual bool Intersects(const raVector3 *pRayPos, const raVector3 *pRayDir, float *pDist)
Definition: raRender.h:28
virtual void SetWorldMatrix(const raMatrix &value)
Definition: raNode.cpp:95
virtual void TransformFrame(raMatrix *pParentWorld)
Definition: raNode.cpp:77
virtual void SetSelected(bool bSelected)
Definition: raVisual.h:74
void SetVisual(raVisual *pVisual)
Definition: raNode.cpp:27
virtual bool Update(float fTime, float fRunTime)
Definition: raRender.h:17
virtual void SetVisible(bool bVisible)
Definition: raVisual.cpp:317
virtual bool Render(UINT drawOrder, const raMatrix &pView, const raMatrix &pProj, const raLight *pLight, LPCSTR techniqueName="")
Definition: raVisual.cpp:142
~raNode()
Definition: raNode.cpp:20
raNode * m_pChild
Definition: raNode.h:55
virtual void SetVisible(bool bVisible)
Definition: raNode.cpp:108
virtual bool Update(float fTime, float fElapsedTime)
Definition: raNode.cpp:156
raNode * FindNode(LPCSTR strName)
Definition: raNode.cpp:177
void SetSibling(raNode *pSibling)
Definition: raNode.cpp:69
virtual void SetSelected(bool bSelected)
Definition: raNode.cpp:57
virtual bool Intersects(const raVector3 *pRayPos, const raVector3 *pRayDir, float *pDist)
Definition: raNode.cpp:201
raMatrix m_World
Definition: raRender.h:34
raNode * FindRoot()
Definition: raNode.cpp:171
void SetChild(raNode *pChild)
Definition: raNode.cpp:33
UINT AddInstance(const raMatrix &world)
Definition: raGroupe.cpp:155
virtual void SetWorldMatrix(const raMatrix &value)
Definition: raRender.cpp:13
raNode(const GUID &raguid, raSmartPointer< raDirectX > dx, LPCSTR strName="raNode", raNode *pParent=NULL)
virtual bool Render(UINT drawOrder, const raMatrix &pView, const raMatrix &pProj, const raLight *pLight, LPCSTR techniqueName="")
Definition: raNode.cpp:137