Example #1
0
        /// <summary>
        /// Read and handle the <see cref="MeshCreateMessage"/>.
        /// </summary>
        /// <param name="reader">Stream to read from.</param>
        /// <returns>True on success.</returns>
        /// <remarks>
        /// Handling is deferred to <see cref="ProcessCreate(MeshCreateMessage)"/> which subclasses
        /// should implement.
        /// </remarks>
        public bool ReadCreate(BinaryReader reader)
        {
            MeshCreateMessage msg = new MeshCreateMessage();

            if (!msg.Read(reader))
            {
                return(false);
            }

            return(ProcessCreate(msg));
        }
Example #2
0
        /// <summary>
        /// Handles <see cref="MeshCreateMessage"/>
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="reader"></param>
        /// <returns></returns>
        /// <remarks>
        /// Emits <see cref="OnMeshAdded"/>.
        /// </remarks>
        protected Error CreateMesh(PacketBuffer packet, BinaryReader reader)
        {
            MeshCreateMessage msg = new MeshCreateMessage();

            if (!msg.Read(reader))
            {
                return(new Error(ErrorCode.MalformedMessage, MeshCreateMessage.MessageID));
            }

            if (_meshes.ContainsKey(msg.MeshID))
            {
                return(new Error(ErrorCode.DuplicateShape, msg.MeshID));
            }

            MeshDetails meshDetails = new MeshDetails();

            meshDetails.VertexCount = (int)msg.VertexCount;
            meshDetails.IndexCount  = (int)msg.IndexCount;
            meshDetails.DrawType    = msg.DrawType;
            switch (msg.DrawType)
            {
            case (byte)MeshDrawType.Points:
            // No break.
            case (byte)MeshDrawType.Voxels:
                meshDetails.Builder.Topology = MeshTopology.Points;
                break;

            case (byte)MeshDrawType.Lines:
                meshDetails.Builder.Topology = MeshTopology.Lines;
                break;

            case (byte)MeshDrawType.Triangles:
                meshDetails.Builder.Topology = MeshTopology.Triangles;
                break;

            default:
                return(new Error(ErrorCode.UnsupportedFeature, msg.DrawType));
            }

            meshDetails.ID            = msg.MeshID;
            meshDetails.LocalPosition = new Vector3(msg.Attributes.X, msg.Attributes.Y, msg.Attributes.Z);
            meshDetails.LocalRotation = new Quaternion(msg.Attributes.RotationX, msg.Attributes.RotationY, msg.Attributes.RotationZ, msg.Attributes.RotationW);
            meshDetails.LocalScale    = new Vector3(msg.Attributes.ScaleX, msg.Attributes.ScaleY, msg.Attributes.ScaleZ);
            meshDetails.Tint          = ShapeComponent.ConvertColour(msg.Attributes.Colour);
            meshDetails.Finalised     = false;
            _meshes.Add(meshDetails.ID, meshDetails);

            NotifyMeshAdded(meshDetails);

            return(new Error());
        }
Example #3
0
        /// <summary>
        /// Handles <see cref="MeshCreateMessage"/>
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="reader"></param>
        /// <returns></returns>
        /// <remarks>
        /// Emits <see cref="OnMeshAdded"/>.
        /// </remarks>
        protected Error CreateMesh(PacketBuffer packet, BinaryReader reader)
        {
            MeshCreateMessage msg = new MeshCreateMessage();

            if (!msg.Read(reader))
            {
                return(new Error(ErrorCode.MalformedMessage, MeshCreateMessage.MessageID));
            }

            if (_meshes.ContainsKey(msg.MeshID))
            {
                return(new Error(ErrorCode.DuplicateShape, msg.MeshID));
            }

            if (msg.DrawType < 0 || msg.DrawType > Enum.GetValues(typeof(MeshDrawType)).Length)
            {
                return(new Error(ErrorCode.UnsupportedFeature, msg.DrawType));
            }

            MeshDetails meshEntry  = new MeshDetails();
            RenderMesh  renderMesh = new RenderMesh((MeshDrawType)msg.DrawType, (int)msg.VertexCount, (int)msg.IndexCount);

            meshEntry.Mesh = renderMesh;

            meshEntry.ID            = msg.MeshID;
            meshEntry.LocalPosition = new Vector3(msg.Attributes.X, msg.Attributes.Y, msg.Attributes.Z);
            meshEntry.LocalRotation = new Quaternion(msg.Attributes.RotationX, msg.Attributes.RotationY, msg.Attributes.RotationZ, msg.Attributes.RotationW);
            meshEntry.LocalScale    = new Vector3(msg.Attributes.ScaleX, msg.Attributes.ScaleY, msg.Attributes.ScaleZ);
            meshEntry.Tint          = Maths.ColourExt.ToUnity32(new Maths.Colour(msg.Attributes.Colour));
            meshEntry.Finalised     = false;
            _meshes.Add(meshEntry.ID, meshEntry);

            NotifyMeshAdded(meshEntry);

            return(new Error());
        }