raSystem  1.0 bata
raSceneManager.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace System
4 {
6  {
7  m_Camera = Camera;
8 
9  for(int i = 0; i < numLights; i++) m_Lights[i] = new raLight();
10 
11  m_dx = NULL;
12  m_pShadowReceiverMaterial = NULL;
13  m_bCreated = false;
14  }
15 
17  {
18  /*for(UINT i = 0; i < m_Visuals.size(); i++)
19  {
20  SAFE_DELETE(m_Visuals[i]);
21  }
22  SAFE_DELETE(m_pShadowReceiverMaterial);
23 
24  for(int i = 0; i < numLights; i++)
25  SAFE_DELETE(m_Lights[i]);*/
26 
27  m_dx = NULL;
28  }
30  {
31  m_Visuals.push_back(Object);
32  if(m_bCreated) Object->Create();
33  return true;
34  }
36  {
37  for(UINT i = 0; i < m_Visuals.size(); i++)
38  {
39  if(m_Visuals[i] == Object)
40  RemoveAt(i);
41  }
42  return false;
43  }
45  {
46  raRender* pObject = m_Visuals[i];
47  pObject->Destroy();
48  delete pObject;
49  m_Visuals.erase(m_Visuals.begin() + i);
50 
51  return true;
52  }
54  {
55  m_dx = dx;
56 
57  CreateCubeMapMatrices();
58 
59  for(UINT i = 0; i < m_Visuals.size(); i++)
60  {
61  m_Visuals[i]->Create();
62  }
63 
64  m_bCreated = true;
65 
66  //Gerenderter Schatten
67  m_pShadowReceiverMaterial = new raRTTMaterial(dx.get(),
68  "raEffects\\LightMapEffect.fx", "RenderWithLightMap",
69  D3D11_SRV_DIMENSION_TEXTURE2D, 1024, 1024, 1, DXGI_FORMAT_R32_FLOAT,
70  "g_shadowTexture");
71  m_pShadowReceiverMaterial->Create();
72 
73  return true;
74  }
76  {
77  for(UINT i = 0; i < m_Visuals.size(); i++)
78  {
79  if(m_Visuals[i]) m_Visuals[i]->Destroy();
80  }
81 
82  //Materialien aufräumen
83  //Die EffectMap hält eine eigene Referenz auf die Effekte, die auch
84  //freigegeben werden muss. Diese Referenz ist dafür gut, dass das
85  //Effekt-Objekt nicht gelöscht werden kann, wenn es einmal in der
86  //Effektmap drin ist - auch dann nicht, wenn es momentan nicht mehr
87  //verwendet wird.
88  raEffectMap::iterator iterator;
89  for(iterator = raMaterial::m_effects.begin();
90  iterator != raMaterial::m_effects.end();
91  iterator++)
92  {
93  SAFE_RELEASE(iterator->second);
94  }
95  }
96  void raSceneManager::Update(float fTime, float fRunTime)
97  {
98  raEffectMap::iterator iterator;
99  for(iterator = raMaterial::m_effects.begin();
100  iterator != raMaterial::m_effects.end();
101  iterator++)
102  {
103  ID3DX11Effect* pEffect = iterator->second;
104 
105  //Für Animationen
106  pEffect->GetVariableByName("g_fTime")->AsScalar()->SetFloat((float)fRunTime);
107  }
108  for(UINT i = 0; i < m_Visuals.size(); i++)
109  {
110  m_Visuals[i]->Update(fTime, fRunTime);
111  }
112  }
113  void raSceneManager::Render(const raMatrix& pView, const raMatrix &pProj, const raLight* pLight,
114  LPCSTR techniqueName)
115  {
116  SetupEffectVariables(pView, pProj);
117 
118  //Alternative: Vorsortieren nach DrawOrder
119  for(int drawOrder = 0; drawOrder < 5; drawOrder++)
120  {
121  for(UINT i = 0; i < m_Visuals.size(); i++)
122  {
123  m_Visuals[i]->Render(drawOrder, pView, pProj, pLight, techniqueName);
124  }
125  }
126  }
128  {
129  if(m_pShadowReceiverMaterial)
130  m_pShadowReceiverMaterial->Setup(); //Nicht in SetupEffectVariables, da nicht für Rendern in Lightmap
131 
132  Render(m_Camera->GetViewMatrix(),
133  m_Camera->GetProjMatrix(),
134  &m_Light);
135  }
137  {
138  return m_Visuals[index];
139  }
141  {
142  for(UINT i = 0; i < m_Visuals.size(); i++)
143  {
144  m_Visuals[i]->SetVisible(show);
145  }
146  }
147 
148  void raSceneManager::SetupEffectVariables(const raMatrix& pView, const raMatrix& pProj)
149  {
150  raVector3 camPos(*m_Camera->GetEyePt());
151 
152  raEffectMap::iterator iterator;
153  for(iterator = raMaterial::m_effects.begin();
154  iterator != raMaterial::m_effects.end();
155  iterator++)
156  {
157  ID3DX11Effect* pEffect = iterator->second;
158 
159  SetupLights(pEffect, &m_Light);
160 
161  ID3DX11EffectMatrixVariable* pmView = pEffect->GetVariableByName("g_mView")->AsMatrix();
162  if(pmView) pmView->SetMatrix((float*)&pView);
163 
164  ID3DX11EffectMatrixVariable* pmProj = pEffect->GetVariableByName("g_mProj")->AsMatrix();
165  if(pmProj) pmProj->SetMatrix((float*)&pProj);
166 
167  ID3DX11EffectVectorVariable* pmCamPos = pEffect->GetVariableByName("g_cameraPos")->AsVector();
168  if(pmCamPos) pmView->SetMatrix((float*)&camPos);
169  }
170  }
171  void raSceneManager::SetupLights(ID3DX11Effect* pEffect, const raLight* pLight)
172  {
173  ID3DX11EffectVectorVariable* pLightPosVariable =
174  pEffect->GetVariableByName("g_LightPos" )->AsVector();
175  raVector4 lightPos(pLight->m_Position.x, pLight->m_Position.y, pLight->m_Position.z, 1);
176  if(pLightPosVariable)
177  pLightPosVariable->SetFloatVector((float*)&lightPos);
178 
179  ID3DX11EffectVectorVariable* pLightDirVariable =
180  pEffect->GetVariableByName("g_vLightDir" )->AsVector();
181  raVector3 lightDir = pLight->m_Direction;
182  if(pLightDirVariable)
183  pLightDirVariable->SetFloatVector((float*)&lightDir);
184 
185  ID3DX11EffectVectorVariable* pLightDiffuseVariable =
186  pEffect->GetVariableByName("g_LightDiffuse" )->AsVector();
187  if(pLightDiffuseVariable)
188  pLightDiffuseVariable->SetFloatVector((float*)&pLight->m_DiffuseColor);
189  ID3DX11EffectVectorVariable* pAmbientVariable =
190  pEffect->GetVariableByName("g_LightAmbientColor" )->AsVector();
191  if(pAmbientVariable)
192  pAmbientVariable->SetFloatVector((float*)&pLight->m_AmbientColor);
193 
194  ID3DX11EffectVectorVariable* pLightSpecularVariable =
195  pEffect->GetVariableByName("g_LightSpecular" )->AsVector();
196  if(pLightSpecularVariable)
197  {
198  raVector4 lightSpec = raVector4(1.0f, 1.0f, 1.0f, 1.0f);
199  pLightSpecularVariable->SetFloatVector((float*)&lightSpec);
200  }
201  ID3DX11EffectScalarVariable* pLightSpecularPowerVariable =
202  pEffect->GetVariableByName("g_SpecularPower" )->AsScalar();
203  if(pLightSpecularPowerVariable)
204  pLightSpecularPowerVariable->SetInt(64);
205 
206  ID3DX11EffectVectorVariable* pLightPosViewSpaceVariable =
207  pEffect->GetVariableByName("g_LightPosViewSpace" )->AsVector();
208  raVector4 lightPosViewSpace;
209  D3DXVec4Transform((D3DXVECTOR4*)&lightPosViewSpace, (D3DXVECTOR4*)&lightPos,
210  (D3DXMATRIX*)&m_Camera->GetViewMatrix());
211  if(pLightPosViewSpaceVariable)
212  pLightPosViewSpaceVariable->SetFloatVector((float*)&lightPosViewSpace);
213 
214  ID3DX11EffectVectorVariable* pLightDirViewSpaceVariable =
215  pEffect->GetVariableByName("g_LightDirViewSpace" )->AsVector();
216  raVector3 lightDirViewSpace;
217  D3DXVec3TransformNormal((D3DXVECTOR3*)&lightDirViewSpace, (D3DXVECTOR3*)&lightDir,
218  (D3DXMATRIX*)&m_Camera->GetViewMatrix());
219  lightDirViewSpace = raVector3Normalize(lightDirViewSpace);
220  if(pLightDirViewSpaceVariable)
221  pLightDirViewSpaceVariable->SetFloatVector((float*)&lightDirViewSpace);
222 
223  ID3DX11EffectVectorVariable* pLightAttenuationVariable =
224  pEffect->GetVariableByName("g_LightAttenuation" )->AsVector();
225  if(pLightAttenuationVariable)
226  pLightAttenuationVariable->SetFloatVector((float*)&pLight->m_Attenuation);
227 
228  //Spotlight
229  ID3DX11EffectScalarVariable* pcosHalfPhiVariable =
230  pEffect->GetVariableByName("g_cosHalfPhi" )->AsScalar();
231  if(pcosHalfPhiVariable) pcosHalfPhiVariable->SetFloat(
232  pLight->m_cosHalfPhi);
233  ID3DX11EffectScalarVariable* pcosHalfThetaVariable =
234  pEffect->GetVariableByName("g_cosHalfTheta" )->AsScalar();
235  if(pcosHalfThetaVariable) pcosHalfThetaVariable->SetFloat(
236  pLight->m_cosHalfTheta);
237 
238  for(int i = 0; i < numLights; i++)
239  {
240  ID3DX11EffectVariable* pLightVariable = pEffect->
241  GetVariableByName("g_Lights")->GetElement(i);
242 
243  raVector4 lightPos = raVector4(m_Lights[i]->m_Position.x, m_Lights[i]->m_Position.y,
244  m_Lights[i]->m_Position.z , 1.0f);
245  pLightVariable->GetMemberByName("Position")->AsVector()->
246  SetFloatVector((float*)&lightPos);
247 
248  raVector3 lightDir = m_Lights[i]->m_Direction;
249  pLightVariable->GetMemberByName("Direction")->AsVector()->
250  SetFloatVector((float*)&lightDir);
251 
252  raVector4 lightPosViewSpace;
253  D3DXVec4Transform((D3DXVECTOR4*)&lightPosViewSpace, (D3DXVECTOR4*)&lightPos,
254  (D3DXMATRIX*)&m_Camera->GetViewMatrix());
255  pLightVariable->GetMemberByName("PosViewSpace")->AsVector()->
256  SetFloatVector((float*)&lightPosViewSpace);
257 
258  raVector3 lightDirViewSpace;
259  D3DXVec3TransformNormal((D3DXVECTOR3*)&lightDirViewSpace, (D3DXVECTOR3*)&lightDir,
260  (D3DXMATRIX*)&m_Camera->GetViewMatrix());
261  lightDirViewSpace = raVector3Normalize(lightDirViewSpace);
262  pLightVariable->GetMemberByName("DirViewSpace")->AsVector()->
263  SetFloatVector((float*)&lightDirViewSpace);
264 
265  pLightVariable->GetMemberByName("Attenuation")->AsVector()->
266  SetFloatVector((float*)&m_Lights[i]->m_Attenuation);
267 
268  pLightVariable->GetMemberByName("cosHalfPhi")->AsScalar()->
269  SetFloat(m_Lights[i]->m_cosHalfPhi);
270  pLightVariable->GetMemberByName("cosHalfTheta")->AsScalar()->
271  SetFloat(m_Lights[i]->m_cosHalfTheta);
272 
273  pLightVariable->GetMemberByName("Diffuse")->AsVector()->
274  SetFloatVector((float*)&m_Lights[i]->m_DiffuseColor);
275  pLightVariable->GetMemberByName("Ambient")->AsVector()->
276  SetFloatVector((float*)&m_Lights[i]->m_AmbientColor);
277  }
278  }
279  void raSceneManager::RenderToTexture(ID3D11RenderTargetView* pRTView, ID3D11DepthStencilView* pDSView)
280  {
281  ID3D11RenderTargetView* pOldRenderTargetViews[1] = { NULL };
282  ID3D11DepthStencilView* pOldDepthStencilView = NULL;
283 
284  m_dx->GetImmediateContext()->OMGetRenderTargets(1, pOldRenderTargetViews,
285  &pOldDepthStencilView);
286 
287  if(!pDSView) pDSView = pOldDepthStencilView;
288 
289  //Render Target setzen
290  ID3D11RenderTargetView* pRenderTargetViews[1] = { pRTView };
291  m_dx->GetImmediateContext()->OMSetRenderTargets(1, pRenderTargetViews,
292  pDSView);
293 
294  float ClearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; //Muss schwarz sein, da beim Glow-EFfekt das in die Textur gerenderte Bild additiv über die Szene gelegt wird
295  m_dx->GetImmediateContext()->ClearRenderTargetView(pRTView, ClearColor );
296  m_dx->GetImmediateContext()->ClearDepthStencilView(pDSView, D3D11_CLEAR_DEPTH, 1.0, 0);
297 
298  Render();
299 
300  m_dx->GetImmediateContext()->OMSetRenderTargets(1, pOldRenderTargetViews,
301  pOldDepthStencilView);
302 
303  SAFE_RELEASE( pOldRenderTargetViews[0]);
304  SAFE_RELEASE( pOldDepthStencilView);
305  }
307  {
308  RenderToTexture(renderScreen.m_pRTView,
309  renderScreen.m_pDSView,
310  renderScreen.m_Width,
311  renderScreen.m_Height);
312  }
313  void raSceneManager::RenderToTexture(ID3D11RenderTargetView* pRTView, ID3D11DepthStencilView* pDSView,
314  UINT width, UINT height)
315  {
316  D3D11_VIEWPORT OldVP;
317  SetViewport(&OldVP, width, height);
318 
319  RenderToTexture(pRTView, pDSView);
320 
321  m_dx->GetImmediateContext()->RSSetViewports(1, &OldVP);
322  }
323  void raSceneManager::CreateCubeMapMatrices()
324  {
325  float fHeight = 0.0f;//1.5f;
326  raVector3 vEyePt = raVector3( 0.0f, fHeight, 0.0f );
327  raVector3 vLookDir;
328  raVector3 vUpDir;
329  //0 = rechts, 1 = links, 2 = oben
330  //3 = unten, 4 = vorn, 5 = hinten
331 
332  vLookDir = raVector3( 1.0f, fHeight, 0.0f );
333  vUpDir = raVector3( 0.0f, 1.0f, 0.0f );
334  D3DXMatrixLookAtLH((D3DXMATRIX*)&m_CubeMapViewAdjust[0], (D3DXVECTOR3*)&vEyePt,
335  (D3DXVECTOR3*)&vLookDir, (D3DXVECTOR3*)&vUpDir );
336  vLookDir = raVector3(-1.0f, fHeight, 0.0f );
337  vUpDir = raVector3( 0.0f, 1.0f, 0.0f );
338  D3DXMatrixLookAtLH( (D3DXMATRIX*)&m_CubeMapViewAdjust[1], (D3DXVECTOR3*)&vEyePt,
339  (D3DXVECTOR3*)&vLookDir, (D3DXVECTOR3*)&vUpDir );
340  vLookDir = raVector3( 0.0f, fHeight+1.0f, 0.0f );
341  vUpDir = raVector3( 0.0f, 0.0f,-1.0f );
342  D3DXMatrixLookAtLH( (D3DXMATRIX*)&m_CubeMapViewAdjust[2], (D3DXVECTOR3*)&vEyePt,
343  (D3DXVECTOR3*)&vLookDir, (D3DXVECTOR3*)&vUpDir );
344  vLookDir = raVector3( 0.0f, fHeight-1.0f, 0.0f );
345  vUpDir = raVector3( 0.0f, 0.0f, 1.0f );
346  D3DXMatrixLookAtLH( (D3DXMATRIX*)&m_CubeMapViewAdjust[3], (D3DXVECTOR3*)&vEyePt,
347  (D3DXVECTOR3*)&vLookDir, (D3DXVECTOR3*)&vUpDir );
348  vLookDir = raVector3( 0.0f, fHeight, 1.0f );
349  vUpDir = raVector3( 0.0f, 1.0f, 0.0f );
350  D3DXMatrixLookAtLH( (D3DXMATRIX*)&m_CubeMapViewAdjust[4], (D3DXVECTOR3*)&vEyePt,
351  (D3DXVECTOR3*)&vLookDir, (D3DXVECTOR3*)&vUpDir );
352  vLookDir = raVector3( 0.0f, fHeight,-1.0f );
353  vUpDir = raVector3( 0.0f, 1.0f, 0.0f );
354 
355  D3DXMatrixLookAtLH( (D3DXMATRIX*)&m_CubeMapViewAdjust[5], (D3DXVECTOR3*)&vEyePt,
356  (D3DXVECTOR3*)&vLookDir, (D3DXVECTOR3*)&vUpDir );
357 
358  D3DXMatrixPerspectiveFovLH( (D3DXMATRIX*)&m_ProjCM, PI * 0.5f, 1.0f, .5f, 1000.f );
359  }
360 
361  void raSceneManager::SetViewport(D3D11_VIEWPORT* pOldVP, UINT width, UINT height)
362  {
363  UINT numViewports = 1;
364  m_dx->GetImmediateContext()->RSGetViewports(&numViewports, pOldVP);
365 
366  D3D11_VIEWPORT viewport;
367  viewport.Height = (float)height;
368  viewport.Width = (float)width;
369  viewport.MinDepth = 0;
370  viewport.MaxDepth = 1;
371  viewport.TopLeftX = 0;
372  viewport.TopLeftY = 0;
373 
374  m_dx->GetImmediateContext()->RSSetViewports(1, &viewport);
375  }
376  void raSceneManager::RenderToCubeMap(raRenderScreen& renderScreen, raMatrix& worldCenter)
377  {
378  RenderToCubeMap(renderScreen.m_pRTView,
379  renderScreen.m_pDSView,
380  renderScreen.m_Width,
381  renderScreen.m_Height,
382  worldCenter);
383  }
384  void raSceneManager::RenderToCubeMap(ID3D11RenderTargetView* pRTView, ID3D11DepthStencilView* pDSView,
385  UINT width, UINT height, raMatrix& worldCenter)
386  {
387  D3D11_VIEWPORT OldVP;
388  SetViewport(&OldVP, width, height);
389 
390  ID3D11RenderTargetView* pOldRenderTargetViews[1] = { NULL };
391  ID3D11DepthStencilView* pOldDepthStencilView = NULL;
392  m_dx->GetImmediateContext()->OMGetRenderTargets(1, pOldRenderTargetViews,
393  &pOldDepthStencilView);
394 
395  //Render Target setzen
396  ID3D11RenderTargetView* pRenderTargetViews[1] = { pRTView };
397  m_dx->GetImmediateContext()->OMSetRenderTargets(1, pRenderTargetViews,
398  pDSView);
399 
400  float ClearColor[4] = { 0.5, 0.0, 1.0, 0.0 };
401  m_dx->GetImmediateContext()->ClearRenderTargetView(pRTView, ClearColor );
402  m_dx->GetImmediateContext()->ClearDepthStencilView(pDSView, D3D11_CLEAR_DEPTH, 1.0,
403  0);
404 
405  //6 View-Matrizen
406  raMatrix mViewAlignCM;
407  mViewAlignCM = raMatrixIdentity();
408  mViewAlignCM.m41 = -worldCenter.m41;
409  mViewAlignCM.m42 = -worldCenter.m42;
410  mViewAlignCM.m43 = -worldCenter.m43;
411 
412  raMatrix ViewCM[6];
413  for(int view = 0; view < 6; ++view )
414  {
415  ViewCM[view] = mViewAlignCM * m_CubeMapViewAdjust[view];
416  }
417 
418  raEffectMap::iterator iterator;
419  for(iterator = raMaterial::m_effects.begin();
420  iterator != raMaterial::m_effects.end();
421  iterator++)
422  {
423  ID3DX11Effect* pEffect = iterator->second;
424  ID3DX11EffectMatrixVariable* pmViewCM = pEffect->
425  GetVariableByName("g_mViewCM" )->AsMatrix();
426  if(pmViewCM)
427  pmViewCM->SetMatrixArray((float*)ViewCM, 0, 6);
428  }
429 
430  Render(ViewCM[0], m_ProjCM, &m_Light, "RenderToCubeMap");
431 
432  m_dx->GetImmediateContext()->RSSetViewports( 1, &OldVP );
433  m_dx->GetImmediateContext()->OMSetRenderTargets(1, pOldRenderTargetViews,
434  pOldDepthStencilView);
435 
436  SAFE_RELEASE( pOldRenderTargetViews[0]);
437  SAFE_RELEASE( pOldDepthStencilView);
438  }
439 };
raColor m_DiffuseColor
Definition: raLight.h:12
raFloat y
Definition: raVector3.h:13
Definition: raLight.h:5
raFloat x
Definition: raVector3.h:12
virtual void Destroy()
Definition: raRender.h:12
raMatrix raMatrixIdentity()
Definition: raMatrix.h:211
void SetupLights(ID3DX11Effect *pEffect, const raLight *pLight)
virtual void Destroy()
raVector3 raVector3Normalize(const raVector3 &v)
Definition: raVector3.h:60
raFloat z
Definition: raVector3.h:14
virtual bool Create(raSmartPointer< raDirectX > dx)
interface ID3DX11EffectVectorVariable ID3DX11EffectVectorVariable
Definition: d3dx11effect.h:278
bool RemoveAt(int i)
ID3D11DepthStencilView * m_pDSView
static raEffectMap m_effects
Definition: raMaterial.h:48
raVector4 m_Attenuation
Definition: raLight.h:16
raVector3 m_Position
Definition: raLight.h:10
raColor m_AmbientColor
Definition: raLight.h:13
virtual void Update(float fTime, float fRunTime)
float m41
Definition: raMatrix.h:12
interface ID3DX11Effect ID3DX11Effect
interface ID3DX11EffectScalarVariable ID3DX11EffectScalarVariable
Definition: d3dx11effect.h:277
interface ID3DX11EffectVariable ID3DX11EffectVariable
Definition: d3dx11effect.h:266
raVector3 m_Direction
Definition: raLight.h:11
virtual void Render()
raRender * GetItem(int index)
void SetupEffectVariables(const raMatrix &pView, const raMatrix &pProj)
raSceneManager(raSmartPointer< raCamera > Camera)
bool Remove(raRender *Object)
bool Add(raRender *Object)
interface ID3DX11EffectMatrixVariable ID3DX11EffectMatrixVariable
Definition: d3dx11effect.h:279
void RenderToCubeMap(raRenderScreen &renderScreen, raMatrix &worldCenter)
#define SAFE_RELEASE(p)
Definition: d3dxGlobal.h:22
#define PI
Definition: raMain.h:129
float m_cosHalfPhi
Definition: raLight.h:19
virtual bool Create()
Definition: raRender.h:11
ID3D11RenderTargetView * m_pRTView
void ShowAllObjects(bool show)
float m_cosHalfTheta
Definition: raLight.h:20
float m43
Definition: raMatrix.h:12
virtual bool Create()
void RenderToTexture(raRenderScreen &renderScreen)
float m42
Definition: raMatrix.h:12
T * get() const