private void ModelButtonClick(Button button) { var data = (Model)button.Data; var req = new JesusWebRequest(ServerUrl.Url, "Model/Detail?id=" + data.Id); req.SendWait(); var jsonData = req.GetResponsePart <ResponseJsonModel>("JsonData"); var meshData = req.GetResponsePart <Stream>("ModelData"); if (jsonData == null) { Debug.LogError("Response json is null"); return; } if (meshData == null) { Debug.LogError("Response mesh is null"); return; } var mesh = UnityBinaryMesh.GetMesh(meshData); mesh.name = "FromServer: " + data.ModelFile.Id + (data.Name != null ? " - " + data.Name : ""); var newGo = new GameObject(mesh.name); // Func<UnityEngine.Material> getNewMat = () => new UnityEngine.Material(Shader.Find("IdMei/WorldSpaceMix")); Func <UnityEngine.Material> getNewMat = () => new UnityEngine.Material(Shader.Find("Standard")); var matList = new List <UnityEngine.Material>(); for (int i = 0; i < jsonData.Submeshes.Count; i++) { var subMesh = jsonData.Submeshes[i]; var material = jsonData.Materials[i]; var newMat = getNewMat(); // transfer properties matList.Add(newMat); } newGo.AddComponent <MeshRenderer>().materials = matList.ToArray(); newGo.AddComponent <MeshFilter>().mesh = mesh; Undo.RegisterCreatedObjectUndo(newGo, "Object download"); Selection.objects = new Object[] { newGo }; }
private void ModelFieldOnChange(GameObject gameObject) { // make db model var model = new Model { Name = gameObject.name, ModelCreator = new ModelCreator { Name = Login.GetGlobal().Username } }; var modelFile = model.ModelFile = new ModelFile(); model.ModelFile = modelFile; var meshRenderers = gameObject.GetComponentInChildren <MeshRenderer>(); var meshFilters = gameObject.GetComponentInChildren <MeshFilter>(); var mesh = meshFilters.sharedMesh; var submeshes = meshFilters.sharedMesh.subMeshCount; modelFile.Name = mesh.name; modelFile.BinaryStream = UnityBinaryMesh.GetMeshBinary(mesh); modelFile.Checksum = Crc32.Checksum(modelFile.BinaryStream); var materials = meshRenderers.sharedMaterials.Select(p => new MaterialConverter(p).GetDbMaterial()).ToArray(); var dataSubmeshes = materials.Select((p, i) => new SubMesh { Material = p, Channel = i, OwnerModel = model, }); var textures = materials.SelectMany(p => new[] { p.MapAlbedo, p.MapNormal, p.MapOcclusion, p.MapSmooth, p.MapMetal, p.MapHeight, p.MapEmissive }).Where(p => p != null).ToArray(); _previewDataStruct.Content = string.Format( "Model: {0}\n" + "FileSize: {1}kb\n" + "SubMeshes: {2}\n" + "Materials: {3}\n" + "Textures: {4}\n", model, Math.Round(modelFile.BinaryStream.Length / 1024f), dataSubmeshes.Count(), materials.Count(), string.Join("", textures.Select(p => "\n\t" + p.Name).ToArray()) ); Func <Stream, byte[]> getBytes = p => { p.Seek(0, SeekOrigin.Begin); var binaryReader = new BinaryReader(p); return(binaryReader.ReadBytes((int)p.Length)); }; Thread.Sleep(500); var newForm = new WWWForm(); for (var i = 0; i < textures.Length; i++) { newForm.AddBinaryData("texture[" + i + "]", getBytes(textures[i].BinaryStream), textures[i].Name, "application/octet-stream"); } newForm.AddBinaryData("modelFile", getBytes(modelFile.BinaryStream), "modelFile", "application/octet-stream"); newForm.AddBinaryData("jsonData", Encoding.UTF8.GetBytes(Json.Serialize(new{ textures, materials, Submeshes = dataSubmeshes, model, materialTags = _tagsWrapper.CheckedTags.Select(p => p.Id) })), "jsonData", "application/json"); _formData = newForm; _uploadButton.Hidden = false; }