예제 #1
0
        internal ObjectConsumer(ProducerThread pt) : base(pt)
        {
            deflang = Helper.WindowsRegistry.LanguageCode;

            this.pict = new ArrayList();
            SimPe.PackedFiles.Wrapper.Picture pw = new SimPe.PackedFiles.Wrapper.Picture();
            uint[] picts = pw.AssignableTypes;
            foreach (uint p in picts)
            {
                this.pict.Add(p);
            }
        }
예제 #2
0
        void ProduceByXObj(uint type)
        {
            ArrayList pitems = new ArrayList();
            ArrayList groups = new ArrayList();
            int       ct     = 0;

            //this is the first part loading by objd Resources
            Interfaces.Scenegraph.IScenegraphFileIndexItem[] nrefitems = FileTable.FileIndex.Sort(FileTable.FileIndex.FindFile(type, true));
            string len = " / " + nrefitems.Length.ToString();

            SimPe.Data.MetaData.Languages deflang = Helper.WindowsRegistry.LanguageCode;
            Wait.Message     = "Loading Walls, Fences and Floors";
            Wait.MaxProgress = nrefitems.Length;
            foreach (Interfaces.Scenegraph.IScenegraphFileIndexItem lnrefitem in nrefitems)
            {
                ct++;
                Interfaces.Scenegraph.IScenegraphFileIndexItem nrefitem = lnrefitem;
                if (ct % 134 == 1)
                {
                    Wait.Progress = ct;
                }

#if MAC
                Console.WriteLine(ct.ToString() + len);
#endif

                //if (nrefitem.FileDescriptor.Instance != 0x41A7) continue;
                if (nrefitem.LocalGroup == Data.MetaData.LOCAL_GROUP)
                {
                    continue;
                }
                if (pitems.Contains(nrefitem))
                {
                    continue;
                }
                if (groups.Contains(nrefitem.FileDescriptor.Instance))
                {
                    continue;
                }


                //try to find the best objd



                Interfaces.Scenegraph.IScenegraphFileIndexItem[] cacheitems = cachefile.FileIndex.FindFile(nrefitem.FileDescriptor, nrefitem.Package);

                //find the correct File
                int    cindex = -1;
                string pname  = nrefitem.Package.FileName.Trim().ToLower();
                for (int i = 0; i < cacheitems.Length; i++)
                {
                    Interfaces.Scenegraph.IScenegraphFileIndexItem citem = cacheitems[i];

                    if (citem.FileDescriptor.Filename == pname)
                    {
                        cindex = i;
                        break;
                    }
                }

                if (cindex != -1)               //found in the cache
                {
                    SimPe.Cache.ObjectCacheItem oci = (SimPe.Cache.ObjectCacheItem)cacheitems[cindex].FileDescriptor.Tag;
                    if (!oci.Useable)
                    {
                        continue;
                    }
                    pitems.Add(nrefitem);
                    groups.Add(nrefitem.FileDescriptor.Instance);

                    oci.Tag = nrefitem;
                    this.AddToBuffer(oci);
                }
                else
                {
                    pitems.Add(nrefitem);
                    groups.Add(nrefitem.FileDescriptor.Instance);

                    SimPe.Cache.ObjectCacheItem oci = new SimPe.Cache.ObjectCacheItem();
                    oci.Tag     = nrefitem;
                    oci.Useable = false;
                    cachechg    = true;
                    cachefile.AddItem(oci, nrefitem.Package.FileName);

                    this.AddToBuffer(oci);
                }
            }
        }
