Worked on issue #531. Primitives sample is now much more complete. The instanced primitives are looking much better in PIX now, but still not rendering.
This commit is contained in:
parent
825ed2b10c
commit
0c98c29886
@ -142,7 +142,7 @@ namespace ANX.Framework.Graphics
|
|||||||
int startIndex, int primitiveCount, int instanceCount)
|
int startIndex, int primitiveCount, int instanceCount)
|
||||||
{
|
{
|
||||||
NativeDevice.DrawInstancedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex,
|
NativeDevice.DrawInstancedPrimitives(primitiveType, baseVertex, minVertexIndex, numVertices, startIndex,
|
||||||
primitiveCount, instanceCount);
|
primitiveCount, instanceCount, this.indexBuffer);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ namespace ANX.Framework.NonXNA
|
|||||||
void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer);
|
void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, IndexBuffer indexBuffer);
|
||||||
|
|
||||||
void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices,
|
void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices,
|
||||||
int startIndex, int primitiveCount, int instanceCount);
|
int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer);
|
||||||
|
|
||||||
void DrawUserIndexedPrimitives<T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices,
|
void DrawUserIndexedPrimitives<T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices,
|
||||||
Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration,
|
Array indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration,
|
||||||
|
@ -259,7 +259,7 @@ namespace ANX.RenderSystem.GL3
|
|||||||
#region DrawInstancedPrimitives (TODO)
|
#region DrawInstancedPrimitives (TODO)
|
||||||
public void DrawInstancedPrimitives(PrimitiveType primitiveType,
|
public void DrawInstancedPrimitives(PrimitiveType primitiveType,
|
||||||
int baseVertex, int minVertexIndex, int numVertices, int startIndex,
|
int baseVertex, int minVertexIndex, int numVertices, int startIndex,
|
||||||
int primitiveCount, int instanceCount)
|
int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
|
||||||
{
|
{
|
||||||
//GL.DrawArraysInstanced(
|
//GL.DrawArraysInstanced(
|
||||||
// DatatypesMapping.PrimitiveTypeToBeginMode(primitiveType),
|
// DatatypesMapping.PrimitiveTypeToBeginMode(primitiveType),
|
||||||
|
@ -49,6 +49,39 @@ namespace ANX.RenderSystem.Windows.DX11
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public static int FormatSize(VertexElementFormat format)
|
||||||
|
{
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case VertexElementFormat.Byte4:
|
||||||
|
return 4;
|
||||||
|
case VertexElementFormat.Color:
|
||||||
|
return 4;
|
||||||
|
case VertexElementFormat.HalfVector2:
|
||||||
|
return 4;
|
||||||
|
case VertexElementFormat.HalfVector4:
|
||||||
|
return 8;
|
||||||
|
case VertexElementFormat.NormalizedShort2:
|
||||||
|
return 4;
|
||||||
|
case VertexElementFormat.NormalizedShort4:
|
||||||
|
return 8;
|
||||||
|
case VertexElementFormat.Short2:
|
||||||
|
return 4;
|
||||||
|
case VertexElementFormat.Short4:
|
||||||
|
return 8;
|
||||||
|
case VertexElementFormat.Single:
|
||||||
|
return 4;
|
||||||
|
case VertexElementFormat.Vector2:
|
||||||
|
return 8;
|
||||||
|
case VertexElementFormat.Vector3:
|
||||||
|
return 12;
|
||||||
|
case VertexElementFormat.Vector4:
|
||||||
|
return 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new ArgumentException("Invalid format '" + format + "'.");
|
||||||
|
}
|
||||||
|
|
||||||
#region Translate (SurfaceFormat)
|
#region Translate (SurfaceFormat)
|
||||||
public static SharpDX.DXGI.Format Translate(SurfaceFormat surfaceFormat)
|
public static SharpDX.DXGI.Format Translate(SurfaceFormat surfaceFormat)
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,8 @@ namespace ANX.RenderSystem.Windows.DX11
|
|||||||
protected uint lastClearColor;
|
protected uint lastClearColor;
|
||||||
protected SharpDX.Color4 clearColor;
|
protected SharpDX.Color4 clearColor;
|
||||||
protected SharpDX.DXGI.SwapChain swapChain;
|
protected SharpDX.DXGI.SwapChain swapChain;
|
||||||
protected VertexBuffer currentVertexBuffer;
|
protected VertexBufferBinding[] currentVertexBuffer;
|
||||||
|
protected int currentVertexBufferCount;
|
||||||
protected IndexBuffer currentIndexBuffer;
|
protected IndexBuffer currentIndexBuffer;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -111,14 +111,14 @@ namespace ANX.RenderSystem.PsVita
|
|||||||
#region INativeGraphicsDevice Member
|
#region INativeGraphicsDevice Member
|
||||||
public void DrawIndexedPrimitives(PrimitiveType primitiveType,
|
public void DrawIndexedPrimitives(PrimitiveType primitiveType,
|
||||||
int baseVertex, int minVertexIndex, int numVertices, int startIndex,
|
int baseVertex, int minVertexIndex, int numVertices, int startIndex,
|
||||||
int primitiveCount)
|
int primitiveCount, IndexBuffer indexBuffer)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawInstancedPrimitives(PrimitiveType primitiveType,
|
public void DrawInstancedPrimitives(PrimitiveType primitiveType,
|
||||||
int baseVertex, int minVertexIndex, int numVertices, int startIndex,
|
int baseVertex, int minVertexIndex, int numVertices, int startIndex,
|
||||||
int primitiveCount, int instanceCount)
|
int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
@ -59,8 +59,13 @@ namespace ANX.RenderSystem.Windows.DX10
|
|||||||
#region SetValue (Matrix, transpose) (TODO)
|
#region SetValue (Matrix, transpose) (TODO)
|
||||||
public void SetValue(Matrix value, bool transpose)
|
public void SetValue(Matrix value, bool transpose)
|
||||||
{
|
{
|
||||||
// TODO: handle transpose!
|
Matrix val = value;
|
||||||
NativeParameter.AsMatrix().SetMatrix(value);
|
if (transpose)
|
||||||
|
{
|
||||||
|
Matrix.Transpose(ref val, out val);
|
||||||
|
}
|
||||||
|
|
||||||
|
NativeParameter.AsMatrix().SetMatrix(val);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
#region Using Statements
|
#region Using Statements
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using ANX.Framework;
|
using ANX.Framework;
|
||||||
using ANX.Framework.Graphics;
|
using ANX.Framework.Graphics;
|
||||||
using ANX.Framework.NonXNA;
|
using ANX.Framework.NonXNA;
|
||||||
using SharpDX.D3DCompiler;
|
using SharpDX.D3DCompiler;
|
||||||
using SharpDX.DXGI;
|
using SharpDX.DXGI;
|
||||||
|
using SharpDX.Direct3D10;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -243,9 +245,28 @@ namespace ANX.RenderSystem.Windows.DX10
|
|||||||
|
|
||||||
#region DrawInstancedPrimitives
|
#region DrawInstancedPrimitives
|
||||||
public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices,
|
public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices,
|
||||||
int startIndex, int primitiveCount, int instanceCount)
|
int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
|
||||||
{
|
{
|
||||||
nativeDevice.DrawIndexedInstanced(numVertices, instanceCount, startIndex, baseVertex, 0);
|
Dx10.EffectTechnique technique = SetupEffectForDraw();
|
||||||
|
int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
|
||||||
|
|
||||||
|
nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
|
||||||
|
nativeDevice.Rasterizer.SetViewports(currentViewport);
|
||||||
|
nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
|
||||||
|
|
||||||
|
if (indexBuffer != null)
|
||||||
|
{
|
||||||
|
SetIndexBuffer(indexBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < technique.Description.PassCount; ++i)
|
||||||
|
{
|
||||||
|
technique.GetPassByIndex(i).Apply();
|
||||||
|
nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
nativeDevice.InputAssembler.InputLayout.Dispose();
|
||||||
|
nativeDevice.InputAssembler.InputLayout = null;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -333,15 +354,13 @@ namespace ANX.RenderSystem.Windows.DX10
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region SetupInputLayout
|
#region SetupInputLayout
|
||||||
private void SetupInputLayout(ShaderBytecode passSignature)
|
private InputLayout SetupInputLayout(ShaderBytecode passSignature)
|
||||||
{
|
{
|
||||||
if (currentVertexBuffer == null)
|
// get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler
|
||||||
throw new ArgumentNullException("passSignature");
|
var layout = CreateInputLayout(nativeDevice, passSignature, currentVertexBuffer);
|
||||||
|
|
||||||
VertexDeclaration vertexDeclaration = currentVertexBuffer.VertexDeclaration;
|
nativeDevice.InputAssembler.InputLayout = layout;
|
||||||
var layout = CreateInputLayout(nativeDevice, passSignature, vertexDeclaration);
|
return layout;
|
||||||
|
|
||||||
nativeDevice.InputAssembler.InputLayout = layout;
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -367,15 +386,24 @@ namespace ANX.RenderSystem.Windows.DX10
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region SetVertexBuffers
|
#region SetVertexBuffers
|
||||||
public void SetVertexBuffers(VertexBufferBinding[] vertexBuffers)
|
public void SetVertexBuffers(ANX.Framework.Graphics.VertexBufferBinding[] vertexBuffers)
|
||||||
{
|
{
|
||||||
if (vertexBuffers == null)
|
if (vertexBuffers == null)
|
||||||
throw new ArgumentNullException("vertexBuffers");
|
throw new ArgumentNullException("vertexBuffers");
|
||||||
|
|
||||||
this.currentVertexBuffer = vertexBuffers[0].VertexBuffer; //TODO: hmmmmm, not nice :-)
|
this.currentVertexBufferCount = vertexBuffers.Length;
|
||||||
|
|
||||||
Dx10.VertexBufferBinding[] nativeVertexBufferBindings =
|
if (this.currentVertexBuffer == null || this.currentVertexBuffer.Length < currentVertexBufferCount)
|
||||||
new Dx10.VertexBufferBinding[vertexBuffers.Length];
|
{
|
||||||
|
this.currentVertexBuffer = new ANX.Framework.Graphics.VertexBufferBinding[currentVertexBufferCount];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < this.currentVertexBufferCount; i++)
|
||||||
|
{
|
||||||
|
this.currentVertexBuffer[i] = vertexBuffers[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
Dx10.VertexBufferBinding[] nativeVertexBufferBindings = new Dx10.VertexBufferBinding[vertexBuffers.Length];
|
||||||
for (int i = 0; i < vertexBuffers.Length; i++)
|
for (int i = 0; i < vertexBuffers.Length; i++)
|
||||||
{
|
{
|
||||||
ANX.Framework.Graphics.VertexBufferBinding anxVertexBufferBinding = vertexBuffers[i];
|
ANX.Framework.Graphics.VertexBufferBinding anxVertexBufferBinding = vertexBuffers[i];
|
||||||
@ -408,28 +436,53 @@ namespace ANX.RenderSystem.Windows.DX10
|
|||||||
/// This method creates a InputLayout which is needed by DirectX 10 for rendering primitives.
|
/// This method creates a InputLayout which is needed by DirectX 10 for rendering primitives.
|
||||||
/// The VertexDeclaration of ANX/XNA needs to be mapped to the DirectX 10 types.
|
/// The VertexDeclaration of ANX/XNA needs to be mapped to the DirectX 10 types.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature,
|
private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature, params VertexDeclaration[] vertexDeclaration)
|
||||||
VertexDeclaration vertexDeclaration)
|
|
||||||
{
|
{
|
||||||
VertexElement[] vertexElements = vertexDeclaration.GetVertexElements();
|
//TODO: try to get rid of the list
|
||||||
int elementCount = vertexElements.Length;
|
List<InputElement> inputElements = new List<InputElement>();
|
||||||
var inputElements = new Dx10.InputElement[elementCount];
|
foreach (VertexDeclaration decl in vertexDeclaration)
|
||||||
|
{
|
||||||
|
foreach (VertexElement vertexElement in decl.GetVertexElements())
|
||||||
|
{
|
||||||
|
inputElements.Add(CreateInputElementFromVertexElement(vertexElement, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < elementCount; i++)
|
return new Dx10.InputLayout(device, passSignature, inputElements.ToArray());
|
||||||
inputElements[i] = CreateInputElementFromVertexElement(vertexElements[i]);
|
|
||||||
|
|
||||||
return new Dx10.InputLayout(device, passSignature, inputElements);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Dx10.InputLayout CreateInputLayout(Dx10.Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings)
|
||||||
|
{
|
||||||
|
//TODO: try to get rid of the list
|
||||||
|
List<InputElement> inputElements = new List<InputElement>();
|
||||||
|
int slot = 0;
|
||||||
|
foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings)
|
||||||
|
{
|
||||||
|
foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements())
|
||||||
|
{
|
||||||
|
inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot));
|
||||||
|
}
|
||||||
|
slot++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Layout from VertexShader input signature
|
||||||
|
return new InputLayout(device, passSignature, inputElements.ToArray());
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CreateInputElementFromVertexElement
|
#region CreateInputElementFromVertexElement
|
||||||
private Dx10.InputElement CreateInputElementFromVertexElement(VertexElement vertexElement)
|
private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int slot)
|
||||||
{
|
{
|
||||||
string elementName = DxFormatConverter.Translate(ref vertexElement);
|
return CreateInputElementFromVertexElement(vertexElement, 0, slot);
|
||||||
Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat);
|
}
|
||||||
return new Dx10.InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, 0);
|
|
||||||
}
|
private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int instanceFrequency, int slot)
|
||||||
#endregion
|
{
|
||||||
|
string elementName = DxFormatConverter.Translate(ref vertexElement);
|
||||||
|
Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat);
|
||||||
|
return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, slot, instanceFrequency == 0 ? InputClassification.PerVertexData : InputClassification.PerInstanceData, instanceFrequency);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region SetRenderTargets
|
#region SetRenderTargets
|
||||||
public void SetRenderTargets(params RenderTargetBinding[] renderTargets)
|
public void SetRenderTargets(params RenderTargetBinding[] renderTargets)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#region Using Statements
|
#region Using Statements
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using ANX.Framework;
|
using ANX.Framework;
|
||||||
using ANX.Framework.Graphics;
|
using ANX.Framework.Graphics;
|
||||||
using ANX.Framework.NonXNA;
|
using ANX.Framework.NonXNA;
|
||||||
@ -250,9 +251,28 @@ namespace ANX.RenderSystem.Windows.DX11
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region DrawInstancedPrimitives
|
#region DrawInstancedPrimitives
|
||||||
public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount)
|
public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount, IndexBuffer indexBuffer)
|
||||||
{
|
{
|
||||||
nativeDevice.DrawIndexedInstanced(numVertices, instanceCount, startIndex, baseVertex, 0);
|
SharpDX.Direct3D11.EffectTechnique technique = SetupEffectForDraw();
|
||||||
|
int vertexCount = DxFormatConverter.CalculateVertexCount(primitiveType, primitiveCount);
|
||||||
|
|
||||||
|
nativeDevice.InputAssembler.PrimitiveTopology = DxFormatConverter.Translate(primitiveType);
|
||||||
|
nativeDevice.Rasterizer.SetViewports(currentViewport);
|
||||||
|
nativeDevice.OutputMerger.SetTargets(this.depthStencilView, this.renderView);
|
||||||
|
|
||||||
|
if (indexBuffer != null)
|
||||||
|
{
|
||||||
|
SetIndexBuffer(indexBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < technique.Description.PassCount; ++i)
|
||||||
|
{
|
||||||
|
technique.GetPassByIndex(i).Apply(nativeDevice);
|
||||||
|
nativeDevice.DrawIndexedInstanced(vertexCount, instanceCount, startIndex, baseVertex, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
nativeDevice.InputAssembler.InputLayout.Dispose();
|
||||||
|
nativeDevice.InputAssembler.InputLayout = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion // DrawInstancedPrimitives
|
#endregion // DrawInstancedPrimitives
|
||||||
@ -360,9 +380,7 @@ namespace ANX.RenderSystem.Windows.DX11
|
|||||||
private InputLayout SetupInputLayout(ShaderBytecode passSignature)
|
private InputLayout SetupInputLayout(ShaderBytecode passSignature)
|
||||||
{
|
{
|
||||||
// get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler
|
// get the VertexDeclaration from current VertexBuffer to create input layout for the input assembler
|
||||||
//TODO: check for null and throw exception
|
var layout = CreateInputLayout(nativeDevice.Device, passSignature, currentVertexBuffer);
|
||||||
VertexDeclaration vertexDeclaration = currentVertexBuffer.VertexDeclaration;
|
|
||||||
var layout = CreateInputLayout(nativeDevice.Device, passSignature, vertexDeclaration);
|
|
||||||
|
|
||||||
nativeDevice.InputAssembler.InputLayout = layout;
|
nativeDevice.InputAssembler.InputLayout = layout;
|
||||||
return layout;
|
return layout;
|
||||||
@ -394,7 +412,17 @@ namespace ANX.RenderSystem.Windows.DX11
|
|||||||
if (vertexBuffers == null)
|
if (vertexBuffers == null)
|
||||||
throw new ArgumentNullException("vertexBuffers");
|
throw new ArgumentNullException("vertexBuffers");
|
||||||
|
|
||||||
this.currentVertexBuffer = vertexBuffers[0].VertexBuffer; //TODO: hmmmmm, not nice :-)
|
this.currentVertexBufferCount = vertexBuffers.Length;
|
||||||
|
|
||||||
|
if (this.currentVertexBuffer == null || this.currentVertexBuffer.Length < currentVertexBufferCount)
|
||||||
|
{
|
||||||
|
this.currentVertexBuffer = new ANX.Framework.Graphics.VertexBufferBinding[currentVertexBufferCount];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < this.currentVertexBufferCount; i++)
|
||||||
|
{
|
||||||
|
this.currentVertexBuffer[i] = vertexBuffers[i].VertexBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
var nativeVertexBufferBindings = new SharpDX.Direct3D11.VertexBufferBinding[vertexBuffers.Length];
|
var nativeVertexBufferBindings = new SharpDX.Direct3D11.VertexBufferBinding[vertexBuffers.Length];
|
||||||
for (int i = 0; i < vertexBuffers.Length; i++)
|
for (int i = 0; i < vertexBuffers.Length; i++)
|
||||||
@ -425,26 +453,51 @@ namespace ANX.RenderSystem.Windows.DX11
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CreateInputLayout
|
#region CreateInputLayout
|
||||||
private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, VertexDeclaration vertexDeclaration)
|
private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, params VertexDeclaration[] vertexDeclaration)
|
||||||
{
|
{
|
||||||
VertexElement[] vertexElements = vertexDeclaration.GetVertexElements();
|
//TODO: try to get rid of the list
|
||||||
int elementCount = vertexElements.Length;
|
List<InputElement> inputElements = new List<InputElement>();
|
||||||
InputElement[] inputElements = new InputElement[elementCount];
|
foreach (VertexDeclaration decl in vertexDeclaration)
|
||||||
|
{
|
||||||
|
foreach (VertexElement vertexElement in decl.GetVertexElements())
|
||||||
|
{
|
||||||
|
inputElements.Add(CreateInputElementFromVertexElement(vertexElement, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < elementCount; i++)
|
return new InputLayout(device, passSignature, inputElements.ToArray());
|
||||||
inputElements[i] = CreateInputElementFromVertexElement(vertexElements[i]);
|
}
|
||||||
|
|
||||||
|
private InputLayout CreateInputLayout(Device device, ShaderBytecode passSignature, params ANX.Framework.Graphics.VertexBufferBinding[] vertexBufferBindings)
|
||||||
|
{
|
||||||
|
//TODO: try to get rid of the list
|
||||||
|
List<InputElement> inputElements = new List<InputElement>();
|
||||||
|
int slot = 0;
|
||||||
|
foreach (ANX.Framework.Graphics.VertexBufferBinding binding in vertexBufferBindings)
|
||||||
|
{
|
||||||
|
foreach (VertexElement vertexElement in binding.VertexBuffer.VertexDeclaration.GetVertexElements())
|
||||||
|
{
|
||||||
|
inputElements.Add(CreateInputElementFromVertexElement(vertexElement, binding.InstanceFrequency, slot));
|
||||||
|
}
|
||||||
|
slot++;
|
||||||
|
}
|
||||||
|
|
||||||
// Layout from VertexShader input signature
|
// Layout from VertexShader input signature
|
||||||
return new InputLayout(device, passSignature, inputElements);
|
return new InputLayout(device, passSignature, inputElements.ToArray());
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CreateInputElementFromVertexElement
|
#region CreateInputElementFromVertexElement
|
||||||
private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement)
|
private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int slot)
|
||||||
|
{
|
||||||
|
return CreateInputElementFromVertexElement(vertexElement, 0, slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement, int instanceFrequency, int slot)
|
||||||
{
|
{
|
||||||
string elementName = DxFormatConverter.Translate(ref vertexElement);
|
string elementName = DxFormatConverter.Translate(ref vertexElement);
|
||||||
Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat);
|
Format elementFormat = DxFormatConverter.ConvertVertexElementFormat(vertexElement.VertexElementFormat);
|
||||||
return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, 0);
|
return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, slot, instanceFrequency == 0 ? InputClassification.PerVertexData : InputClassification.PerInstanceData, instanceFrequency);
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user