Ejemplo n.º 1
0
        /// <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());
        }
Ejemplo n.º 2
0
        /// <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());
        }
Ejemplo n.º 3
0
        /// <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);
        }