raSystem  1.0 bata
raVisual.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace System
4 {
5  raString raVisual::EffectfileName("raEffects\\MyEngine.fx");
6  raString raVisual::TechniqueName("RenderWithMaterialColor");
8  raString raVisual::SkinnedEffectfileName("raEffects\\Animation.fx");
9  raString raVisual::SkinnedEffectfileName2("raEffects\\AnimationFromTex.fx");
10  raString raVisual::SkinnedTechniqueName("RenderAnimationNoTexSelectable");
11  raString raVisual::SkinnedTexturedTechniqueName("RenderAnimationSelectable");
12 
13  raVisual::raVisual(raSmartPointer<raDirectX> dx, bool bAlpha, bool bAdditive,
14  bool bDepthDisable, D3D11_FILL_MODE fillMode,
15  D3D11_CULL_MODE cullMode) : raRender(dx),
16  m_bbMin(-FLT_MAX, -FLT_MAX, -FLT_MAX),
17  m_bbMax(FLT_MAX, FLT_MAX, FLT_MAX)
18  {
19  m_dx = dx;
20  m_DrawOder = 1;
21  m_numMaterials = 0;
22  m_pMaterials = NULL;
23  m_bAlpha = bAlpha;
24  m_bAdditive = bAdditive;
25  m_bDepthDisable = bDepthDisable;
26  m_sampleMask = 0xffffffff;
27  m_pAlphaBlendState = NULL;
28  m_pOldAlphaBlendState = NULL;
29  m_pDepthStencilState = NULL;
31  m_pRasterState = NULL;
32  m_pOldRasterState = NULL;
33  m_FillMode = fillMode;
34  m_CullMode = cullMode;
35  m_bVisible = true;
36  }
38  {
39  /*for(DWORD i = 0; i < m_numMaterials; i++)
40  {
41  SAFE_DELETE(m_pMaterials[i]);
42  }
43  SAFE_DELETE_ARRAY(m_pMaterials);*/
44  }
46  {
47  bool result = true;
48 
49  if(!CreateMesh())
50  {
51  RERROR("Beim Erstellen des Meshs");
52  return false;
53  }
56 
57  m_pAlphaBlendState = NULL;
58  if(m_bAlpha) result = CreateAlphaBlendState();
59  if(!result)
60  {
61  RERROR("Beim Erstellen des AlphaBlendState");
62  return false;
63  }
64 
65  m_pDepthStencilState = NULL;
67  if(!result)
68  {
69  RERROR("Beim Erstellen des DepthStencilState");
70  return false;
71  }
72 
73  m_pRasterState = NULL;
74  if(m_FillMode != D3D11_FILL_SOLID ||
75  m_CullMode != D3D11_CULL_BACK)
76  result = CreateRasterizerState();
77  if(!result)
78  {
79  RERROR("Beim Erstellen des RasterizerState");
80  return false;
81  }
82 
83  result = CreateVertexLayout();
84  if(!result)
85  {
86  RERROR("Beim Erstellen des VertexLayout");
87  return false;
88  }
89 
90  ROK("raVisual erstellt");
91  return true;
92  }
94  {
95  for(DWORD matNo = 0; matNo < m_numMaterials; matNo++)
96  {
97  if(m_pMaterials[matNo]) m_pMaterials[matNo]->Create();
98  }
99  }
101  {
102  /*DestroyMaterials();
103  DestroyEffectVariables();
104  DestroyMesh();
105  SAFE_RELEASE(m_pRasterState);
106  SAFE_RELEASE(m_pVertexLayout);
107  SAFE_RELEASE(m_pDepthStencilState);
108  SAFE_RELEASE(m_pAlphaBlendState);*/
109  }
111  {
112  for(DWORD matNo = 0; matNo < m_numMaterials; matNo++)
113  {
114  if(m_pMaterials[matNo]) m_pMaterials[matNo]->Destroy();
115  }
116  }
117  void raVisual::SetupEffectVariables(const raMatrix& pView, const raMatrix& pProj,
118  const raLight* pLight)
119  {
120  raMatrix mWorldView, mWorldViewProjection;
121 
122  mWorldView = m_World * pView;
123  mWorldViewProjection = mWorldView * pProj;
124 
125  raMatrix mLightView, mLightProj;
126  mLightView = pLight->GetViewMatrix();
127  mLightProj = pLight->GetProjectionMatrix();
128 
129  raMatrix mLightWorldView = m_World * mLightView;
130  raMatrix mLightWorldViewProjection = mLightWorldView * mLightProj;
131 
132  for(DWORD i=0;i < m_numMaterials; i++)
133  {
134  m_pMaterials[i]->SetupPerObject(m_World, mWorldView, mWorldViewProjection);
135 
136  ID3DX11EffectMatrixVariable* pmLightViewProj =
137  m_pMaterials[i]->GetEffect()->GetVariableByName("g_mLightViewProjection")->
138  AsMatrix();
139  if(pmLightViewProj) pmLightViewProj->SetMatrix((float*)&mLightWorldViewProjection);
140  }
141  }
142  bool raVisual::Render(UINT drawOrder, const raMatrix &pView, const raMatrix &pProj,
143  const raLight* pLight, LPCSTR techniqueName)
144  {
145  if(!m_bVisible || m_DrawOder != drawOrder) return true;
146 
147  SetState();
148  SetupEffectVariables(pView, pProj, pLight);
149 
150  m_dx->GetImmediateContext()->IASetInputLayout(m_pVertexLayout);
151 
152  RenderMesh(techniqueName);
153  RestoreState();
154  return true;
155  }
157  {
158  if(m_pMaterials && m_pMaterials[0])
159  {
161  return false;
162  }
163  return true;
164  }
166  {
167  if(m_FillMode != D3D11_FILL_SOLID || m_CullMode != D3D11_CULL_BACK)
168  {
169  m_dx->GetImmediateContext()->RSGetState(&m_pOldRasterState);
170  m_dx->GetImmediateContext()->RSSetState(m_pRasterState);
171  }
172 
173  if(m_bAlpha)
174  {
176  m_dx->GetImmediateContext()->OMSetBlendState(m_pAlphaBlendState, NULL, 0xffffffff);
177  }
178 
179  if(m_bDepthDisable)
180  {
181  m_dx->GetImmediateContext()->OMGetDepthStencilState(&m_pOldDepthStencilState, &m_StencilRef);
182  m_dx->GetImmediateContext()->OMSetDepthStencilState(m_pDepthStencilState, 0);
183  }
184  return true;
185  }
187  {
188  if(m_FillMode != D3D11_FILL_SOLID || m_CullMode != D3D11_CULL_BACK)
189  {
192  }
193 
194  if(m_bAlpha)
195  {
198  }
199 
200  if(m_bDepthDisable)
201  {
202  m_dx->GetImmediateContext()->OMSetDepthStencilState(m_pOldDepthStencilState, m_StencilRef);
204  }
205  return true;
206  }
208  {
209  D3D11_BLEND_DESC desc;
210  memset(&desc, 0, sizeof(D3D11_BLEND_DESC));
211  desc.RenderTarget[0].BlendEnable = true;
212  desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
213 
214  if(m_bAdditive)
215  {
216  desc.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;
217  desc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE;
218  }
219  else
220  {
221  desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
222  desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
223  }
224  desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
225 
226  //alpha dar Destination bleibt erhalten
227  desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO;
228  desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE;
229  desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
230 
231  HRESULT hr = m_dx->GetDevice()->CreateBlendState(&desc, &m_pAlphaBlendState);
232  if(FAILED(hr))
233  {
234  RERROR_DX11("CreateBlendState", hr);
235  return false;
236  }
237  return true;
238  }
240  {
241  D3D11_DEPTH_STENCIL_DESC desc;
242  memset(&desc, 0 , sizeof(D3D11_DEPTH_STENCIL_DESC));
243  desc.DepthEnable = true;
244  desc.DepthFunc = D3D11_COMPARISON_LESS;
245  desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
246  desc.StencilEnable = false;
247 
248  HRESULT hr = m_dx->GetDevice()->CreateDepthStencilState(&desc, &m_pDepthStencilState);
249  if(FAILED(hr))
250  {
251  RERROR_DX11("CreateDepthStencilState", hr);
252  return false;
253  }
254 
255  return true;
256  }
258  {
259  D3D11_RASTERIZER_DESC desc;
260 
261  desc.FillMode = m_FillMode;
262  desc.CullMode = m_CullMode;
263  desc.FrontCounterClockwise = true;
264  desc.DepthBias = false;
265  desc.DepthBiasClamp = 0;
266  desc.SlopeScaledDepthBias = 0;
267  desc.DepthClipEnable = true;
268  desc.ScissorEnable = false;
269  desc.MultisampleEnable = false;
270  desc.AntialiasedLineEnable = false;
271 
272  HRESULT hr = m_dx->GetDevice()->CreateRasterizerState(&desc, &m_pRasterState);
273  if(FAILED(hr))
274  {
275  RERROR_DX11("CreateRasterizerState", hr);
276  return false;
277  }
278 
279  return true;
280  }
281  // Tauscht ein Material nur aus!!
282  void raVisual::SetMaterial(UINT n, raMaterial* pMaterial)
283  {
284  m_pMaterials[n] = pMaterial;
285 
286  if(n == 0)
287  {
290  }
291  }
292  void raVisual::SetMaterial_1(UINT n, raMaterial* pMaterial)
293  {
294  if(m_pMaterials[n])
295  {
296  m_pMaterials[n]->Destroy();
297  delete m_pMaterials[n];
298  SetMaterial(n, m_pMaterials[n]);
299  m_pMaterials[n]->Create();
300  }
301  }
302  void raVisual::SetTexture(UINT n, LPCSTR textureFileName)
303  {
305  if(pMaterial) pMaterial->SetTexture(textureFileName);
306  }
307  void raVisual::SetTexture_1(UINT n, LPCSTR textureFillName)
308  {
310  if(pMaterial)
311  {
312  pMaterial->Destroy();
313  pMaterial->SetTexture(textureFillName);
314  pMaterial->Create();
315  }
316  }
317  void raVisual::SetVisible(bool bVisible)
318  {
319  m_bVisible = bVisible;
320  }
321 };
raMatrix GetViewMatrix() const
Definition: raLight.cpp:18
bool SetState()
Definition: raVisual.cpp:165
D3D11_CULL_MODE m_CullMode
Definition: raVisual.h:118
Definition: raLight.h:5
ID3D11RasterizerState * m_pOldRasterState
Definition: raVisual.h:106
virtual void Destroy()
Definition: raVisual.cpp:100
virtual void DestroyMaterials()
Definition: raVisual.cpp:110
bool RestoreState()
Definition: raVisual.cpp:186
virtual bool Create()
Definition: raMaterial.cpp:56
static raString SkinnedEffectfileName
Definition: raVisual.h:10
static raString TexturedTechniqueName
Definition: raVisual.h:8
UINT m_DrawOder
Definition: raVisual.h:95
ID3D11DeviceContext * GetImmediateContext(void)
Definition: raDirectX.h:31
UINT m_StencilRef
Definition: raVisual.h:115
raVisual(raSmartPointer< raDirectX > dx, bool bAlpha=false, bool bAdditive=false, bool bDepthDisable=false, D3D11_FILL_MODE fillMode=D3D11_FILL_SOLID, D3D11_CULL_MODE cullMode=D3D11_CULL_BACK)
Definition: raVisual.cpp:13
UINT m_sampleMask
Definition: raVisual.h:112
virtual bool Create()
Definition: raVisual.cpp:45
virtual void SetupEffectVariables(const raMatrix &pView, const raMatrix &pProj, const raLight *pLight)
Definition: raVisual.cpp:117
bool m_bVisible
Definition: raVisual.h:108
raMatrix GetProjectionMatrix() const
Definition: raLight.cpp:30
virtual bool CreateVertexLayout()
Definition: raVisual.cpp:156
ID3D11BlendState * m_pAlphaBlendState
Definition: raVisual.h:101
~raVisual(void)
Definition: raVisual.cpp:37
void RAPI RERROR_DX11(raString x, HRESULT h)
Definition: raMain.cpp:156
ID3D11Device * GetDevice(void)
Definition: raDirectX.h:29
virtual bool RenderMesh(LPCSTR techniqueName="")=0
void SetTexture(UINT n, LPCSTR textureFileName)
Definition: raVisual.cpp:302
static raString SkinnedTexturedTechniqueName
Definition: raVisual.h:13
void SetTexture_1(UINT n, LPCSTR textureFileName)
Definition: raVisual.cpp:307
void SetMaterial(UINT n, raMaterial *pMaterial)
Definition: raVisual.cpp:282
ID3D11RasterizerState * m_pRasterState
Definition: raVisual.h:105
bool CreateRasterizerState()
Definition: raVisual.cpp:257
static raString SkinnedTechniqueName
Definition: raVisual.h:12
static raString TechniqueName
Definition: raVisual.h:7
virtual void CreateEffectVariables()
Definition: raVisual.h:25
ID3D11InputLayout * m_pVertexLayout
Definition: raVisual.h:100
virtual const D3D11_INPUT_ELEMENT_DESC * GetVertexLayout()
Definition: raVisual.h:39
ID3D11BlendState * m_pOldAlphaBlendState
Definition: raVisual.h:102
bool m_bAdditive
Definition: raVisual.h:110
void SetTexture(LPCSTR TextureFileName)
virtual void CreateMaterials()
Definition: raVisual.cpp:93
std::string raString
Definition: raMain.h:107
bool CreateDepthStencilState()
Definition: raVisual.cpp:239
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
void RAPI ROK(raString x)
Definition: raMain.cpp:114
raMaterial ** m_pMaterials
Definition: raVisual.h:97
virtual UINT GetNumElements()
Definition: raVisual.h:44
void SetMaterial_1(UINT n, raMaterial *pMaterial)
Definition: raVisual.cpp:292
D3D11_FILL_MODE m_FillMode
Definition: raVisual.h:117
ID3D11DepthStencilState * m_pDepthStencilState
Definition: raVisual.h:103
bool m_bDepthDisable
Definition: raVisual.h:114
virtual bool CreateMesh()=0
float m_blendFactor[4]
Definition: raVisual.h:111
interface ID3DX11EffectMatrixVariable ID3DX11EffectMatrixVariable
Definition: d3dx11effect.h:279
bool m_bAlpha
Definition: raVisual.h:109
static raString SkinnedEffectfileName2
Definition: raVisual.h:11
#define SAFE_RELEASE(p)
Definition: d3dxGlobal.h:22
ID3DX11Effect * GetEffect(void)
Definition: raMaterial.h:30
virtual void SetupPerObject(const raMatrix &mWorld, const raMatrix &mWorldView, const raMatrix &mWorldViewProjection)
Definition: raMaterial.cpp:121
raMatrix m_World
Definition: raRender.h:34
ID3D11DepthStencilState * m_pOldDepthStencilState
Definition: raVisual.h:104
raSmartPointer< raDirectX > m_dx
Definition: raVisual.h:99
static raString EffectfileName
Definition: raVisual.h:6
DWORD m_numMaterials
Definition: raVisual.h:96
bool CreateAlphaBlendState()
Definition: raVisual.cpp:207
void RAPI RERROR(raString x)
Definition: raMain.cpp:129
virtual bool Destroy()
Definition: raMaterial.cpp:99