Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }