Exemplo n.º 1
0
        void OnMeshInfoReceived(string name, MeshInfo info)
        {
            Mesh mesh = new Mesh();

            mesh.name = info.name + "_stm";

            Vector3[] verts = new Vector3[info.vertexCount];
            mesh.SetVertices(new List <Vector3>(verts));
            mesh.subMeshCount = info.subMeshCount;

            List <int> multiIndices = info.indices;
            int        offset       = 0;

            List <Material> materials = new List <Material>();

            for (int i = 0; i < info.subMeshCount; i++)
            {
                int        indicesCnt = info.indicesCounts[i];
                List <int> indices    = multiIndices.GetRange(offset, indicesCnt);
                offset += indicesCnt;
                mesh.SetIndices(indices.ToArray(), MeshTopology.Triangles, i);

                Material mat = null;
                foreach (KeyValuePair <string, Material> pair in materialList)
                {
                    if (pair.Key == info.materialNames[i])
                    {
                        mat      = pair.Value;
                        mat.name = pair.Key;
                    }
                }
                materials.Add(mat);
            }

            mesh.uv  = info.uv;
            mesh.uv2 = info.uv2;
            mesh.uv3 = info.uv3;
            mesh.uv4 = info.uv4;

            if (localRoot == null)
            {
                localRoot = new GameObject("ReceivedGameObject");
                localRoot.transform.SetParent(transform, false);
            }

            GameObject obj = new GameObject("Mesh" + meshBuf.Count);

            obj.transform.SetParent(localRoot.transform, false);
            MeshFilter   filter   = obj.AddComponent <MeshFilter>();
            MeshRenderer renderer = obj.AddComponent <MeshRenderer>();

            filter.mesh        = mesh;
            renderer.materials = materials.ToArray();
            vertsBuf.Add(new Vector3[mesh.vertexCount]);
            vertsBuf_old.Add(new Vector3[mesh.vertexCount]);

            meshBuf.Add(mesh);
            meshObjects.Add(obj);
            requestQueue--;
        }
Exemplo n.º 2
0
        void OnCombinedDataReceived(string name, byte[] data)
        {
            if (data.Length == 0)
            {
                Debug.LogWarning("CombinedData is null, abort to process");
                Invoke("TryRequestCombinedData", 1.0f);
                return;
            }
            byte[] rawData = StreamingMesh.Lib.ExternalTools.Decompress(data);

            int offsetBytes = 0;

            for (int i = 0; i < m_textureSizes.Count; i++)
            {
                int    size   = m_textureSizes[i];
                byte[] buffer = new byte[size];
                Buffer.BlockCopy(rawData, offsetBytes, buffer, 0, size);
                Texture2D texture = new Texture2D(2, 2);
                texture.LoadImage(buffer);
                offsetBytes += size;
                OnTextureReceived(m_textureNames[i], texture);
            }

            for (int i = 0; i < m_materialSizes.Count; i++)
            {
                int    size   = m_materialSizes[i];
                byte[] buffer = new byte[size];
                Buffer.BlockCopy(rawData, offsetBytes, buffer, 0, size);
                string       jsonString = Encoding.UTF8.GetString(buffer);
                MaterialInfo info       = JsonUtility.FromJson <MaterialInfo>(jsonString);
                offsetBytes += size;
                OnMaterialInfoReceived(m_materialNames[i], info);
            }

            for (int i = 0; i < m_meshSizes.Count; i++)
            {
                int    size   = m_meshSizes[i];
                byte[] buffer = new byte[size];
                Buffer.BlockCopy(rawData, offsetBytes, buffer, 0, size);
                string   jsonString = Encoding.UTF8.GetString(buffer);
                MeshInfo info       = JsonUtility.FromJson <MeshInfo>(jsonString);
                offsetBytes += size;
                OnMeshInfoReceived(m_meshNames[i], info);
            }
            isRequestComplete = true;
        }