예제 #3
0
        internal static bool DoConsume(Object o, ObjectLoader.LoadItemHandler LoadedItem, SimPe.Data.MetaData.Languages deflang)
        {
            SimPe.Cache.ObjectCacheItem oci = (SimPe.Cache.ObjectCacheItem)o;
            Interfaces.Scenegraph.IScenegraphFileIndexItem nrefitem = (Interfaces.Scenegraph.IScenegraphFileIndexItem)oci.Tag;


            //this item is new to the cache, so load the Data
            if ((!oci.Useable || oci.ObjectVersion != SimPe.Cache.ObjectCacheItemVersions.DockableOW) && nrefitem.FileDescriptor.Type == Data.MetaData.OBJD_FILE)
            {
                SimPe.PackedFiles.Wrapper.ExtObjd objd = new SimPe.PackedFiles.Wrapper.ExtObjd();
                nrefitem.FileDescriptor.UserData = nrefitem.Package.Read(nrefitem.FileDescriptor).UncompressedData;
                objd.ProcessData(nrefitem);

                oci.FileDescriptor     = nrefitem.FileDescriptor;
                oci.LocalGroup         = nrefitem.LocalGroup;
                oci.ObjectType         = objd.Type;
                oci.ObjectFunctionSort = (uint)objd.FunctionSubSort;
                oci.ObjectFileName     = objd.FileName;
                oci.Useable            = true;
                oci.Class = SimPe.Cache.ObjectClass.Object;

                //this is needed, so that objects get sorted into the right categories

                /*if (objd.Type == Data.ObjectTypes.Normal && objd.CTSSInstance==0)
                 * {
                 *      oci.Useable = false;
                 *      return true;
                 * }*/

                //Get the Name of the Object
                Interfaces.Scenegraph.IScenegraphFileIndexItem[] ctssitems = FileTable.FileIndex.FindFile(Data.MetaData.CTSS_FILE, nrefitem.LocalGroup);
                if (ctssitems.Length > 0)
                {
                    SimPe.PackedFiles.Wrapper.Str str = new SimPe.PackedFiles.Wrapper.Str();
                    str.ProcessData(ctssitems[0]);
                    SimPe.PackedFiles.Wrapper.StrItemList items = str.LanguageItems(deflang);
                    if (items.Length > 0)
                    {
                        oci.Name = items[0].Title;
                    }
                    else
                    {
                        items = str.LanguageItems(1);
                        if (items.Length > 0)
                        {
                            oci.Name = items[0].Title;
                        }
                        else
                        {
                            oci.Name = "";
                        }
                    }
                }
                else
                {
                    oci.Name = "";
                }

                if (oci.Name == "")
                {
                    oci.Name = objd.FileName;
                }

                //now the ModeName File
                Interfaces.Scenegraph.IScenegraphFileIndexItem[] txtitems = FileTable.FileIndex.FindFile(Data.MetaData.STRING_FILE, nrefitem.LocalGroup, 0x85, null);
                if (txtitems.Length > 0)
                {
                    SimPe.PackedFiles.Wrapper.Str str = new SimPe.PackedFiles.Wrapper.Str(2);
                    str.ProcessData(txtitems[0]);
                    SimPe.PackedFiles.Wrapper.StrItemList items = str.LanguageItems(1);
                    if (items.Length > 1)
                    {
                        oci.ModelName = items[1].Title;
                    }
                }

                ObjectReader.changedcache = true;
            }             //if not loaded from objd

            if ((!oci.Useable || oci.ObjectVersion != SimPe.Cache.ObjectCacheItemVersions.DockableOW) && nrefitem.FileDescriptor.Type != Data.MetaData.OBJD_FILE)
            {
                ConsumeFromXobj(oci, nrefitem, deflang);
            }

            if (oci.Thumbnail == null)
            {
                oci.Thumbnail = ObjectPreview.GetThumbnail(nrefitem.FileDescriptor.Group, oci.ModelName);

                if (oci.Thumbnail != null)
                {
                    Wait.Image = oci.Thumbnail;
                    ObjectReader.changedcache = true;
                }
            }

#if DEBUG
            Data.Alias a = new Data.Alias(oci.FileDescriptor.Group, "---");            //, "{name} ({id}: {1}, {2}) ");
#else
            Data.Alias a = new Data.Alias(oci.FileDescriptor.Group, "---");            //, "{name} ({id}: {1}) ");
#endif
            object[] os = new object[4];
            os[0] = nrefitem.FileDescriptor;
            os[1] = nrefitem.LocalGroup;
            os[2] = oci.ModelName;
            os[3] = oci;

            a.Tag = os;

            if (Helper.WindowsRegistry.ShowObjdNames)
            {
                a.Name = oci.ObjectFileName;
            }
            else
            {
                a.Name = oci.Name;
            }
            a.Name += " (cached)";
            Image img = oci.Thumbnail;

            if (LoadedItem != null)
            {
                LoadedItem(oci, nrefitem, a);
            }

            return(true);
        }
예제 #4
0
        static void ConsumeFromXobj(SimPe.Cache.ObjectCacheItem oci, Interfaces.Scenegraph.IScenegraphFileIndexItem nrefitem, SimPe.Data.MetaData.Languages deflang)
        {
            SimPe.PackedFiles.Wrapper.Cpf cpf = new SimPe.PackedFiles.Wrapper.Cpf();
            nrefitem.FileDescriptor.UserData = nrefitem.Package.Read(nrefitem.FileDescriptor).UncompressedData;
            cpf.ProcessData(nrefitem);

            oci.FileDescriptor = nrefitem.FileDescriptor;
            oci.LocalGroup     = nrefitem.LocalGroup;
            oci.ObjectType     = SimPe.Data.ObjectTypes.Normal;

            SetFunctionSortForXObj(cpf, oci);

            oci.ObjectFileName = cpf.GetSaveItem("filename").StringValue;
            if (oci.ObjectFileName == "")
            {
                oci.ObjectFileName = cpf.GetSaveItem("name").StringValue;
            }

            oci.Useable = true;
            oci.Class   = SimPe.Cache.ObjectClass.XObject;



            Interfaces.Scenegraph.IScenegraphFileIndexItem[] ctssitems = FileTable.FileIndex.FindFile(cpf.GetSaveItem("stringsetrestypeid").UIntegerValue, cpf.GetSaveItem("stringsetgroupid").UIntegerValue, cpf.GetSaveItem("stringsetid").UIntegerValue, null);             //Data.MetaData.STRING_FILE
            if (ctssitems.Length > 0)
            {
                SimPe.PackedFiles.Wrapper.Str str = new SimPe.PackedFiles.Wrapper.Str();
                str.ProcessData(ctssitems[0]);
                SimPe.PackedFiles.Wrapper.StrItemList items = str.LanguageItems(deflang);
                if (items.Length > 0)
                {
                    oci.Name = items[0].Title;
                }
                else
                {
                    items = str.LanguageItems(1);
                    if (items.Length > 0)
                    {
                        oci.Name = items[0].Title;
                    }
                    else
                    {
                        oci.Name = "";
                    }
                }
            }
            else
            {
                oci.Name = "";
            }

            if (oci.Name == "")
            {
                oci.Name = oci.ObjectFileName;
            }

            //now the ModeName File
            if (cpf.GetItem("texturetname") != null)
            {
                oci.ModelName = cpf.GetItem("texturetname").StringValue;
            }
            else if (cpf.GetItem("filename") != null)
            {
                oci.ModelName = cpf.GetItem("filename").StringValue;
            }
            else
            {
                oci.ModelName = cpf.GetSaveItem("material").StringValue;
            }

            //oci.Name = cpf.GetSaveItem("type").StringValue + " - "+ cpf.GetSaveItem("subsort").StringValue;


            if (oci.Thumbnail == null)
            {
                oci.Thumbnail = ObjectPreview.GetXThumbnail(cpf);
            }
            ObjectReader.changedcache = true;
        }
