raSystem  1.0 bata
raGroupe.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace System
4 {
5  raGroup::raGroup(raSmartPointer<raDirectX> dx, IRAMesh *pVisual, int numInstancesToDraw,
6  bool bAlpha, bool bAdditive, bool bDepthDisable, D3D11_FILL_MODE fillMode, D3D11_CULL_MODE cullMode)
7  : raVisual(dx, bAlpha, bAdditive, bDepthDisable, fillMode, cullMode)
8  {
9  m_pVisual = pVisual;
11  m_iNumInstancesToDraw = numInstancesToDraw;
12  m_pInstanceData = NULL;
13 
15  }
16 
18  {
20  }
22  {
23  #pragma omp parallel for
24  for(int i = 0; i < MAX_INSTANCES; i++)
25  {
27  }
28  }
29  void raGroup::CreateRandomMatrices(float scaleX, float scaleY, float scaleZ, float offsetY)
30  {
31  #pragma omp parallel for
32  for(int i = 0; i < MAX_INSTANCES; i++)
33  {
34  m_InstanceMatrices[i] = raGetRandMatrix(scaleX, scaleY, scaleZ, offsetY);
35  }
36  }
38  {
39  const D3D11_INPUT_ELEMENT_DESC *desc = m_pVisual->GetVertexLayout();
40  int numElements = m_pVisual->GetNumElements();
41  int numElementsGroup = numElements + 4;
42 
43  D3D11_INPUT_ELEMENT_DESC* pLayoutGroupe = new D3D11_INPUT_ELEMENT_DESC[numElementsGroup];
44  if(!pLayoutGroupe)
45  {
47  return false;
48  }
49 
50  for(int i = 0; i < numElementsGroup; i++)
51  {
52  pLayoutGroupe[i] = desc[i];
53  }
54  UINT AlignedByteOffset = 0;
55  for(int i = numElements; i < numElementsGroup; i++)
56  {
57  pLayoutGroupe[i].SemanticName = "mTransform";
58  pLayoutGroupe[i].SemanticIndex = i - numElements;
59  pLayoutGroupe[i].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
60  pLayoutGroupe[i].InputSlot = 1;
61  pLayoutGroupe[i].AlignedByteOffset = AlignedByteOffset;
62  pLayoutGroupe[i].InputSlotClass = D3D11_INPUT_PER_INSTANCE_DATA;
63  pLayoutGroupe[i].InstanceDataStepRate = 1;
64  AlignedByteOffset += 16;
65  }
66  if(!GetMaterial(0)->CreateVertexLayout(pLayoutGroupe, numElementsGroup, &m_pVertexLayout))
67  {
68  delete[] pLayoutGroupe;
69  RERROR("Beim Erstellen des VertexLayout");
70  return false;
71  }
72  delete[] pLayoutGroupe;
73 
74  ROK("VertexLayout erstellt");
75  return true;
76  }
78  {
81  return true;
82  }
84  {
85  D3D11_BUFFER_DESC bufferDesc =
86  {
87  m_iNumInstances * sizeof(raMatrix),
88  D3D11_USAGE_DYNAMIC,
89  D3D11_BIND_VERTEX_BUFFER,
90  D3D11_CPU_ACCESS_WRITE,
91  0
92  };
93  m_dx->GetDevice()->CreateBuffer(&bufferDesc, NULL, &m_pInstanceData);
94 
95  D3D11_MAPPED_SUBRESOURCE MappedResource;
96  m_dx->GetImmediateContext()->Map(m_pInstanceData, 0, D3D11_MAP_WRITE_DISCARD,
97  NULL, &MappedResource);
98  raMatrix* pMatrices = (raMatrix*)MappedResource.pData;
99 
100  memcpy(pMatrices, m_pInstanceList, m_iNumInstances * sizeof(raMatrix));
101 
103  }
105  {
108  }
109  bool raGroup::RenderMesh(LPCSTR techniqueName)
110  {
111  UINT Strides[2];
112  UINT Offsets[2] = {0,0};
113  Strides[0] = m_pVisual->GetStrideSize();
114  Strides[1] = sizeof(raMatrix);
115 
116  ID3D11Buffer* pVB[2];
117  pVB[0] = m_pVisual->GetVertexBuffer();
118  pVB[1] = m_pInstanceData;
119 
120  m_dx->GetImmediateContext()->IASetVertexBuffers(0, 2, pVB, Strides, Offsets);
121  m_dx->GetImmediateContext()->IASetIndexBuffer(m_pVisual->GetIndexBuffer(),
123 
124  for(int subsets = 0; subsets < GetNumSubsets(); subsets++)
125  {
126  SDKMESH_SUBSET* pSubsets = GetSubset(subsets);
127 
128  D3D11_PRIMITIVE_TOPOLOGY PrimType =
129  GetPrimitiveTopology(subsets);
130  m_dx->GetImmediateContext()->IASetPrimitiveTopology(PrimType);
131 
132  GetMaterial(pSubsets->MaterialID)->Setup();
133 
134  ID3DX11EffectTechnique* pTech =
135  GetMaterial(pSubsets->MaterialID)->GetEffectTechnique(techniqueName);
136 
137  D3DX11_TECHNIQUE_DESC techdesc;
138  HRESULT hr = pTech->GetDesc(&techdesc);
139  if(FAILED(hr))
140  {
141  RERROR_DX11("GetDesc", hr);
142  return false;
143  }
144 
145  for(UINT p = 0; p < techdesc.Passes; p++)
146  {
147  pTech->GetPassByIndex(p)->Apply(0, m_dx->GetImmediateContext());
148  m_dx->GetImmediateContext()->DrawIndexedInstanced((UINT)pSubsets->IndexCount,
149  m_iNumInstancesToDraw, (UINT)pSubsets->IndexStart,
150  0, 0);
151  }
152  }
153  return true;
154  }
155  UINT raGroup::AddInstance(const raMatrix& world)
156  {
158 
161 
163 
164  return m_iNumInstancesToDraw++;
165  }
167  {
168  for(int i = 0; i < MAX_INSTANCES; i++)
169  {
170  m_InstanceMatrices[i] = value;
171  }
172  }
173  void raGroup::SetWorldMatrix(const raMatrix& value, int instanceNo)
174  {
175  m_InstanceMatrices[instanceNo] = value;
177  }
178  const raMatrix* raGroup::GetWorldMatrix(int instanceNo)
179  {
180  return m_InstanceMatrices + instanceNo;
181  }
183  {
184  D3D11_MAPPED_SUBRESOURCE MappedResource;
185 
186  m_dx->GetImmediateContext()->Map(m_pInstanceData, 0, D3D11_MAP_WRITE_DISCARD,
187  NULL, &MappedResource);
188 
189  D3DXMATRIX* pMatrices = (D3DXMATRIX*)MappedResource.pData;
190  memcpy(pMatrices, m_pInstanceList, m_iNumInstances * sizeof(D3DXMATRIX));
191 
193  }
194 };
virtual ID3D11Buffer * GetIndexBuffer()=0
#define MAX_INSTANCES
Definition: raGroupe.h:3
virtual void Destroy()
Definition: raVisual.cpp:100
virtual void SetWorldMatrix(const raMatrix &value)
Definition: raGroupe.cpp:166
IRAMesh * m_pVisual
Definition: raGroupe.h:43
virtual raMaterial * GetMaterial(UINT n)
Definition: raVisual.h:63
ID3D11Buffer * m_pInstanceData
Definition: raGroupe.h:49
raMatrix m_InstanceMatrices[MAX_INSTANCES]
Definition: raGroupe.h:44
RAPI raMatrix raGetRandMatrix(float scaleX, float scaleY, float scaleZ, float offsetY)
Definition: raUtility.cpp:222
ID3D11DeviceContext * GetImmediateContext(void)
Definition: raDirectX.h:31
raMatrix raMatrixIdentity()
Definition: raMatrix.h:211
void UpdateInstanceMatrices()
Definition: raGroupe.cpp:182
virtual bool Create()
Definition: raVisual.cpp:45
virtual void Destroy()
Definition: raGroupe.cpp:104
UINT64 IndexCount
Definition: raSDKmesh.h:142
virtual UINT GetNumSubsets()
Definition: raGroupe.h:29
virtual ~raGroup(void)
Definition: raGroupe.cpp:17
virtual const D3D11_INPUT_ELEMENT_DESC * GetVertexLayout()=0
interface ID3DX11EffectTechnique ID3DX11EffectTechnique
void RAPI RERROR_DX11(raString x, HRESULT h)
Definition: raMain.cpp:156
virtual bool RenderMesh(LPCSTR techniqueName="")
Definition: raGroupe.cpp:109
ID3D11Device * GetDevice(void)
Definition: raDirectX.h:29
virtual bool Create()
Definition: raGroupe.cpp:77
virtual D3D11_PRIMITIVE_TOPOLOGY GetPrimitiveTopology(UINT n)
Definition: raGroupe.h:28
virtual void Setup()
Definition: raMaterial.cpp:160
int m_iNumInstancesToDraw
Definition: raGroupe.h:46
virtual raMatrix * GetWorldMatrix(void)
Definition: raRender.cpp:14
raMatrix * m_pInstanceList
Definition: raGroupe.h:47
ID3D11InputLayout * m_pVertexLayout
Definition: raVisual.h:100
virtual ID3D11Buffer * GetVertexBuffer()=0
UINT64 IndexStart
Definition: raSDKmesh.h:141
int m_iNumInstances
Definition: raGroupe.h:45
virtual void LoadInstanceData()
Definition: raGroupe.cpp:83
void RAPI ROK(raString x)
Definition: raMain.cpp:114
virtual SDKMESH_SUBSET * GetSubset(UINT n)
Definition: raGroupe.h:30
Definition: IRAMesh.h:3
virtual UINT GetStrideSize()=0
virtual DXGI_FORMAT GetIndexBufferFormat()=0
class RAPI raMatrix
Definition: raVector3.h:3
void CreateRandomMatrices(float scaleX=1.0f, float scaleY=1.0f, float scaleZ=1.0f, float offsetY=0.0f)
Definition: raGroupe.cpp:29
#define SAFE_RELEASE(p)
Definition: d3dxGlobal.h:22
virtual bool CreateVertexLayout()
Definition: raGroupe.cpp:37
virtual UINT GetNumElements()=0
UINT AddInstance(const raMatrix &world)
Definition: raGroupe.cpp:155
raSmartPointer< raDirectX > m_dx
Definition: raVisual.h:99
void RAPI RERROR_OUTOFMEM()
Definition: raMain.cpp:144
void InitInstanceMatrices()
Definition: raGroupe.cpp:21
raGroup(raSmartPointer< raDirectX > dx, IRAMesh *pVisual, int numInstancesToDraw=0, bool bAlpha=false, bool bAdditive=false, bool bDepthDisable=false, D3D11_FILL_MODE fillMode=D3D11_FILL_SOLID, D3D11_CULL_MODE cullMode=D3D11_CULL_BACK)
Definition: raGroupe.cpp:5
ID3DX11EffectTechnique * GetEffectTechnique(LPCSTR techniqueName="")
Definition: raMaterial.h:31
#define SAFE_DELETE(p)
Definition: d3dxGlobal.h:26
void RAPI RERROR(raString x)
Definition: raMain.cpp:129