Exemplo n.º 3
0
        public MeshInfo CreateMeshInfo(SkinnedMeshRenderer renderer)
        {
#if UNITY_EDITOR
            Mesh mesh = renderer.sharedMesh;
            if (mesh == null)
            {
                return(null);
            }
            MeshInfo meshInfo = new MeshInfo()
            {
                name         = mesh.name,
                vertexCount  = mesh.vertexCount,
                subMeshCount = mesh.subMeshCount,
                uv           = mesh.uv,
                uv2          = mesh.uv2,
                uv3          = mesh.uv3,
                uv4          = mesh.uv4
            };
            meshInfo.materialNames =
                (from m in renderer.sharedMaterials select m.name).ToList();

            meshInfo.indicesCounts = new List <int>();
            meshInfo.indices       = new List <int>();

            for (int i = 0; i < mesh.subMeshCount; i++)
            {
                int[] indices = mesh.GetIndices(i);
                meshInfo.indicesCounts.Add(indices.Length);
                meshInfo.indices.AddRange(indices);
            }

            return(meshInfo);
#else
            return(null);
#endif
        }
Exemplo n.º 4
0
        public void Send(MeshInfo meshInfo, int index)
        {
            string json = JsonUtility.ToJson(meshInfo);

            base.Send("mesh=" + index.ToString(), json, true);
        }
Exemplo n.º 5
0
        void CreateInfos()
        {
            if (serializer == null || renderers == null || targetGameObject == null)
            {
                string errorString = "";
                errorString += (serializer == null ? "serializer " : "");
                errorString += (renderers == null ? "rendrers " : "");
                errorString += (targetGameObject == null ? "target GameObject " : "");
                errorString += "is null on create channel!";
                Debug.LogError(errorString);
            }

            Dictionary <string, Material> materials = new Dictionary <string, Material>();
            Dictionary <string, Texture>  textures  = new Dictionary <string, Texture>();
            List <MeshInfo>     meshInfos           = new List <MeshInfo>();
            List <MaterialInfo> materialInfos       = new List <MaterialInfo>();

            List <string> meshNames     = new List <string>();
            List <string> materialNames = new List <string>();
            List <string> textureNames  = new List <string>();

            for (int i = 0; i < renderers.Count; i++)
            {
                SkinnedMeshRenderer renderer = renderers[i];
                if (renderer != null)
                {
                    MeshInfo meshInfo = serializer.CreateMeshInfo(renderer);
                    if (meshInfo == null)
                    {
                        continue;
                    }
                    meshInfos.Add(meshInfo);
                    meshNames.Add("mesh" + i);

                    for (int j = 0; j < renderer.sharedMaterials.Length; j++)
                    {
                        Material mat = renderer.sharedMaterials[j];
                        Material dummy;
                        if (materials.TryGetValue(mat.name, out dummy))
                        {
                            continue;
                        }
                        materials.Add(mat.name, mat);


                        MaterialInfo materialInfo = serializer.CreateMaterialInfo(mat);
                        if (materialInfo == null)
                        {
                            continue;
                        }
                        materialInfos.Add(materialInfo);
                        materialNames.Add("material" + materialNames.Count);

                        List <KeyValuePair <string, Texture> > texturePairs =
                            serializer.GetTexturesFromMaterial(mat);
                        foreach (KeyValuePair <string, Texture> texturePair in texturePairs)
                        {
                            Texture dummyTexture;
                            if (textures.TryGetValue(texturePair.Key, out dummyTexture))
                            {
                                continue;
                            }
                            textures.Add(texturePair.Key, texturePair.Value);
                            textureNames.Add(texturePair.Key);
                        }
                    }
                }
            }

            List <int>  meshBuffersSize = new List <int>();
            List <int>  matBuffersSize  = new List <int>();
            List <int>  texBuffersSize  = new List <int>();
            List <byte> combinedBuffer  = new List <byte>();

            foreach (KeyValuePair <string, Texture> texturePair in textures)
            {
                Texture texture = texturePair.Value;
                byte[]  buffer  = STMHttpSerializer.GetTextureToPNGByteArray(texture, true);
                texBuffersSize.Add(buffer.Length);
                combinedBuffer.AddRange(buffer);
            }

            for (int i = 0; i < materialInfos.Count; i++)
            {
                MaterialInfo matInfo   = materialInfos[i];
                string       matString = JsonUtility.ToJson(matInfo);
                byte[]       buffer    = Encoding.UTF8.GetBytes(matString);
                matBuffersSize.Add(buffer.Length);
                combinedBuffer.AddRange(buffer);
            }

            for (int i = 0; i < meshInfos.Count; i++)
            {
                MeshInfo meshInfo   = meshInfos[i];
                string   meshString = JsonUtility.ToJson(meshInfo);
                byte[]   buffer     = Encoding.UTF8.GetBytes(meshString);
                meshBuffersSize.Add(buffer.Length);
                combinedBuffer.AddRange(buffer);
            }

            byte[] compressedBuffer = StreamingMesh.Lib.ExternalTools.Compress(combinedBuffer.ToArray());

            ChannelInfo channelInfo = serializer.CreateChannelInfo(
                containerSize,
                packageSize,
                frameInterval,
                combinedFrames,
                meshNames,
                materialNames,
                textureNames,
                meshBuffersSize,
                matBuffersSize,
                texBuffersSize
                );

            serializer.Send(channelInfo);
            serializer.Send(compressedBuffer);
        }
