private void WriteRemapIndices(BinaryWriter writer, bool platformMismatch) { if (SerialFlags.HasFlag(MeshSerialFlags.MSF_FACE_REMAP)) { WriteIndices(remapIndices, writer, platformMismatch); } }
private void WriteTriangles(BinaryWriter writer, bool platformMismatch) { if (SerialFlags.HasFlag(MeshSerialFlags.MSF_8BIT_INDICES) && SerialFlags.HasFlag(MeshSerialFlags.MSF_16BIT_INDICES)) { throw new OpcodeException($"Invalid serial flags {SerialFlags}"); } if (SerialFlags.HasFlag(MeshSerialFlags.MSF_8BIT_INDICES)) { foreach (Triangle triangle in Triangles) { writer.Write((byte)triangle.v0); writer.Write((byte)triangle.v1); writer.Write((byte)triangle.v2); } } else if (SerialFlags.HasFlag(MeshSerialFlags.MSF_16BIT_INDICES)) { foreach (Triangle triangle in Triangles) { WriteWord((ushort)triangle.v0, writer, platformMismatch); WriteWord((ushort)triangle.v1, writer, platformMismatch); WriteWord((ushort)triangle.v2, writer, platformMismatch); } } else { foreach (Triangle triangle in Triangles) { WriteDword(triangle.v0, writer, platformMismatch); WriteDword(triangle.v1, writer, platformMismatch); WriteDword(triangle.v2, writer, platformMismatch); } } }
private void ValidateTriangleMesh() { if (SerialFlags.HasFlag(MeshSerialFlags.MSF_8BIT_INDICES) && SerialFlags.HasFlag(MeshSerialFlags.MSF_16BIT_INDICES)) { throw new OpcodeException($"Invalid serial flags {SerialFlags}"); } if (SerialFlags.HasFlag(MeshSerialFlags.MSF_MATERIALS) && MaterialIndices.Count != NumTriangles) { throw new OpcodeException($"Number of material indices ({MaterialIndices.Count}) does not match the number of triangles ({Triangles.Count})"); } if (SerialFlags.HasFlag(MeshSerialFlags.MSF_FACE_REMAP) && remapIndices.Count != NumTriangles) { throw new OpcodeException($"Number of remap indices ({remapIndices.Count}) does not match the number of triangles ({Triangles.Count})"); } if (numConvexParts > 0 && convexParts.Count != NumTriangles) { throw new OpcodeException($"Number of convex parts elements ({convexParts.Count}) does not match the number of triangles ({Triangles.Count})"); } if (numFlatParts > 0 && flatParts.Count != NumTriangles) { throw new OpcodeException($"Number of flat parts elements ({flatParts.Count}) does not match the number of triangles ({Triangles.Count})"); } if (ExtraTriangleData.Count != NumTriangles) { throw new OpcodeException($"Number of extra triangle data({ExtraTriangleData.Count}) does not match the number of triangles ({Triangles.Count})"); } }
private void WriteMaterialIndices(BinaryWriter writer, bool platformMismatch) { if (SerialFlags.HasFlag(MeshSerialFlags.MSF_MATERIALS)) { foreach (ushort materialIndex in MaterialIndices) { WriteWord(materialIndex, writer, platformMismatch); } } }
public uint GetUsedBytes() { uint triangleStride; if (SerialFlags.HasFlag(MeshSerialFlags.MSF_8BIT_INDICES)) { triangleStride = 3; } else if (SerialFlags.HasFlag(MeshSerialFlags.MSF_16BIT_INDICES)) { triangleStride = 3 * 2; } else { triangleStride = 3 * 4; } return(12 // header (2 x magic + version) + 4 // serial flags + 4 // convexEdgeThreshold + 4 // heightFieldVerticalAxis + 4 // heightFieldVerticalExtent + 4 // numVertices + 4 // numTriangles + NumVertices * 12 // vertices + NumTriangles * triangleStride // triangles + (SerialFlags.HasFlag(MeshSerialFlags.MSF_MATERIALS) ? NumTriangles * 2 : 0) // material indices + (SerialFlags.HasFlag(MeshSerialFlags.MSF_FACE_REMAP) ? GetUsedBytesByIndices(remapIndices) : 0) // remap indices + 4 // numConvexParts + 4 // numFlatParts + (numConvexParts > 0 ? ((uint)convexParts.Count) * 2 : 0) // convexParts + (numFlatParts > 0 ? (numFlatParts < 256 ? ((uint)flatParts.Count) * 1 : ((uint)flatParts.Count) * 2) : 0) // flatParts + 4 // modelSize + hybridModel.GetUsedBytes() // hybrid model + 4 // geomEpsilon + 4 * 10 // bounds + 4 * 13 // mass + inertia tensor + center of mass + 4 // numExtraTriangleData + ((uint)ExtraTriangleData.Count) * 1 // extraTriangleData ); }
private void SendData() { _logger.Log("Sending data...", LoggingLevel.Info); if (_receivedSectorCount == 1) { _logger.Log("Reading sector " + _receivedSectorIndex, LoggingLevel.Debug); } else { _logger.Log("Reading sectors " + _receivedSectorIndex + " - " + (_receivedSectorIndex + _receivedSectorCount - 1), LoggingLevel.Debug); } byte[] sendDataBuffer = _localDisk.ReadSectors(Convert.ToInt32(_receivedSectorIndex), Convert.ToInt32(_receivedSectorCount)); UInt32 crc32Checksum = CRC32.CalculateCRC32(sendDataBuffer); SerialFlags serialFlags = SerialFlags.None; if (_compressionIsEnabled) { serialFlags |= SerialFlags.Compression; } _logger.Log($"Sending serial flags: {serialFlags}...", LoggingLevel.Debug); _serialPort.BaseStream.WriteByte(Convert.ToByte(serialFlags)); var numUncompressedBytes = sendDataBuffer.Length; string sendingMessage = $"Sending {numUncompressedBytes} bytes"; if (serialFlags.HasFlag(SerialFlags.Compression)) { sendDataBuffer = Utilities.LZ4.CompressAsStandardLZ4Block(sendDataBuffer); sendingMessage = $"Sending {sendDataBuffer.Length} bytes"; _transferStartDateTime = DateTime.Now; byte[] dataLenBuffer = new byte[4]; dataLenBuffer[0] = (byte)((sendDataBuffer.Length >> 24) & 0xff); dataLenBuffer[1] = (byte)((sendDataBuffer.Length >> 16) & 0xff); dataLenBuffer[2] = (byte)((sendDataBuffer.Length >> 8) & 0xff); dataLenBuffer[3] = (byte)(sendDataBuffer.Length & 0xff); float percentageOfOriginalSize = (100 / (float)numUncompressedBytes) * sendDataBuffer.Length; _logger.Log($"Compression: { percentageOfOriginalSize.ToString("00.00")}% of { numUncompressedBytes} bytes", LoggingLevel.Debug); _serialPort.BaseStream.Write(dataLenBuffer, 0, dataLenBuffer.Length); } _logger.Log(sendingMessage, LoggingLevel.Info); for (int i = 0; i < sendDataBuffer.Length; i++) { _serialPort.BaseStream.WriteByte(sendDataBuffer[i]); string percentSent = ((Convert.ToDecimal(i + 1) / sendDataBuffer.Length) * 100).ToString("00.00"); Console.Write($"\rSent [{(i + 1).ToString("D" + sendDataBuffer.Length.ToString().Length)} / {sendDataBuffer.Length} Bytes] {percentSent}% "); } Console.WriteLine(); byte[] crc32Buffer = new byte[4]; crc32Buffer[0] = (byte)((crc32Checksum >> 24) & 0xff); crc32Buffer[1] = (byte)((crc32Checksum >> 16) & 0xff); crc32Buffer[2] = (byte)((crc32Checksum >> 8) & 0xff); crc32Buffer[3] = (byte)(crc32Checksum & 0xff); _logger.Log("Sending CRC32...", LoggingLevel.Debug); _serialPort.BaseStream.Write(crc32Buffer, 0, crc32Buffer.Length); _state = ReceiverState.ReceiveStartMagic; _logger.Log($"Receiver state: {_state}", LoggingLevel.Debug); }