Exemple #1
0
        void OnStreamDataReceived(string name, byte[] data)
        {
            int index;

            if (int.TryParse(name, out index))
            {
                if (streamBufferList.Contains(index))
                {
                    List <byte> rawBuffer = new List <byte>(STMHttpBaseSerializer.Decompress(data));
                    List <KeyValuePair <double, byte[]> > buffers = new List <KeyValuePair <double, byte[]> >();
                    int cnt = 0;
                    foreach (int size in streamBufferByteSize[index])
                    {
                        double time = index * 10 + (double)cnt * 0.1;
                        byte[] buf  = rawBuffer.GetRange(0, size).ToArray();
                        buffers.Add(new KeyValuePair <double, byte[]>(time, buf));
                        rawBuffer.RemoveRange(0, size);
                        cnt++;
                        //Debug.Log("INDEX: " + index + ", time: " + time + ", size: " + size);
                    }
                    bufferedStream.AddRange(buffers);
                }
            }
        }
Exemple #2
0
        void LateUpdate()
        {
                        #if UNITY_EDITOR
            if (!Application.isPlaying || !EditorApplication.isPlayingOrWillChangePlaymode)
            {
                return;
            }
                        #endif

            currentTime += Time.deltaTime;
            if (currentTime > frameInterval)
            {
                currentTime -= frameInterval;
            }
            else
            {
                return;
            }

            bool isIframe = frameCnt == 0 ? true : false;
            if (isIframe)
            {
                tiling.SetInt("packSize", packageSize);
                tiling.SetInt("range", areaRange);
            }

            if (renderers != null)
            {
                Dictionary <int, TilePacker> dicPacks = new Dictionary <int, TilePacker>();
                List <FragmentVertex[]>      frag     = new List <FragmentVertex[]>();

                for (int i = 0; i < renderers.Count; i++)
                {
                    SkinnedMeshRenderer smr = renderers[i];
                    if (smr != null)
                    {
                        //convert to tiled vertices
                        Mesh tempMesh = new Mesh();
                        smr.BakeMesh(tempMesh);

                        //calculate shader threads and dipatch size;
                        int    alignedNum = 16;
                        string kernelName = "cs_main8";
                        int    verts      = tempMesh.vertices.Length;
                        int    dispatch   = 2;
                        for (int k = 0; k < alignedVerts.Length; k++)
                        {
                            int aligned = alignedVerts[k];
                            if (verts - aligned <= 0)
                            {
                                alignedNum = aligned;
                                kernelName = kernelNames[k];
                                dispatch   = dispatches[k];
                                break;
                            }
                        }

                        Vector3[] src = new Vector3[alignedNum];
                        tempMesh.vertices.CopyTo(src, 0);
                        DestroyImmediate(tempMesh);

                        Quaternion quat  = smr.transform.rotation;
                        Vector3    pos   = smr.transform.position - targetGameObject.transform.position;
                        Vector3    scale = new Vector3(1, 1, 1);

                        Matrix4x4 wrd = Matrix4x4.TRS(pos, quat, scale);

                        float[] wrdMatrix =
                        {
                            wrd.m00, wrd.m01, wrd.m02, wrd.m03,
                            wrd.m10, wrd.m11, wrd.m12, wrd.m13,
                            wrd.m20, wrd.m21, wrd.m22, wrd.m23,
                            wrd.m30, wrd.m31, wrd.m32, wrd.m33
                        };

                        if (isIframe)
                        {
                            tiling.SetFloats("wrdMatrix", wrdMatrix);
                            tiling.SetInt("modelGroup", i);

                            ComputeBuffer srcBuf = new ComputeBuffer(
                                alignedNum, Marshal.SizeOf(typeof(Vector3)));
                            ComputeBuffer destBuf = new ComputeBuffer(
                                alignedNum, Marshal.SizeOf(typeof(TiledVertex)));
                            srcBuf.SetData(src);

                            int kernelNum = tiling.FindKernel(kernelName);
                            tiling.SetBuffer(kernelNum, "srcBuf", srcBuf);
                            tiling.SetBuffer(kernelNum, "destBuf", destBuf);
                            tiling.Dispatch(kernelNum, dispatch, 1, 1);

                            TiledVertex[] data = new TiledVertex[src.Length];
                            destBuf.GetData(data);

                            srcBuf.Release();
                            destBuf.Release();

                            for (int j = 0; j < verts; j++)
                            {
                                TiledVertex vert   = data[j];
                                int         tx     = (vert.tileID & 0xFF);
                                int         ty     = (vert.tileID & 0xFF00) >> 8;
                                int         tz     = (vert.tileID & 0xFF0000) >> 16;
                                int         tileID = tx + ty * packageSize + tz * (packageSize * packageSize);
                                if (tx == 255 && ty == 255 && tz == 255)
                                {
                                    continue;
                                }

                                TilePacker tile;
                                if (!dicPacks.TryGetValue(tileID, out tile))
                                {
                                    tile = new TilePacker(tx, ty, tz);
                                    dicPacks.Add(tileID, tile);
                                }

                                ByteCoord coord = new ByteCoord();
                                coord.p1 = (byte)((vert.polyIndex & 0xFF));
                                coord.p2 = (byte)((vert.polyIndex & 0xFF00) >> 8);
                                coord.p3 = (byte)((vert.polyIndex & 0xFF0000) >> 16);
                                coord.x  = (byte)vert.x;
                                coord.y  = (byte)vert.y;
                                coord.z  = (byte)vert.z;

                                dicPacks[tileID].AddVertex(coord);
                            }
                        }
                        else
                        {
                            diff.SetFloats("wrdMatrix", wrdMatrix);
                            diff.SetFloats("oldMatrix", oldMatrix[i]);

                            ComputeBuffer srcBuf = new ComputeBuffer(
                                alignedNum, Marshal.SizeOf(typeof(Vector3)));
                            ComputeBuffer oldBuf = new ComputeBuffer(
                                alignedNum, Marshal.SizeOf(typeof(Vector3)));
                            ComputeBuffer destBuf = new ComputeBuffer(
                                alignedNum, Marshal.SizeOf(typeof(FragmentVertex)));
                            srcBuf.SetData(src);
                            oldBuf.SetData(oldVertsBuf[i]);

                            int kernelNum = diff.FindKernel(kernelName);
                            diff.SetBuffer(kernelNum, "srcBuf", srcBuf);
                            diff.SetBuffer(kernelNum, "oldBuf", oldBuf);
                            diff.SetBuffer(kernelNum, "destBuf", destBuf);
                            diff.Dispatch(kernelNum, dispatch, 1, 1);

                            FragmentVertex[] data = new FragmentVertex[src.Length];
                            destBuf.GetData(data);

                            srcBuf.Release();
                            oldBuf.Release();
                            destBuf.Release();

                            frag.Add(data);
                        }
                        oldVertsBuf[i] = src;
                        oldMatrix[i]   = wrdMatrix;
                    }
                }

                int         packages = 0;
                List <byte> lPacks   = new List <byte>();

                if (isIframe)
                {
                    linedIndices.Clear();
                    foreach (KeyValuePair <int, TilePacker> p in dicPacks)
                    {
                        packages++;
                        TilePacker pack = p.Value;
                        lPacks.AddRange(pack.PackToByteArray(packageSize));
                        linedIndices.AddRange(pack.getIndices());
                    }
                }
                else
                {
                    for (int i = 0; i < linedIndices.Count; i++)
                    {
                        int            meshIndex = (linedIndices[i] >> 16) & 0xFF;
                        int            vertIndex = linedIndices[i] & 0xFFFF;
                        FragmentVertex f         = frag[meshIndex][vertIndex];
                        byte[]         val       = new byte[3];
                        val[0] = (byte)(f.x);
                        val[1] = (byte)(f.y);
                        val[2] = (byte)(f.z);
                        lPacks.AddRange(val);
                    }
                }

                byte[] streamData =
                    AddHeader(lPacks.ToArray(), targetGameObject.transform.position, packages, isIframe, timeStamp);
                byteSize.Add(streamData.Length);
                combinedBinary.AddRange(streamData);

                timeStamp++;
                if (timeStamp % combinedFrames == 0 && timeStamp > 0)
                {
                    long       tick       = timeStamp / combinedFrames - 1;
                    StreamInfo streamInfo = serializer.CreateStreamInfo(tick, byteSize);
                    serializer.Send(streamInfo, tick);
                    serializer.Send(STMHttpBaseSerializer.Compress(combinedBinary.ToArray()), tick);

                    byteSize.Clear();
                    combinedBinary.Clear();
                }
            }
            frameCnt = (frameCnt + 1) % (subframesPerKeyframe + 1);
        }