raSystem  1.0 bata
raGSEntity.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace System
4 {
6  {
7  m_numMaterials = 2;
9  if(pMaterial.get())
10  m_pMaterials[0] = pMaterial.get();
11  else
12  m_pMaterials[0] = new raProceduralMaterial(dx, 16, "FbmLighted");
13 
14  m_pMaterials[1] = new raMaterial(dx,
15  "raEffects\\TesselationEffect.fx", "CreateGeometry");
16 
17  m_nVertices = 4;
18  m_nIndices = 6;
19 
20  m_numSubsets = 1;
22  m_pSubsets[0].IndexStart = 0;
24  m_pSubsets[0].VertexStart = 0;
26  m_pSubsets[0].MaterialID = 0;
27 
28  m_pStreamTo = NULL;
29  m_pDrawFrom = NULL;
30 
31  m_SplitRatio = 5;
32  m_bDepthDisable = true;
33  }
34 
36  {
38 
39  m_pVertices[0].position.x = -1.0f;
40  m_pVertices[0].position.y = 0.0f;
41  m_pVertices[0].position.z = -1.0f;
42 
43  m_pVertices[1].position.x = -1.0f;
44  m_pVertices[1].position.y = 0.0f;
45  m_pVertices[1].position.z = 1.0f;
46 
47  m_pVertices[2].position.x = 1.0f;
48  m_pVertices[2].position.y = 0.0f;
49  m_pVertices[2].position.z = -1.0f;
50 
51  m_pVertices[3].position.x = 1.0f;
52  m_pVertices[3].position.y = 0.0f;
53  m_pVertices[3].position.z = 1.0f;
54 
55  for(int i = 0; i < 4; i++)
56  {
57  m_pVertices[i].texcoord.x = 0.5f * ((float)m_pVertices[i].position.x + 1);
58  m_pVertices[i].texcoord.y = 0.5f * ((float)m_pVertices[i].position.z + 1);
59  }
60  }
62  {
64 
65  m_pIndices[0] = 0;
66  m_pIndices[1] = 1;
67  m_pIndices[2] = 2;
68  m_pIndices[3] = 3;
69  m_pIndices[4] = 2;
70  m_pIndices[5] = 1;
71  }
72 
74  {
76 
77  m_pCreateGeometryTechnique = m_pMaterials[1]->GetEffectTechnique();
78  m_SplitRatioVariable = m_pMaterials[1]->GetEffect()->
79  GetVariableByName("g_split_ratio" )->AsScalar();
80 
81  const UINT MaxVertices = 300000;
82  D3D11_BUFFER_DESC bd;
83  bd.Usage = D3D11_USAGE_DEFAULT;
84  bd.ByteWidth = MaxVertices * GetStrideSize();
85  bd.BindFlags = D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_STREAM_OUTPUT;
86  bd.CPUAccessFlags = 0;
87  bd.MiscFlags = 0;
88  m_dx->GetDevice()->CreateBuffer( &bd, NULL, &m_pStreamTo) ;
89  m_dx->GetDevice()->CreateBuffer( &bd, NULL, &m_pDrawFrom) ;
90 
91  return true;
92  }
94  {
96  SAFE_RELEASE( m_pStreamTo );
97  SAFE_RELEASE( m_pDrawFrom );
98  }
99  bool raGSEntity::RenderMesh(LPCSTR techniqueName)
100  {
101  ID3DX11EffectTechnique* pTechnique =
102  m_pMaterials[0]->GetEffectTechnique(techniqueName);
103 
104  m_bOriginalBufferVerwenden = true;
105  //Mehrfach aufrufen, um mehrere Levels zu erzeugen
106  for(int l = 16; l > 0; l--)
107  {
108  CreateGeometry();
109  }
110 
111  m_pMaterials[0]->Setup();
112 
113  m_dx->GetImmediateContext()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
114 
115  UINT Strides[1];
116  UINT Offsets[1];
117  Strides[0] = GetStrideSize();
118  Offsets[0] = 0;
119 
120  m_dx->GetImmediateContext()->IASetVertexBuffers( 0, 1, &m_pDrawFrom, Strides, Offsets);
121 
122  D3DX11_TECHNIQUE_DESC techDesc;
123  pTechnique->GetDesc( &techDesc );
124 
125  for(UINT p = 0; p < techDesc.Passes; ++p )
126  {
127  pTechnique->GetPassByIndex(p)->Apply(0, m_dx->GetImmediateContext());
128  m_dx->GetImmediateContext()->DrawAuto();
129  }
130  return true;
131  }
132  void raGSEntity::CreateGeometry()
133  {
134  ID3D11Buffer *pBuffers[1];
135 
136  if(m_bOriginalBufferVerwenden)
137  {
138  pBuffers[0] = m_pVB;
139  m_dx->GetImmediateContext()->IASetIndexBuffer(m_pIB, DXGI_FORMAT_R16_UINT, 0);
140  }
141  else pBuffers[0] = m_pDrawFrom;
142 
143  m_dx->GetImmediateContext()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
144 
145  UINT Strides[1];
146  UINT Offsets[1];
147  Strides[0] = GetStrideSize();
148  Offsets[0] = 0;
149  m_dx->GetImmediateContext()->IASetVertexBuffers(0, 1, pBuffers, Strides, Offsets);
150 
151  //Stream Output Traget
152  pBuffers[0] = m_pStreamTo;
153  m_dx->GetImmediateContext()->SOSetTargets(1, pBuffers, Offsets);
154 
155  D3DX11_TECHNIQUE_DESC techDesc;
156  m_pCreateGeometryTechnique->GetDesc(&techDesc);
157 
158  ID3D11DepthStencilState* pOldDepthStencilState = NULL;
159  UINT StencilRef = 0;
160  m_dx->GetImmediateContext()->OMGetDepthStencilState(&pOldDepthStencilState, &StencilRef);
161  m_dx->GetImmediateContext()->OMSetDepthStencilState(m_pDepthStencilState, 0);
162 
163  if(m_SplitRatioVariable) m_SplitRatioVariable->SetFloat(m_SplitRatio);
164 
165  for(UINT p = 0; p < techDesc.Passes; ++p )
166  {
167  m_pCreateGeometryTechnique->GetPassByIndex(p)->Apply(0, m_dx->GetImmediateContext());
168 
169  if(m_bOriginalBufferVerwenden)
170  {
171  m_dx->GetImmediateContext()->DrawIndexed(m_nIndices, 0, 0);
172  m_bOriginalBufferVerwenden = false;
173  }
174  else m_dx->GetImmediateContext()->DrawAuto();
175  }
176 
177  m_dx->GetImmediateContext()->OMSetDepthStencilState(pOldDepthStencilState, StencilRef);
178  SAFE_RELEASE(pOldDepthStencilState);
179 
180  //Stream Output Traget zurücksetzen
181  pBuffers[0] = NULL;
182  m_dx->GetImmediateContext()->SOSetTargets(1, pBuffers, Offsets);
183 
184  //Buffer tauschen
185  ID3D11Buffer* pTemp = m_pDrawFrom;
186  m_pDrawFrom = m_pStreamTo;
187  m_pStreamTo = pTemp;
188  }
189 };
UINT64 VertexStart
Definition: raSDKmesh.h:143
raFloat y
Definition: raVector3.h:13
virtual void Destroy()
Definition: raVisual.cpp:100
raFloat x
Definition: raVector3.h:12
virtual void SetupIndices()
Definition: raGSEntity.cpp:61
virtual void SetupVertices()
Definition: raGSEntity.cpp:35
ID3D11DeviceContext * GetImmediateContext(void)
Definition: raDirectX.h:31
raFloat x
Definition: raVector2.h:10
virtual bool Create()
Definition: raVisual.cpp:45
unsigned short UINT16
Definition: d3dx11dbg.h:35
VERTEXPOSITIONTEXTURED * m_pVertices
Definition: raEntity.h:39
UINT64 IndexCount
Definition: raSDKmesh.h:142
interface ID3DX11EffectTechnique ID3DX11EffectTechnique
ID3D11Device * GetDevice(void)
Definition: raDirectX.h:29
raFloat z
Definition: raVector3.h:14
UINT64 VertexCount
Definition: raSDKmesh.h:144
DWORD m_numSubsets
Definition: raVisual.h:120
virtual void Setup()
Definition: raMaterial.cpp:160
SDKMESH_SUBSET * m_pSubsets
Definition: raVisual.h:121
UINT64 IndexStart
Definition: raSDKmesh.h:141
virtual bool RenderMesh(LPCSTR techniqueName="")
Definition: raGSEntity.cpp:99
raFloat y
Definition: raVector2.h:11
raMaterial ** m_pMaterials
Definition: raVisual.h:97
ID3D11DepthStencilState * m_pDepthStencilState
Definition: raVisual.h:103
bool m_bDepthDisable
Definition: raVisual.h:114
virtual void Destroy()
Definition: raGSEntity.cpp:93
raGSEntity(raSmartPointer< raDirectX > dx, raSmartPointer< raMaterial > pMaterial=raSmartPointer< raMaterial >(NULL))
Definition: raGSEntity.cpp:5
#define SAFE_RELEASE(p)
Definition: d3dxGlobal.h:22
ID3DX11Effect * GetEffect(void)
Definition: raMaterial.h:30
raSmartPointer< raDirectX > m_dx
Definition: raVisual.h:99
DWORD m_numMaterials
Definition: raVisual.h:96
ID3DX11EffectTechnique * GetEffectTechnique(LPCSTR techniqueName="")
Definition: raMaterial.h:31
virtual bool Create()
Definition: raGSEntity.cpp:73
T * get() const