コード例 #1
0
ファイル: FSOMEditor.cs プロジェクト: yuripourre-forks/FreeSO
 private void OBJToFSOM(OBJ obj)
 {
     GameThread.NextUpdate(x =>
     {
         var mesh = new DGRP3DMesh(ActiveDGRP, obj, Client.GameFacade.GraphicsDevice);
         if (IffMode)
         {
             var fsom = ActiveObject.Resource.Get <FSOM>(ActiveDGRP.ChunkID);
             if (fsom == null)
             {
                 fsom                = new FSOM();
                 fsom.ChunkLabel     = "OBJ Import Mesh";
                 fsom.ChunkID        = ActiveDGRP.ChunkID;
                 fsom.ChunkProcessed = true;
                 fsom.ChunkType      = "FSOM";
                 fsom.AddedByPatch   = true;
                 (ActiveObject.Resource.Sprites ?? ActiveObject.Resource.MainIff).AddChunk(fsom);
             }
             Content.Content.Get().Changes.QueueResMod(new ResAction(() =>
             {
                 fsom.SetMesh(mesh);
                 Content.Content.Get().RCMeshes.ClearCache(ActiveDGRP);
                 Debug3D.ForceUpdate();
             }, fsom));
         }
         else
         {
             Content.Content.Get().RCMeshes.Replace(ActiveDGRP, mesh);
             Debug3D.ForceUpdate();
         }
     });
 }
コード例 #2
0
        private void DGRPList_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DGRPList.SelectedIndices.Count == 0 || !DGRPChunkIDs.ContainsKey(DGRPList.SelectedItems[0]))
            {
                return;
            }
            ActiveDGRP = ActiveIff.Get <DGRP>(DGRPChunkIDs[DGRPList.SelectedItems[0]]);

            if (ActiveDGRP != null)
            {
                //change selected graphic
                Debug3D.ChangeGraphic(ActiveDGRP.ChunkID);
                //UpdateImage();
            }
            SetCustomMode(false);
        }
コード例 #3
0
        public void SetActiveObject(GameObject active)
        {
            ActiveObject = active;
            ActiveIff    = active.Resource;
            ActiveDGRP   = null;

            Debug3D.ShowObject(active.OBJ.GUID);

            UpdateDGRPList(true);
            var allowEdit = (ActiveObject.OBJ.ObjectType != OBJDType.Person);

            DGRPBox.Enabled = allowEdit;

            var lower = active.OBJ.ChunkParent.Filename.ToLowerInvariant();

            if (!DGRP3DMesh.ParamsByIff.TryGetValue(lower, out ActiveParams))
            {
                ActiveParams = new DGRPRCParams();
            }

            ActiveFSOR     = ActiveIff.List <FSOR>()?.FirstOrDefault();
            InternalChange = true;
            if (ActiveFSOR == null)
            {
                IffMode = false;
            }
            else
            {
                IffMode      = true;
                ActiveParams = ActiveFSOR.Params;
            }

            SimpleCheck.Checked  = ActiveParams.Simplify;
            DoorCheck.Checked    = ActiveParams.DoorFix;
            CounterCheck.Checked = ActiveParams.CounterFix;
            BlenderCheck.Checked = ActiveParams.BlenderTweak;
            Rot1.Checked         = ActiveParams.Rotations[0];
            Rot2.Checked         = ActiveParams.Rotations[1];
            Rot3.Checked         = ActiveParams.Rotations[2];
            Rot4.Checked         = ActiveParams.Rotations[3];

            IffCheck.Checked = IffMode;

            InternalChange = false;
        }
コード例 #4
0
        private void UpdateFSOR(object sender, EventArgs e)
        {
            if (InternalChange)
            {
                return;
            }

            GameContent.Get.Changes.QueueResMod(new ResAction(() =>
            {
                UpdateParams();
                if (!IffMode)
                {
                    var lower = ActiveObject.OBJ.ChunkParent.Filename.ToLowerInvariant();
                    DGRP3DMesh.ParamsByIff[lower] = ActiveParams;
                }
                GameContent.Get.RCMeshes.ClearCache(ActiveDGRP);
                Debug3D.ForceUpdate();
            }, ActiveFSOR));
        }
コード例 #5
0
        private void ImportButton_Click(object sender, EventArgs e)
        {
            var dialog = new OpenFileDialog
            {
                Title = "Select an OBJ file."
            };

            FolderOpen(dialog);
            var dgrp = ActiveDGRP;

            try
            {
                Stream str;
                if ((str = dialog.OpenFile()) != null)
                {
                    var obj = new OBJ(str);
                    //identify and copy replacement textures
                    //only happens when this iff doesnt have a 3d model

                    foreach (var mtl in obj.FacesByObjgroup.Keys)
                    {
                        var split = mtl.Split('_');
                        if (split.Length < 3 || split[1] == "SPR" || split[0] == "DEPTH")
                        {
                            continue;
                        }

                        var baseDir  = Path.GetDirectoryName(dialog.FileName);
                        var copyname = "TEX_" + split[2] + ".png";
                        if (IffMode)
                        {
                            var texID = ushort.Parse(split[2]);
                            var tex   = ActiveObject.Resource.Get <MTEX>(texID);
                            if (tex == null)
                            {
                                tex = new MTEX
                                {
                                    ChunkLabel     = "OBJ Import Texture",
                                    ChunkID        = texID,
                                    ChunkProcessed = true,
                                    ChunkType      = "MTEX",
                                    AddedByPatch   = true
                                };
                                (ActiveObject.Resource.Sprites ?? ActiveObject.Resource.MainIff).AddChunk(tex);
                            }

                            GameContent.Get.Changes.BlockingResMod(new ResAction(() =>
                            {
                                tex.SetData(File.ReadAllBytes(Path.Combine(baseDir, copyname)));
                            }, tex));
                        }
                        else
                        {
                            var texname = ActiveDGRP.ChunkParent.Filename.Replace('.', '_').Replace("spf", "iff") + "_";
                            texname += copyname;

                            File.Copy(Path.Combine(baseDir, copyname), Path.Combine(FSOEnvironment.ContentDir, "MeshReplace/", texname), true);
                        }
                    }

                    GameThread.NextUpdate(x =>
                    {
                        var mesh = new DGRP3DMesh(ActiveDGRP, obj, Client.GameFacade.GraphicsDevice);
                        if (IffMode)
                        {
                            var fsom = ActiveObject.Resource.Get <FSOM>(ActiveDGRP.ChunkID);
                            if (fsom == null)
                            {
                                fsom = new FSOM
                                {
                                    ChunkLabel     = "OBJ Import Mesh",
                                    ChunkID        = ActiveDGRP.ChunkID,
                                    ChunkProcessed = true,
                                    ChunkType      = "FSOM",
                                    AddedByPatch   = true
                                };
                                (ActiveObject.Resource.Sprites ?? ActiveObject.Resource.MainIff).AddChunk(fsom);
                            }
                            GameContent.Get.Changes.QueueResMod(new ResAction(() =>
                            {
                                fsom.SetMesh(mesh);
                                GameContent.Get.RCMeshes.ClearCache(ActiveDGRP);
                                Debug3D.ForceUpdate();
                            }, fsom));
                        }
                        else
                        {
                            GameContent.Get.RCMeshes.Replace(ActiveDGRP, mesh);
                            Debug3D.ForceUpdate();
                        }
                    });

                    str.Close();
                }
            } catch (Exception)
            {
            }
        }
コード例 #6
0
 private void Awake()
 {
     Instance = this;
 }