public BasicPropertyUIContainer(General3dWorldObject obj, EditorSceneBase scene)
            {
                this.obj   = obj;
                this.scene = scene;

                DB_classNames = Program.ParameterDB.ObjectParameters.Keys.ToArray();

                UpdateClassNameInfo();
            }
예제 #2
0
            public BasicPropertyUIContainer(General3dWorldObject obj, EditorSceneBase scene)
            {
                this.obj   = obj;
                this.scene = scene;

                if (Program.ParameterDB.ObjectParameters.TryGetValue(obj.ClassName, out ObjectParam entry))
                {
                    DB_objectNames = entry.ObjectNames.ToArray();
                    DB_modelNames  = entry.ModelNames.ToArray();
                }
                else
                {
                    DB_objectNames = Array.Empty <string>();
                    DB_modelNames  = Array.Empty <string>();
                }
            }
예제 #3
0
        /// <summary>
        /// Parses a 3d World from an ArrayEntry
        /// </summary>
        /// <param name="objectEntry"></param>
        /// <param name="zone"></param>
        /// <param name="objectsByReference"></param>
        /// <returns></returns>
        public static I3dWorldObject ParseObject(ArrayEntry objectEntry, SM3DWorldZone zone, Dictionary <long, I3dWorldObject> objectsByReference, out bool alreadyInLinks, Dictionary <string, I3dWorldObject> linkedObjsByID, bool isLinked = false)
        {
            ObjectInfo info = GetObjectInfo(ref objectEntry, zone);

            I3dWorldObject obj;
            bool           loadLinks;

            if (Enum.GetNames(typeof(Rail.RailObjType)).Contains(info.ClassName))
            {
                obj = new Rail(info, zone, out loadLinks);
            }
            else
            {
                obj = new General3dWorldObject(info, zone, out loadLinks);
            }

            if (linkedObjsByID != null && isLinked)
            {
                if (!linkedObjsByID.ContainsKey(info.ID))
                {
                    linkedObjsByID.Add(info.ID, obj);
                }
                else
                {
                    alreadyInLinks = true;

                    obj = linkedObjsByID[info.ID];

                    if (!isLinked)
                    {
                        alreadyInLinks = !zone.LinkedObjects.Remove(obj);
                    }

                    //in case this object was already read in another file
                    if (!objectsByReference.ContainsKey(objectEntry.Position))
                    {
                        objectsByReference.Add(objectEntry.Position, obj);
                    }

                    return(obj);
                }
            }

            alreadyInLinks = false;

            if (!objectsByReference.ContainsKey(objectEntry.Position))
            {
                objectsByReference.Add(objectEntry.Position, obj);
            }
            else if (!isLinked)
            {
                obj = objectsByReference[objectEntry.Position];
                zone.LinkedObjects.Remove(obj);
                return(obj);
            }

            if (loadLinks)
            {
                obj.Links = new Dictionary <string, List <I3dWorldObject> >();
                foreach (DictionaryEntry link in info.LinkEntries.Values)
                {
                    obj.Links.Add(link.Key, new List <I3dWorldObject>());
                    foreach (ArrayEntry linked in link.IterArray())
                    {
                        if (objectsByReference.ContainsKey(linked.Position))
                        {
                            obj.Links[link.Key].Add(objectsByReference[linked.Position]);
                            objectsByReference[linked.Position].AddLinkDestination(link.Key, obj);
                        }
                        else
                        {
                            I3dWorldObject _obj = ParseObject(linked, zone, objectsByReference, out bool linkedAlreadyReferenced, linkedObjsByID, true);
                            _obj.AddLinkDestination(link.Key, obj);
                            obj.Links[link.Key].Add(_obj);
                            if (zone != null && !linkedAlreadyReferenced)
                            {
                                zone.LinkedObjects.Add(_obj);
                            }
                        }
                    }
                }
                if (obj.Links.Count == 0)
                {
                    obj.Links = null;
                }
            }

            return(obj);
        }
예제 #4
0
 public LinksProvider(General3dWorldObject obj, EditorSceneBase scene)
 {
     this.obj   = obj;
     this.scene = scene;
 }
예제 #5
0
 public BasicPropertyProvider(General3dWorldObject obj, EditorSceneBase scene)
 {
     this.obj   = obj;
     this.scene = scene;
 }