Example #1
0
 private void WriteRemapIndices(BinaryWriter writer, bool platformMismatch)
 {
     if (SerialFlags.HasFlag(MeshSerialFlags.MSF_FACE_REMAP))
     {
         WriteIndices(remapIndices, writer, platformMismatch);
     }
 }
Example #2
0
        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);
                }
            }
        }
Example #3
0
 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})");
     }
 }
Example #4
0
 private void WriteMaterialIndices(BinaryWriter writer, bool platformMismatch)
 {
     if (SerialFlags.HasFlag(MeshSerialFlags.MSF_MATERIALS))
     {
         foreach (ushort materialIndex in MaterialIndices)
         {
             WriteWord(materialIndex, writer, platformMismatch);
         }
     }
 }
Example #5
0
        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
                   );
        }
Example #6
0
        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);
        }