/// <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)); }
/// <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()); }
/// <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()); }