Exemplo n.º 1
0
        public void SendFrame(MeshChunks meshChunks)
        {
            //VertexC4ubV3s[] sVertices = Array.ConvertAll(meshChunks.lVertices.ToArray(), x => x.toVertexC4ubV3s());
            VertexC4ubV3f[] sVertices = meshChunks.lVertices.ToArray();

            int nVerticesToSend  = meshChunks.lVertices.Count;
            int nTrianglesToSend = meshChunks.lTriangles.Count / 3;
            int nChunks          = meshChunks.trianglesChunkSizes.Count();

            byte[]  colorsArray   = new byte[sizeof(byte) * 3 * nVerticesToSend];
            float[] verticesArray = new float[sizeof(float) * 3 * nVerticesToSend];

            int[] triangles = meshChunks.lTriangles.ToArray();

            int pos1 = 0;
            int pos2 = 0;

            for (int i = 0; i < nVerticesToSend; i++)
            {
                colorsArray[pos1++]   = sVertices[i].R;
                colorsArray[pos1++]   = sVertices[i].G;
                colorsArray[pos1++]   = sVertices[i].B;
                verticesArray[pos2++] = sVertices[i].X;
                verticesArray[pos2++] = sVertices[i].Y;
                verticesArray[pos2++] = sVertices[i].Z;
            }

            byte[] colorsBuffer = new byte[sizeof(byte) * 3 * nVerticesToSend];
            Buffer.BlockCopy(colorsArray, 0, colorsBuffer, 0, sizeof(byte) * 3 * nVerticesToSend);

            byte[] verticesBuffer = new byte[sizeof(float) * 3 * nVerticesToSend];
            Buffer.BlockCopy(verticesArray, 0, verticesBuffer, 0, sizeof(float) * 3 * nVerticesToSend);

            byte[] trianglesBuffer = new byte[sizeof(int) * 3 * nTrianglesToSend];
            Buffer.BlockCopy(triangles, 0, trianglesBuffer, 0, sizeof(int) * 3 * nTrianglesToSend);

            byte[] chunksVerticesSizesBuffer = new byte[sizeof(int) * nChunks];
            Buffer.BlockCopy(meshChunks.verticesChunkSizes.ToArray(), 0, chunksVerticesSizesBuffer, 0, sizeof(int) * nChunks);

            byte[] chunksTrianglesSizesBuffer = new byte[sizeof(int) * nChunks];
            Buffer.BlockCopy(meshChunks.trianglesChunkSizes.ToArray(), 0, chunksTrianglesSizesBuffer, 0, sizeof(int) * nChunks);

            try
            {
                WriteInt(nVerticesToSend);
                WriteInt(nTrianglesToSend);
                WriteInt(nChunks);
                oSocket.GetStream().Write(chunksVerticesSizesBuffer, 0, chunksVerticesSizesBuffer.Length);
                oSocket.GetStream().Write(chunksTrianglesSizesBuffer, 0, chunksTrianglesSizesBuffer.Length);
                oSocket.GetStream().Write(verticesBuffer, 0, verticesBuffer.Length);
                oSocket.GetStream().Write(colorsBuffer, 0, colorsBuffer.Length);
                oSocket.GetStream().Write(trianglesBuffer, 0, trianglesBuffer.Length);
            }
            catch (Exception)
            {
            }
        }
Exemplo n.º 2
0
        private MeshChunks formVerticesChunks(List <VertexC4ubV3f> lVertices)
        {
            int chunkSizeLimit = 65000 - 3;

            MeshChunks ret               = new MeshChunks();
            int        nVertices         = lVertices.Count();
            List <int> trianglesInChunks = new List <int>();
            List <int> verticesInChunks  = new List <int>();
            int        currentVertex     = 0;

            while (currentVertex < nVertices)
            {
                int size = Math.Min(chunkSizeLimit, nVertices - currentVertex);
                verticesInChunks.Add(size);
                trianglesInChunks.Add(0);
                currentVertex += size;
            }

            ret.lTriangles          = new List <int>();
            ret.lVertices           = new List <VertexC4ubV3f>(lVertices);
            ret.trianglesChunkSizes = trianglesInChunks;
            ret.verticesChunkSizes  = verticesInChunks;
            return(ret);
        }