예제 #5
0
        protected override void Produce()
        {
            LoadCachIndex();
            changedcache = false;


            ArrayList pitems = new ArrayList();
            ArrayList groups = new ArrayList();
            int       ct     = 0;

            //this is the first part loading by objd Resources
            Interfaces.Scenegraph.IScenegraphFileIndexItem[] nrefitems = FileTable.FileIndex.Sort(FileTable.FileIndex.FindFile(Data.MetaData.OBJD_FILE, true));

            string len = " / " + nrefitems.Length.ToString();

            SimPe.Data.MetaData.Languages deflang = Helper.WindowsRegistry.LanguageCode;
            Wait.Message     = "Loading Objects";
            Wait.MaxProgress = nrefitems.Length;
            foreach (Interfaces.Scenegraph.IScenegraphFileIndexItem lnrefitem in nrefitems)
            {
                ct++;
                Interfaces.Scenegraph.IScenegraphFileIndexItem nrefitem = lnrefitem;
                if (ct % 134 == 1)
                {
                    Wait.Progress = ct;
                }

                //if (nrefitem.FileDescriptor.Instance != 0x41A7) continue;
                if (nrefitem.LocalGroup == Data.MetaData.LOCAL_GROUP)
                {
                    continue;
                }
                if (pitems.Contains(nrefitem))
                {
                    continue;
                }
                if (groups.Contains(nrefitem.LocalGroup))
                {
                    continue;
                }


                //try to find the best objd
                Interfaces.Scenegraph.IScenegraphFileIndexItem[] oitems = FileTable.FileIndex.FindFile(nrefitem.FileDescriptor.Type, nrefitem.LocalGroup);
                if (oitems.Length > 1)
                {
                    for (int i = 0; i < oitems.Length; i++)
                    {
                        if (oitems[i].FileDescriptor.Instance == 0x41A7 || oitems[i].FileDescriptor.Instance == 0x41AF)
                        {
                            nrefitem = oitems[i];
                            break;
                        }
                    }
                }



                Interfaces.Scenegraph.IScenegraphFileIndexItem[] cacheitems = cachefile.FileIndex.FindFile(nrefitem.FileDescriptor, nrefitem.Package);

                //find the correct File
                int    cindex = -1;
                string pname  = nrefitem.Package.FileName.Trim().ToLower();
                for (int i = 0; i < cacheitems.Length; i++)
                {
                    Interfaces.Scenegraph.IScenegraphFileIndexItem citem = cacheitems[i];

                    if (citem.FileDescriptor.Filename == pname)
                    {
                        cindex = i;
                        break;
                    }
                }

                if (cindex != -1)               //found in the cache
                {
                    SimPe.Cache.ObjectCacheItem oci = (SimPe.Cache.ObjectCacheItem)cacheitems[cindex].FileDescriptor.Tag;
                    if (!oci.Useable)
                    {
                        continue;
                    }
                    pitems.Add(nrefitem);
                    groups.Add(nrefitem.LocalGroup);

                    oci.Tag = nrefitem;
                    this.AddToBuffer(oci);
                }
                else
                {
                    pitems.Add(nrefitem);
                    groups.Add(nrefitem.LocalGroup);

                    SimPe.Cache.ObjectCacheItem oci = new SimPe.Cache.ObjectCacheItem();
                    oci.Tag     = nrefitem;
                    oci.Useable = false;
                    cachechg    = true;
                    cachefile.AddItem(oci, nrefitem.Package.FileName);

                    this.AddToBuffer(oci);
                }
            }

            if (Helper.WindowsRegistry.HiddenMode)
            {
                //In the second pass we use ObjectXml Resources to load Objects like Walls
                ProduceByXObj(Data.MetaData.XOBJ);
                ProduceByXObj(Data.MetaData.XROF);
                ProduceByXObj(Data.MetaData.XFLR);
                ProduceByXObj(Data.MetaData.XFNC);
                ProduceByXObj(Data.MetaData.XNGB);
            }
        }