public static byte[] UnpackNormals(byte[] data, VertexAttributeType attributeType, ref int stride) { switch (attributeType) { case VertexAttributeType.TangentSpaceUnitVectorsCompressed: var packedElementSize = attributeType.GetSize(); stride = Vector3.SizeInBytes * 3; var count = (data.Length / packedElementSize); var bufferLength = count * stride; var buffer = new byte[bufferLength]; using (var binaryReader = new BinaryReader(new MemoryStream(data))) using (var binaryWriter = new BinaryWriter(new MemoryStream(buffer))) { while (binaryReader.BaseStream.Position < data.Length) { var normal = VertexFunctions.UnpackVectorInt(binaryReader.ReadInt32()); var tangent = VertexFunctions.UnpackVectorInt(binaryReader.ReadInt32()); var bitangent = VertexFunctions.UnpackVectorInt(binaryReader.ReadInt32()); binaryWriter.Write(normal); binaryWriter.Write(tangent); binaryWriter.Write(bitangent); } } return(buffer); default: return(data); } }
private static VertexBuffer UnpackLightingData(ref VertexBuffer vertexBuffer) { var packedElementSize = vertexBuffer.Type.GetSize( ); var stride = Vector3.SizeInBytes * 3; var count = vertexBuffer.Data.Length / packedElementSize; var bufferLength = count * stride; var buffer = new byte[bufferLength]; using (var binaryReader = new BinaryReader(new MemoryStream(vertexBuffer.Data))) using (var binaryWriter = new BinaryWriter(new MemoryStream(buffer))) { while (binaryReader.BaseStream.Position < vertexBuffer.Data.Length) { var normal = VertexFunctions.UnpackVectorInt(binaryReader.ReadInt32( )); var tangent = VertexFunctions.UnpackVectorInt(binaryReader.ReadInt32( )); var bitangent = VertexFunctions.UnpackVectorInt(binaryReader.ReadInt32( )); binaryWriter.Write(normal); binaryWriter.Write(tangent); binaryWriter.Write(bitangent); } } return(new VertexBuffer { Data = buffer, Type = VertexAttributeType.UnpackedLightingData }); }