raSystem  1.0 bata
raMaterial.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace System
4 {
6 
7  void raMaterial::CreateEffectFromCompiledFile(raString strFilename, DWORD dwShaderFlags)
8  {
9  HANDLE hFile;
10  DWORD dwFileSize;
11  DWORD dwBytesRead;
12 
13  VOID* pData = NULL;
14 
15  hFile = CreateFile(strFilename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL,
16  OPEN_EXISTING, 0, NULL );
17  if(hFile)
18  {
19  dwFileSize = GetFileSizeEx(hFile, NULL);
20  if(dwFileSize != INVALID_FILE_SIZE)
21  {
22  pData = CoTaskMemAlloc(dwFileSize);
23  if(pData)
24  {
25  ReadFile(hFile, pData, dwFileSize,
26  &dwBytesRead, NULL);
27 
28  D3DX11CreateEffectFromMemory(pData, dwBytesRead,
29  dwShaderFlags, m_dx->GetDevice(), &m_pEffect);
30  }
31  }
32  CloseHandle(hFile);
33  }
34  }
36  m_DiffuseColor(1.0f), m_AmbientColor(0.5f)
37  {
38  m_dx = dx;
39 
40  m_EffectFileName = EffectFile;
41  m_TechniqueName = Technique;
42 
43  m_pEffect = NULL;
44  m_pTechnique = NULL;
45 
46  m_bSelected = false;
47 
50  m_pSelectedVariable = NULL;
51  }
52 
54  {
55  }
57  {
58  raEffectMap::iterator iterator = m_effects.find(m_EffectFileName);
59  if(iterator != m_effects.end())
60  {
61  m_pEffect = iterator->second;
62  }
63  else
64  {
65  DWORD dwShaderFlags = D3D10_SHADER_ENABLE_STRICTNESS;
66 
67  //Nicht bei Verwendung von Effektgruppen
68  //#if defined( DEBUG ) || defined( _DEBUG )
69  // //Set the D3D10_SHADER_DEBUG flag to embed debug information in the shaders.
70  // //Setting this flag improves the shader debugging experience, but still allows
71  // //the shaders to be optimized and to run exactly the way they will run in
72  // //the release configuration of this program.
73  //dwShaderFlags |= D3D10_SHADER_DEBUG;
74  //#endif
75 
76  ID3DBlob* pBlob = NULL;
77  D3DX11CompileFromFile(m_EffectFileName.c_str(), NULL, NULL, "", "fx_5_0", dwShaderFlags, 0, NULL,
78  &pBlob, NULL, NULL);
79  D3DX11CreateEffectFromMemory(pBlob->GetBufferPointer(),pBlob->GetBufferSize(),
80  dwShaderFlags, m_dx->GetDevice(), &m_pEffect);
81 
82  m_effects.insert(raEffectMap::value_type(m_EffectFileName, m_pEffect));
83  }
84  m_pEffect->AddRef();
85 
86  //Technique
87  m_pTechnique = m_pEffect->GetTechniqueByName(m_TechniqueName.c_str());
88  assert(m_pTechnique->IsValid());
89 
91  m_pEffect->GetVariableByName("g_MaterialDiffuseColor")->AsVector();
93  m_pEffect->GetVariableByName("g_MaterialAmbientColor")->AsVector();
95  m_pEffect->GetVariableByName("g_bSelected" )->AsScalar();
96 
97  return true;
98  }
100  {
101  if(m_pEffect) m_pEffect->Release(); //Nicht SAFE_RELEASE, da Material mehrfach genutzt sein kann
102  return true;
103  }
105  const D3D11_INPUT_ELEMENT_DESC* pLayout,
106  UINT numElements, ID3D11InputLayout** ppInputLayout)
107  {
108  D3DX11_PASS_DESC PassDesc;
109  m_pTechnique->GetPassByIndex(0)->GetDesc(&PassDesc);
110  HRESULT hr = m_dx->GetDevice()->CreateInputLayout(pLayout, numElements,
111  PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize,
112  ppInputLayout);
113  if(FAILED(hr))
114  {
115  RERROR_DX11("CreateInputLayout", hr);
116  return false;
117  }
118 
119  return true;
120  }
122  const raMatrix& mWorldView, const raMatrix& mWorldViewProjection)
123  {
124  ID3DX11EffectMatrixVariable* m_pmWorldViewProj =
125  m_pEffect->GetVariableByName("g_mWorldViewProjection")->
126  AsMatrix();
127  m_pmWorldViewProj->SetMatrix((float*)&mWorldViewProjection);
128  m_pEffect->GetVariableByName("g_mWorldView" )->AsMatrix()->
129  SetMatrix((float*)&mWorldView);
130  m_pEffect->GetVariableByName("g_mWorld" )->AsMatrix()->
131  SetMatrix((float*)&mWorld);
132  }
133 
134  //Kann entfallen, da vom Scenemanager direkt für Effekte erledigt
135  void raMaterial::SetupPerFrame(const raLight* pLight,
136  const raMatrix* pView, const raMatrix* pProj)
137  {
138  D3DXVECTOR3 lightDir = pLight->m_Direction;
139  m_pEffect->GetVariableByName("g_vLightDir")->AsVector()->
140  SetFloatVector(lightDir);
141  raColor lightDiffuseColor = pLight->m_DiffuseColor;
142  m_pEffect->GetVariableByName("g_LightDiffuse")->AsVector()->
143  SetFloatVector((float*)&lightDiffuseColor);
144 
145  //Für Glanzlichter (geht aber auch ohne (mit WorldView und WorldViewProjection))
146  //außerdem für SkinnedInstancing, Proj auch für Cubemapping
147  if(pView)
148  {
150  m_pEffect->GetVariableByName("g_mView")->AsMatrix();
151  if(pmView)pmView->SetMatrix((float*)pView);
152  }
153  if(pProj)
154  {
156  m_pEffect->GetVariableByName("g_mProj")->AsMatrix();
157  if(pmProj)pmProj->SetMatrix((float*)pProj);
158  }
159  }
161  {
168  }
169 };
raColor m_AmbientColor
Definition: raMaterial.h:64
raColor m_DiffuseColor
Definition: raLight.h:12
Definition: raLight.h:5
virtual bool Create()
Definition: raMaterial.cpp:56
virtual void SetupPerFrame(const raLight *Light, const raMatrix *pView=NULL, const raMatrix *pProj=NULL)
Definition: raMaterial.cpp:135
raColor m_DiffuseColor
Definition: raMaterial.h:63
HRESULT WINAPI D3DX11CreateEffectFromMemory(CONST void *pData, SIZE_T DataLength, UINT FXFlags, ID3D11Device *pDevice, ID3DX11Effect **ppEffect)
Definition: raColor.h:5
void RAPI RERROR_DX11(raString x, HRESULT h)
Definition: raMain.cpp:156
ID3D11Device * GetDevice(void)
Definition: raDirectX.h:29
ID3DX11Effect * m_pEffect
Definition: raMaterial.h:57
SIZE_T IAInputSignatureSize
ID3DX11EffectScalarVariable * m_pSelectedVariable
Definition: raMaterial.h:61
virtual void Setup()
Definition: raMaterial.cpp:160
void CreateEffectFromCompiledFile(raString strFilename, DWORD dwShaderFlags)
Definition: raMaterial.cpp:7
ID3DX11EffectTechnique * m_pTechnique
Definition: raMaterial.h:58
bool m_bSelected
Definition: raMaterial.h:49
virtual bool CreateVertexLayout(const D3D11_INPUT_ELEMENT_DESC *pLayout, UINT nemElements, ID3D11InputLayout **ppInputLayout)
Definition: raMaterial.cpp:104
raMaterial(raSmartPointer< raDirectX > dx, raString EffectFile, raString Technique)
Definition: raMaterial.cpp:35
static raEffectMap m_effects
Definition: raMaterial.h:48
std::map< raString, ID3DX11Effect * > raEffectMap
Definition: raMaterial.h:3
raString m_EffectFileName
Definition: raMaterial.h:54
std::string raString
Definition: raMain.h:107
raVector3 m_Direction
Definition: raLight.h:11
ID3D11Buffer D3D11_BUFFER_DESC void * pData
Definition: raSDKmesh.h:238
~raMaterial(void)
Definition: raMaterial.cpp:53
raSmartPointer< raDirectX > m_dx
Definition: raMaterial.h:53
interface ID3DX11EffectMatrixVariable ID3DX11EffectMatrixVariable
Definition: d3dx11effect.h:279
virtual void SetupPerObject(const raMatrix &mWorld, const raMatrix &mWorldView, const raMatrix &mWorldViewProjection)
Definition: raMaterial.cpp:121
ID3DX11EffectVectorVariable * m_pMaterialDiffuseColorVariable
Definition: raMaterial.h:59
ID3DX11EffectVectorVariable * m_pMaterialAmbientVariable
Definition: raMaterial.h:60
raString m_TechniqueName
Definition: raMaterial.h:55
virtual bool Destroy()
Definition: raMaterial.cpp:99