public static void WriteTransform(SetObjectTransform transform, XElement elem)
        {
            var pos = new XElement("Position");
            var rot = new XElement("Rotation");

            pos.AddElem(transform.Position);
            rot.AddElem(transform.Rotation);

            elem.Add(pos, rot);
        }
예제 #2
0
        private static void WriteTransform(ExtendedBinaryWriter writer,
                                           SetObjectTransform transform, bool writeLocalSpace)
        {
            // World-Space
            writer.Write(transform.Position);
            writer.Write(transform.Rotation.ToEulerAngles(true));

            // Local-Space
            if (writeLocalSpace)
            {
                writer.WriteNulls(0x18);
            }
        }
예제 #3
0
        private static SetObjectTransform ReadTransform(
            ExtendedBinaryReader reader, bool readLocalSpace)
        {
            var transform = new SetObjectTransform();

            // World Space
            transform.Position = reader.ReadVector3();
            transform.Rotation = new Quaternion(reader.ReadVector3(), true);

            // Local Space
            if (readLocalSpace)
            {
                transform.Position += reader.ReadVector3();

                // TODO: Convert euler angles rotation to quaternion and multiply.
                var localRotation = reader.ReadVector3();
                if (localRotation.X != 0 || localRotation.Y != 0 || localRotation.Z != 0)
                {
                    Console.WriteLine("Local rotation {0} is not zero!", localRotation);
                }
            }

            return(transform);
        }
        public static SetObject ReadObject(XElement element, string elemName = null,
                                           Dictionary <string, SetObjectType> objectTemplates = null)
        {
            // Parameters
            var parameters = new List <SetObjectParam>();
            var transform  = new SetObjectTransform();

            SetObjectTransform[] children = null;
            uint? objID = null;
            float?range = null;

            if (elemName == null)
            {
                elemName = element.Name.LocalName;
            }

            foreach (var paramElement in element.Elements())
            {
                // Special parameters
                string paramName = paramElement.Name.LocalName;
                switch (paramName.ToLower())
                {
                case "position":
                    transform.Position = paramElement.GetVector3();
                    continue;

                case "range":
                    range = float.Parse(paramElement.Value);
                    continue;

                case "rotation":
                    transform.Rotation = paramElement.GetQuaternion();
                    continue;

                case "setobjectid":
                    objID = uint.Parse(paramElement.Value);
                    continue;

                case "multisetparam":
                {
                    var countElem = paramElement.Element("Count");
                    if (countElem == null)
                    {
                        continue;
                    }

                    if (!int.TryParse(countElem.Value, out var childCount))
                    {
                        continue;
                    }

                    var childObjs = new List <SetObjectTransform>();
                    foreach (var specialElem in paramElement.Elements())
                    {
                        switch (specialElem.Name.LocalName.ToLower())
                        {
                        case "element":
                        {
                            var indexElem = specialElem.Element("Index");
                            var posElem   = specialElem.Element("Position");
                            var rotElem   = specialElem.Element("Rotation");

                            if (indexElem == null || !int.TryParse(
                                    indexElem.Value, out var index))
                            {
                                continue;
                            }

                            childObjs.Add(new SetObjectTransform()
                                    {
                                        Position = specialElem.GetVector3Elem("Position"),
                                        Rotation = specialElem.GetQuatElem("Rotation")
                                    });
                            break;
                        }

                            // TODO: Parse other elements.
                        }
                    }

                    children = childObjs.ToArray();
                    continue;
                }
                }

                // Type
                bool doAutoDetect = (objectTemplates == null ||
                                     !objectTemplates.ContainsKey(elemName));

                var templateParam = (!doAutoDetect) ?
                                    objectTemplates[elemName].GetParameter(paramName) : null;

                var paramType = (doAutoDetect || templateParam == null) ?
                                AutoDetectParamType(paramElement) :
                                templateParam.DataType;
                if (paramType == null)
                {
                    continue;
                }

                // Data
                object data =
                    (paramType == typeof(Vector3)) ? paramElement.GetVector3() :
                    (paramType == typeof(Quaternion)) ? paramElement.GetQuaternion() :
                    Helpers.ChangeType(paramElement.Value, paramType);

                // Add the Parameter to the list
                parameters.Add(new SetObjectParam()
                {
                    Data     = data,
                    DataType = paramType
                });
            }

            // Ensure Object has ID
            if (!objID.HasValue)
            {
                Console.WriteLine("WARNING: {0} \"{1}\" {2}",
                                  "Object of type", elemName,
                                  "is missing its object ID! Skipping this object...");
                return(null);
            }

            // Generate Object
            var obj = new SetObject()
            {
                ObjectType = elemName,
                Parameters = parameters,
                Transform  = transform,
                Children   = children ?? new SetObjectTransform[0],
                ObjectID   = objID.Value
            };

            if (range.HasValue)
            {
                obj.CustomData.Add("Range", new SetObjectParam(
                                       typeof(float), range.Value));
            }

            return(obj);
        }
