- fixed DrawPrimitives and DrawUserPrimitives (issue #531)

This commit is contained in:
Glatzemann 2012-09-20 11:53:50 +00:00 committed by Konstantin Koch
parent 9414d12668
commit 3535fbcd71
2 changed files with 35 additions and 34 deletions

View File

@ -195,8 +195,7 @@ namespace ANX.RenderSystem.Windows.DX10
#endregion #endregion
#region DrawIndexedPrimitives #region DrawIndexedPrimitives
public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount)
int startIndex, int primitiveCount)
{ {
Dx10.EffectTechnique technique = SetupEffectForDraw(); Dx10.EffectTechnique technique = SetupEffectForDraw();
int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount); int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
@ -211,8 +210,8 @@ namespace ANX.RenderSystem.Windows.DX10
nativeDevice.DrawIndexed(vertexCount, startIndex, baseVertex); nativeDevice.DrawIndexed(vertexCount, startIndex, baseVertex);
} }
//nativeDevice.InputAssembler.InputLayout.Dispose(); nativeDevice.InputAssembler.InputLayout.Dispose();
//nativeDevice.InputAssembler.InputLayout = null; nativeDevice.InputAssembler.InputLayout = null;
} }
#endregion #endregion
@ -220,6 +219,7 @@ namespace ANX.RenderSystem.Windows.DX10
public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount) public void DrawPrimitives(PrimitiveType primitiveType, int vertexOffset, int primitiveCount)
{ {
Dx10.EffectTechnique technique = SetupEffectForDraw(); Dx10.EffectTechnique technique = SetupEffectForDraw();
int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
nativeDevice.Rasterizer.SetViewports(currentViewport); nativeDevice.Rasterizer.SetViewports(currentViewport);
@ -228,7 +228,7 @@ namespace ANX.RenderSystem.Windows.DX10
for (int i = 0; i < technique.Description.PassCount; ++i) for (int i = 0; i < technique.Description.PassCount; ++i)
{ {
technique.GetPassByIndex(i).Apply(); technique.GetPassByIndex(i).Apply();
nativeDevice.Draw(primitiveCount, vertexOffset); nativeDevice.Draw(vertexCount, vertexOffset);
} }
nativeDevice.InputAssembler.InputLayout.Dispose(); nativeDevice.InputAssembler.InputLayout.Dispose();
@ -254,8 +254,7 @@ namespace ANX.RenderSystem.Windows.DX10
DxVertexBuffer vb10 = new DxVertexBuffer(nativeDevice, vertexDeclaration, vertexCount, BufferUsage.None); DxVertexBuffer vb10 = new DxVertexBuffer(nativeDevice, vertexDeclaration, vertexCount, BufferUsage.None);
vb10.SetData<T>(null, vertexData); vb10.SetData<T>(null, vertexData);
Dx10.VertexBufferBinding nativeVertexBufferBindings = new Dx10.VertexBufferBinding(vb10.NativeBuffer, Dx10.VertexBufferBinding nativeVertexBufferBindings = new Dx10.VertexBufferBinding(vb10.NativeBuffer, vertexDeclaration.VertexStride, 0);
vertexDeclaration.VertexStride, 0);
nativeDevice.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings); nativeDevice.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings);
@ -279,15 +278,13 @@ namespace ANX.RenderSystem.Windows.DX10
#endregion #endregion
#region DrawUserPrimitives<T> #region DrawUserPrimitives<T>
public void DrawUserPrimitives<T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, public void DrawUserPrimitives<T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct, IVertexType
VertexDeclaration vertexDeclaration) where T : struct, IVertexType
{ {
int vertexCount = vertexData.Length; int vertexCount = vertexData.Length;
DxVertexBuffer vb10 = new DxVertexBuffer(nativeDevice, vertexDeclaration, vertexCount, BufferUsage.None); DxVertexBuffer vb10 = new DxVertexBuffer(nativeDevice, vertexDeclaration, vertexCount, BufferUsage.None);
vb10.SetData<T>(null, vertexData); vb10.SetData<T>(null, vertexData);
Dx10.VertexBufferBinding nativeVertexBufferBindings = new Dx10.VertexBufferBinding(vb10.NativeBuffer, Dx10.VertexBufferBinding nativeVertexBufferBindings = new Dx10.VertexBufferBinding(vb10.NativeBuffer, vertexDeclaration.VertexStride, 0);
vertexDeclaration.VertexStride, 0);
nativeDevice.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings); nativeDevice.InputAssembler.SetVertexBuffers(0, nativeVertexBufferBindings);
@ -307,8 +304,8 @@ namespace ANX.RenderSystem.Windows.DX10
for (int i = 0; i < technique.Description.PassCount; ++i) for (int i = 0; i < technique.Description.PassCount; ++i)
{ {
pass.Apply(); technique.GetPassByIndex(i).Apply();
nativeDevice.Draw(primitiveCount, vertexOffset); nativeDevice.Draw(vertexCount, vertexOffset);
} }
nativeDevice.InputAssembler.InputLayout.Dispose(); nativeDevice.InputAssembler.InputLayout.Dispose();

View File

@ -199,31 +199,23 @@ namespace ANX.RenderSystem.Windows.DX11
#endregion #endregion
#region DrawIndexedPrimitives #region DrawIndexedPrimitives
public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount)
int numVertices, int startIndex, int primitiveCount)
{ {
SharpDX.Direct3D11.EffectPass pass; SharpDX.Direct3D11.EffectTechnique technique = SetupEffectForDraw();
SharpDX.Direct3D11.EffectTechnique technique; int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
ShaderBytecode passSignature;
SetupEffectForDraw(out pass, out technique, out passSignature);
var layout = SetupInputLayout(passSignature); nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
nativeDevice.Rasterizer.SetViewports(currentViewport);
nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
// Prepare All the stages for (int i = 0; i < technique.Description.PassCount; ++i)
nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType); {
nativeDevice.Rasterizer.SetViewports(currentViewport); technique.GetPassByIndex(i).Apply(nativeDevice);
nativeDevice.DrawIndexed(vertexCount, startIndex, baseVertex);
}
nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView); nativeDevice.InputAssembler.InputLayout.Dispose();
nativeDevice.InputAssembler.InputLayout = null;
for (int i = 0; i < technique.Description.PassCount; ++i)
{
pass.Apply(nativeDevice);
nativeDevice.DrawIndexed(DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount), startIndex,
baseVertex);
}
layout.Dispose();
layout = null;
} }
#endregion #endregion
@ -345,6 +337,18 @@ namespace ANX.RenderSystem.Windows.DX11
pass = technique.GetPassByIndex(0); pass = technique.GetPassByIndex(0);
passSignature = pass.Description.Signature; passSignature = pass.Description.Signature;
} }
private SharpDX.Direct3D11.EffectTechnique SetupEffectForDraw()
{
//TODO: check for currentEffect null and throw exception
// TODO: check for null's and throw exceptions
// TODO: get the correct pass index!
var technique = currentEffect.GetCurrentTechnique().NativeTechnique;
var pass = technique.GetPassByIndex(0);
SetupInputLayout(pass.Description.Signature);
return technique;
}
#endregion #endregion
#region SetupInputLayout #region SetupInputLayout