private GameObject InstanciateMesh(Protometry.Mesh receivedMesh, Color[] colors) { var go = new GameObject(); var meshRenderer = go.AddComponent <MeshRenderer>(); var props = new MaterialPropertyBlock(); var m = new Material(Shader.Find("Custom/GpuInstancing")) { enableInstancing = true }; meshRenderer.sharedMaterial = m; props.SetColor("_Color", colors[0]); meshRenderer.SetPropertyBlock(props); var meshFilter = go.AddComponent <MeshFilter>(); // TODO: helper erutan.mesh -> unityengine.mesh var mesh = new UnityEngine.Mesh { vertices = receivedMesh.Vertices.ToList().Select(e => e.ToVector3()).ToArray(), triangles = receivedMesh.Tris.ToArray() }; if (receivedMesh.Normals != null) { mesh.normals = receivedMesh.Normals.ToList().Select(e => e.ToVector3()).ToArray(); foreach (var u in receivedMesh.Uvs) { mesh.uv.Append(new Vector2((float)u.X, (float)u.Y)); } } else { mesh.Optimize(); mesh.RecalculateNormals(); } meshFilter.mesh = mesh; mesh.colors = colors; go.AddComponent <BoxCollider>(); return(go); }
/// <summary> /// Update object (~=POST + PUT) /// </summary> /// <param name="packet"></param> private GameObject OnObjectUpdated(UpdateObjectPacket packet) { Object obj = null; var position = Vector3.zero; var rotation = Quaternion.identity; var scale = Vector3.zero; var colors = new[] { Color.white }; Protometry.Mesh mesh = null; // Update object case if (Objects.ContainsKey(packet.ObjectId)) { obj = Objects[packet.ObjectId]; } foreach (var c in packet.Components) { switch (c.TypeCase) { case Component.TypeOneofCase.Space: position = c.Space.Position.ToVector3(); rotation = c.Space.Rotation.ToQuaternion(); scale = c.Space.Scale.ToVector3(); break; case Component.TypeOneofCase.Render: colors = c.Render.Colors.Select(col => col.ToColor()).ToArray(); mesh = c.Render.Mesh; break; case Component.TypeOneofCase.Health: if (obj) { var rend = obj.GetComponent <Mesh>(); if (rend) { for (var i = 0; i < rend.colors.Length; i++) { rend.colors[i].r = Mathf.Clamp(4.0f * (float)c.Health.Life / 100f, 0.2f, 0.8f); } } } break; } } // Create object case if (!obj) { // Record.Log($"Creating object"); // GameObject go; // if (_preloaded != null) { // go = Pool.Spawn(_preloaded); // go.GetComponent<MeshRenderer>().sharedMaterial.color = colors[0]; // go.GetComponent<MeshFilter>().mesh.colors = colors; // _preloaded = go; // } else { // go = InstanciateMesh(mesh, colors); // Pool.Preload(go, 10); // } // // obj = go.AddComponent<Object>(); obj = InstanciateMesh(mesh, colors).AddComponent <Object>(); obj.Id = packet.ObjectId; obj.gameObject.name = $"{obj.Id}"; Objects[obj.Id] = obj; } //if (color.a < 1) { // Record.Log($"packet {color} pos {position}"); //} var transform1 = obj.transform; transform1.position = position; transform1.rotation = rotation; transform1.localScale = scale; obj.Components = packet.Components; return(obj.gameObject); }