예제 #5
0
        public static SetObject ReadObject(XElement element, string elemName = null,
                                           Dictionary <string, SetObjectType> objectTemplates = null)
        {
            // Parameters
            var parameters = new List <SetObjectParam>();
            var transform  = new SetObjectTransform();

            SetObjectTransform[] children = null;
            uint? objID = null;
            float?range = null;

            //float? drawDistance = null;
            //string objName = "";

            if (elemName == null)
            {
                elemName = element.Name.LocalName;
            }

            foreach (var paramElement in element.Elements())
            {
                // Special parameters
                string paramName = paramElement.Name.LocalName;
                switch (paramName.ToLower())
                {
                case "position":
                    transform.Position = paramElement.GetVector3();
                    continue;

                //case "range":
                //range = float.Parse(paramElement.Value);
                //continue;

                //case "drawdistance":
                //    drawDistance = float.Parse(paramElement.Value);
                //    continue;

                //case "objname":
                //    objName = paramElement.Value;
                //    continue;

                case "rotation":
                    transform.Rotation = paramElement.GetQuaternion();
                    continue;

                case "setobjectid":
                    objID = uint.Parse(paramElement.Value);
                    continue;

                case "multisetparam":
                {
                    var countElem = paramElement.Element("Count");
                    if (countElem == null)
                    {
                        continue;
                    }

                    if (!int.TryParse(countElem.Value, out var childCount))
                    {
                        continue;
                    }

                    var childObjs = new List <SetObjectTransform>();
                    foreach (var specialElem in paramElement.Elements())
                    {
                        switch (specialElem.Name.LocalName.ToLower())
                        {
                        case "element":
                        {
                            var indexElem = specialElem.Element("Index");
                            var posElem   = specialElem.Element("Position");
                            var rotElem   = specialElem.Element("Rotation");

                            if (indexElem == null || !int.TryParse(
                                    indexElem.Value, out var index))
                            {
                                continue;
                            }

                            childObjs.Add(new SetObjectTransform()
                                    {
                                        Position = specialElem.GetVector3Elem("Position"),
                                        Rotation = specialElem.GetQuatElem("Rotation")
                                    });
                            break;
                        }

                            // TODO: Parse other elements.
                        }
                    }

                    children = childObjs.ToArray();
                    continue;
                }
                }

                // Type
                bool doAutoDetect = (objectTemplates == null ||
                                     !objectTemplates.ContainsKey(elemName));

                var templateParam = (!doAutoDetect) ?
                                    objectTemplates[elemName].GetParameter(paramName) : null;

                var paramType = (doAutoDetect || templateParam == null) ?
                                AutoDetectParamType(paramElement) :
                                templateParam.DataType;
                if (paramType == null)
                {
                    continue;
                }

                // Data
                object data =
                    (paramType == typeof(Vector3)) ? paramElement.GetVector3() :
                    (paramType == typeof(Quaternion)) ? paramElement.GetQuaternion() :
                    Helpers.ChangeType(paramElement.Value, paramType);

                // Add the Parameter to the list
                parameters.Add(new SetObjectParam()
                {
                    Data     = data,
                    DataType = paramType
                });
            }

            // Ensure Object has ID
            if (!objID.HasValue)
            {
                Console.WriteLine("WARNING: {0} \"{1}\" {2}",
                                  "Object of type", elemName,
                                  "is missing its object ID! Skipping this object...");
                return(null);
            }

            // Generate Object
            var obj = new SetObject()
            {
                ObjectType = elemName,
                Parameters = parameters,
                Transform  = transform,
                Children   = children ?? new SetObjectTransform[0],
                ObjectID   = objID.Value,
                //ObjectName = objName
            };

            //if (range.HasValue)
            //{
            //    obj.CustomData.Add("Range", new SetObjectParam(
            //        typeof(float), range.Value));
            //}

            //if (drawDistance.HasValue)
            //{
            //    obj.DrawDistance = drawDistance.Value;
            //}
            //else
            //{
            //    obj.DrawDistance = 0;
            //}

            //Assign Unknown Bytes to object
            //var unknownBytesElem = element.Element("UnknownBytes");
            //int byteNumber = 0;
            //byte[] bytesXML = new byte[16];
            //if (unknownBytesElem != null)
            //{
            //    foreach (var bytes in unknownBytesElem.Elements())
            //    {
            //        bytesXML[byteNumber] = (byte)int.Parse(bytes.Value);
            //        byteNumber++;
            //    }
            //}
            //else
            //{
            //    bytesXML[0] = 64;
            //    bytesXML[1] = 0;
            //    bytesXML[2] = 0;
            //    bytesXML[3] = 0;
            //    bytesXML[4] = 0;
            //    bytesXML[5] = 0;
            //    bytesXML[6] = 0;
            //    bytesXML[7] = 0;
            //    bytesXML[8] = 0;
            //    bytesXML[9] = 0;
            //    bytesXML[10] = 0;
            //    bytesXML[11] = 0;
            //    bytesXML[12] = 0;
            //    bytesXML[13] = 0;
            //    bytesXML[14] = 0;
            //    bytesXML[15] = 0;
            //}
            //obj.UnknownBytes = bytesXML;

            return(obj);
        }