Exemplo n.º 6
0
        void CreateInfos()
        {
            Dictionary <string, Material> materials = new Dictionary <string, Material>();
            Dictionary <string, Texture>  textures  = new Dictionary <string, Texture>();
            List <MeshInfo>     meshInfos           = new List <MeshInfo>();
            List <MaterialInfo> materialInfos       = new List <MaterialInfo>();

            List <string> meshNames     = new List <string>();
            List <string> materialNames = new List <string>();
            List <string> textureNames  = new List <string>();

            for (int i = 0; i < renderers.Count; i++)
            {
                SkinnedMeshRenderer renderer = renderers[i];
                if (renderer != null)
                {
                    MeshInfo meshInfo = serializer.CreateMeshInfo(renderer);
                    if (meshInfo == null)
                    {
                        continue;
                    }
                    meshInfos.Add(meshInfo);
                    meshNames.Add("mesh" + i + ".json");

                    for (int j = 0; j < renderer.sharedMaterials.Length; j++)
                    {
                        Material mat = renderer.sharedMaterials[j];
                        Material dummy;
                        if (materials.TryGetValue(mat.name, out dummy))
                        {
                            continue;
                        }
                        materials.Add(mat.name, mat);


                        MaterialInfo materialInfo = serializer.CreateMaterialInfo(mat);
                        if (materialInfo == null)
                        {
                            continue;
                        }
                        materialInfos.Add(materialInfo);
                        materialNames.Add("material" + materialNames.Count + ".json");

                        List <KeyValuePair <string, Texture> > texturePairs =
                            serializer.GetTexturesFromMaterial(mat);
                        foreach (KeyValuePair <string, Texture> texturePair in texturePairs)
                        {
                            Texture dummyTexture;
                            if (textures.TryGetValue(texturePair.Key, out dummyTexture))
                            {
                                continue;
                            }
                            textures.Add(texturePair.Key, texturePair.Value);
                            textureNames.Add(texturePair.Key + ".png");
                        }
                    }
                }
            }

            ChannelInfo channelInfo = serializer.CreateChannelInfo(
                areaRange,
                packageSize,
                frameInterval,
                combinedFrames,
                meshNames,
                materialNames,
                textureNames
                );

            serializer.Send(channelInfo);

            for (int i = 0; i < meshInfos.Count; i++)
            {
                MeshInfo meshInfo = meshInfos[i];
                serializer.Send(meshInfo, i);
            }

            for (int i = 0; i < materialInfos.Count; i++)
            {
                MaterialInfo matInfo = materialInfos[i];
                serializer.Send(matInfo, i);
            }

            foreach (KeyValuePair <string, Texture> texturePair in textures)
            {
                Texture texture = texturePair.Value;
                serializer.Send(texture, true);
            }
        }