/// <summary> /// Called for each mesh part in the create messages. /// </summary> /// <param name="parent">The parent object for the part object.</param> /// <param name="reader">Message data reader.</param> /// <param name="partNumber">The part number/index.</param> /// <returns>An error code on failure.</returns> protected virtual Error AddMeshPart(GameObject parent, BinaryReader reader, int partNumber) { uint meshId = reader.ReadUInt32(); ObjectAttributes attributes = new ObjectAttributes(); if (!attributes.Read(reader)) { return(new Error(ErrorCode.MalformedMessage, (int)ObjectMessageID.Create)); } // Add the part and a child for the part's mesh. // This supports the mesh having its own transform or pivot offset. GameObject part = new GameObject(); ShapeComponent shape = part.AddComponent <ShapeComponent>(); part.name = string.Format("part{0}", partNumber); shape.ObjectID = meshId; // Use for mesh ID. shape.Category = 0; shape.ObjectFlags = 0; shape.Colour = ShapeComponent.ConvertColour(attributes.Colour); DecodeTransform(attributes, part.transform); part.transform.SetParent(parent.transform, false); return(new Error()); }
/// <summary> /// Overridden to read information about mesh parts. /// </summary> /// <param name="msg"></param> /// <param name="packet"></param> /// <param name="reader"></param> /// <returns></returns> protected override Error PostHandleMessage(CreateMessage msg, PacketBuffer packet, BinaryReader reader, ShapeCache cache, int shapeIndex) { PartSet parts = new PartSet(); ushort meshPartCount = reader.ReadUInt16(); parts.MeshIDs = new uint[meshPartCount]; parts.Meshes = new MeshCache.MeshDetails[meshPartCount]; parts.Transforms = new Matrix4x4[meshPartCount]; parts.Tints = new Maths.Colour[meshPartCount]; parts.MaterialOverrides = new Material[meshPartCount]; parts.ObjectFlags = (ObjectFlag)msg.Flags; for (ushort i = 0; i < meshPartCount; ++i) { parts.MeshIDs[i] = reader.ReadUInt32(); ObjectAttributes attributes = new ObjectAttributes(); if (!attributes.Read(reader)) { return(new Error(ErrorCode.MalformedMessage, (int)ObjectMessageID.Create)); } DecodeTransform(attributes, out parts.Transforms[i]); parts.Tints[i] = new Maths.Colour(attributes.Colour); } cache.SetShapeDataByIndex(shapeIndex, parts); RegisterForMesh(msg, parts); return(new Error()); }
/// <summary> /// Read the contents of a create message for a <c>MeshSet</c>. /// </summary> /// <param name="packet">The buffer from which the reader reads.</param> /// <param name="reader">Stream to read from</param> /// <returns>True on success.</returns> /// <remarks> /// Reads additional data about the mesh parts contained in the mesh. All parts are represented /// by a <see cref="PlaceholderMesh"/> as real mesh data cannot be resolved here. /// </remarks> public override bool ReadCreate(PacketBuffer packet, BinaryReader reader) { if (!_data.Read(reader)) { return(false); } // Read part details. // Note: we can only create placeholder meshes here for referencing resource IDs elsewhere. int partCount = reader.ReadUInt16(); _parts.Clear(); if (partCount > 0) { uint meshId; ObjectAttributes partAttributes = new ObjectAttributes(); for (int i = 0; i < partCount; ++i) { meshId = reader.ReadUInt32(); if (!partAttributes.Read(reader)) { return(false); } _parts.Add(new Part { Resource = new PlaceholderMesh(meshId), Transform = partAttributes.GetTransform(), Colour = new Colour(partAttributes.Colour) }); } } return(true); }