5 using SiliconStudio.Paradox.Games;
6 using SiliconStudio.Paradox.Graphics;
7 using SiliconStudio.Core;
8 using SiliconStudio.Core.Mathematics;
9 using SiliconStudio.Paradox.Graphics.Data;
11 namespace SiliconStudio.
Paradox.Extensions
17 var vertexElementsWithOffsets = vertexBufferBinding.Declaration
18 .EnumerateWithOffsets()
19 .OrderBy(x => x.Offset)
22 var vertexElements =
new VertexElementConvertInfo[vertexElementsWithOffsets.Length];
24 int currentOffset = 0;
25 for (
int index = 0; index < vertexElementsWithOffsets.Length; index++)
27 var vertexElementConvertInfo =
new VertexElementConvertInfo();
28 vertexElementConvertInfo.VertexElementWithOffset = vertexElementsWithOffsets[index];
29 var vertexElement = vertexElementsWithOffsets[index]
.VertexElement;
30 var vertexElementFormat = vertexElementConvertInfo.VertexElementWithOffset.VertexElement.Format;
34 currentOffset = vertexElementsWithOffsets[index].Offset;
36 vertexElements[index] = vertexElementConvertInfo;
37 vertexElementConvertInfo.OldFormat = vertexElementConvertInfo.VertexElementWithOffset.VertexElement.Format;
41 switch (vertexElementFormat)
43 case PixelFormat.R32G32_Float:
44 vertexElementFormat = PixelFormat.R16G16_Float;
49 case PixelFormat.R32G32B32_Float:
50 vertexElementFormat = PixelFormat.R16G16B16A16_Float;
55 case PixelFormat.R32G32B32A32_Float:
56 vertexElementFormat = PixelFormat.R16G16B16A16_Float;
64 vertexElementConvertInfo.NeedConversion = vertexElementFormat != vertexElementConvertInfo.VertexElementWithOffset.VertexElement.Format;
67 vertexElementConvertInfo.VertexElementWithOffset.VertexElement
68 =
new VertexElement(vertexElement.semanticName, vertexElement.SemanticIndex, vertexElementFormat, currentOffset);
71 if (index + 1 < vertexElementsWithOffsets.Length)
72 currentOffset += vertexElementsWithOffsets[index + 1].Offset - vertexElementsWithOffsets[index].Offset;
74 currentOffset += offsetShift;
76 vertexElements[index] = vertexElementConvertInfo;
79 var oldVertexStride = vertexBufferBinding.Declaration.VertexStride;
81 vertexBufferBinding.Declaration =
new VertexDeclaration(vertexElements.Select(x => x.VertexElementWithOffset.VertexElement).ToArray());
83 var newVertexStride = vertexBufferBinding.Declaration.VertexStride;
84 var newBufferData =
new byte[vertexBufferBinding.Count * newVertexStride];
85 fixed (byte* oldBuffer = &vertexBufferBinding.
Buffer.Value.Content[vertexBufferBinding.
Offset])
86 fixed (byte* newBuffer = &newBufferData[0])
88 var oldBufferVertexPtr = (IntPtr)oldBuffer;
89 var newBufferVertexPtr = (IntPtr)newBuffer;
90 for (
int i = 0; i < vertexBufferBinding.Count; ++i)
92 foreach (var element
in vertexElements)
94 var oldBufferElementPtr = oldBufferVertexPtr + element.VertexElementWithOffset.Offset;
95 var newBufferElementPtr = newBufferVertexPtr + element.VertexElementWithOffset.VertexElement.AlignedByteOffset;
97 if (element.NeedConversion)
100 switch (element.OldFormat)
102 case PixelFormat.R32G32_Float:
105 case PixelFormat.R32G32B32_Float:
109 case PixelFormat.R32G32B32A32_Float:
117 Utilities.CopyMemory(newBufferElementPtr, oldBufferElementPtr, element.VertexElementWithOffset.Size);
121 oldBufferVertexPtr += oldVertexStride;
122 newBufferVertexPtr += newVertexStride;
126 vertexBufferBinding.Offset = 0;
130 private struct VertexElementConvertInfo
133 public bool NeedConversion;
The layout of a vertex buffer with a set of VertexElement.
Represents a two dimensional mathematical vector.
SiliconStudio.Paradox.Games.Mathematics.Half4 Half4
Represents a three dimensional mathematical vector.
SiliconStudio.Core.Serialization.ContentReference< SiliconStudio.Paradox.Graphics.Data.BufferData > Buffer
Data field for SiliconStudio.Paradox.Graphics.VertexBufferBinding.Buffer.
Represents a four dimensional mathematical vector.
Data type for SiliconStudio.Paradox.Graphics.VertexBufferBinding.
static unsafe void CompactHalf(this VertexBufferBindingData vertexBufferBinding)
Content of a GPU buffer (vertex buffer, index buffer, etc...).
Defines a two component vector, using half precision floating point coordinates.
Defines a four component vector, using half precision floating point coordinates. ...
System.Int32 Offset
Data field for SiliconStudio.Paradox.Graphics.VertexBufferBinding.Offset.
PixelFormat
Defines various types of pixel formats.
A description of a single element for the input-assembler stage. This structure is related to Direct3...