Exemplo n.º 3
0
        private void ReceivingWorker()
        {
            System.Timers.Timer checkConnectionTimer = new System.Timers.Timer();
            checkConnectionTimer.Interval = 1000;

            checkConnectionTimer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
            {
                lock (oClientSocketLock)
                {
                    for (int i = 0; i < lClientSockets.Count; i++)
                    {
                        if (!lClientSockets[i].SocketConnected())
                        {
                            lClientSockets.RemoveAt(i);
                            i--;
                        }
                    }
                }
            };

            checkConnectionTimer.Start();

            while (bServerRunning)
            {
                lock (oClientSocketLock)
                {
                    for (int i = 0; i < lClientSockets.Count; i++)
                    {
                        byte[] buffer = lClientSockets[i].Receive(1);

                        while (buffer.Length != 0)
                        {
                            if (buffer[0] == 0)
                            {
                                List <VertexC4ubV3f> lVerticesClonedLocal;
                                List <int>           lTrianglesClonedLocal;

                                lock (meshCopyLock)
                                {
                                    lVerticesClonedLocal  = new List <VertexC4ubV3f>(lVerticesCloned);
                                    lTrianglesClonedLocal = new List <int>(lTrianglesCloned);
                                }

                                if (lTrianglesClonedLocal.Count > 0)
                                {
                                    MeshChunks meshChunks = formMeshChunks(lVerticesClonedLocal, lTrianglesClonedLocal);
                                    Stopwatch  sw         = new Stopwatch();
                                    sw.Start();
                                    lClientSockets[i].SendFrame(meshChunks);
                                    sw.Stop();
                                    Console.WriteLine("Sending elapsed={0}", sw.ElapsedMilliseconds);
                                }
                                else if (lVerticesClonedLocal.Count > 0)
                                {
                                    MeshChunks meshChunks = formVerticesChunks(lVerticesClonedLocal);
                                    lClientSockets[i].SendFrame(meshChunks);
                                }
                            }

                            buffer = lClientSockets[i].Receive(1);
                        }
                    }
                }

                Thread.Sleep(10);
            }

            checkConnectionTimer.Stop();
        }
Exemplo n.º 4
0
        private MeshChunks formMeshChunks(List <VertexC4ubV3f> lVertices, List <int> lTriangles)
        {
            int chunkSizeLimit = 65000 - 3;

            MeshChunks ret               = new MeshChunks();
            int        nVertices         = lVertices.Count();
            int        nTriangles        = lTriangles.Count() / 3;
            List <int> trianglesInChunks = new List <int>();
            List <int> verticesInChunks  = new List <int>();

            int[]           chunkIndex          = new int[nVertices];
            int[]           verticesMap         = new int[nVertices];
            VertexC4ubV3f[] newVertices         = new VertexC4ubV3f[nTriangles * 3];
            int[]           newTriangles        = new int[nTriangles * 3];
            int             trianglesChunkStart = 0;
            int             currentChunkIndex   = 0;
            int             currentVertex       = 0;

            for (int v = 0; v < nVertices; v++)
            {
                chunkIndex[v] = -1;
            }

            int verticesInCurrentChunk = 0;

            Stopwatch sw = new Stopwatch();

            sw.Start();

            for (int t = 0; t < nTriangles * 3; t++)
            {
                int val = lTriangles[t];
                if (chunkIndex[val] != currentChunkIndex)
                {
                    newVertices[currentVertex] = lVertices[val];
                    verticesMap[val]           = verticesInCurrentChunk;
                    chunkIndex[val]            = currentChunkIndex;
                    currentVertex++;
                    newTriangles[t] = verticesInCurrentChunk;
                    verticesInCurrentChunk++;
                }
                else
                {
                    newTriangles[t] = verticesMap[val];
                }

                if (verticesInCurrentChunk >= chunkSizeLimit && (((t + 1) % 3) == 0))
                {
                    currentChunkIndex++;
                    verticesInChunks.Add(verticesInCurrentChunk);
                    trianglesInChunks.Add((t - trianglesChunkStart) / 3);
                    verticesInCurrentChunk = 0;
                    trianglesChunkStart    = t;
                }
            }

            if (verticesInCurrentChunk != 0)
            {
                verticesInChunks.Add(verticesInCurrentChunk);
                trianglesInChunks.Add((nTriangles * 3 - trianglesChunkStart) / 3);
            }

            ret.lTriangles          = new List <int>(newTriangles);
            ret.lVertices           = new List <VertexC4ubV3f>(SubArray(newVertices, 0, currentVertex));
            ret.trianglesChunkSizes = trianglesInChunks;
            ret.verticesChunkSizes  = verticesInChunks;

            sw.Stop();

            Console.WriteLine("Forming elapsed={0}", sw.ElapsedMilliseconds);

            return(ret);
        }