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--; }
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; }
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 }
public void Send(MeshInfo meshInfo, int index) { string json = JsonUtility.ToJson(meshInfo); base.Send("mesh=" + index.ToString(), json, true); }
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); }
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); } }