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