示例#1
0
 public static VPObjectInstance AddTransform(string modelName,
                                             float unitMultiplier, SetObjectTransform child,
                                             Vector3 posOffset)
 {
     return(AddObjectInstance(modelName,
                              (child.Position * unitMultiplier) + posOffset,
                              child.Rotation, child.Scale, child));
 }
        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 void Duplicate_SOBJ_ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (SelectedSetObject != null)
            {
                var sobj = new SetObject();
                sobj.ObjectID           = NewObjectForm.GenerateID(SetData);
                sobj.ObjectType         = SelectedSetObject.ObjectType;
                sobj.Transform          = new SetObjectTransform();
                sobj.Transform.Position = SelectedSetObject.Transform.Position;
                sobj.Transform.Rotation = SelectedSetObject.Transform.Rotation;
                sobj.Transform.Scale    = SelectedSetObject.Transform.Scale;

                // Copy Params
                foreach (var param in SelectedSetObject.Parameters)
                {
                    var newParam = new SetObjectParam();
                    newParam.Data     = param.Data;
                    newParam.DataType = param.DataType;
                    sobj.Parameters.Add(newParam);
                }

                // Copy Transforms
                var transforms = new List <SetObjectTransform>();
                foreach (var transform in SelectedSetObject.Children)
                {
                    var newTransform = new SetObjectTransform();
                    newTransform.Position = transform.Position;
                    newTransform.Rotation = transform.Rotation;
                    newTransform.Scale    = transform.Scale;
                    transforms.Add(newTransform);
                }
                sobj.Children = transforms.ToArray();

                SetData.Objects.Add(sobj);
                SelectSetObject(sobj);
                UpdateObjects();
            }
        }
        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;
            int     tarID  = 0;
            Vector3 tarPos = new Vector3();
            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;
                }

                case "target":
                {
                    var tarElem = paramElement.Element("SetObjectID");
                    if (tarElem == null)
                    {
                        continue;
                    }

                    if (!int.TryParse(tarElem.Value, out tarID))
                    {
                        continue;
                    }

                    //var childObjs = new List<SetObjectTransform>();

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

                case "targetposition":
                {
                    tarPos = paramElement.GetVector3();
                    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 GensSetObject()
            {
                ObjectType     = elemName,
                Parameters     = parameters,
                Transform      = transform,
                Children       = children ?? new SetObjectTransform[0],
                ObjectID       = objID.Value,
                TargetID       = (uint)tarID,
                TargetPosition = tarPos
            };

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

            return(obj);
        }