Exemplo n.º 1
0
        private void OnYakChildElementSelected(YakChildTreeViewItem childEntry)
        {
            SelectedNodeImage = TexDecoder.Decode(childEntry.YakFile.FileData, childEntry.Value.TextureOffset + childEntry.Value.VifOffset,
                                                  childEntry.Value.VifLength - childEntry.Value.TextureOffset);
            var log = new StringLogger();

            _modelViewModel.Texture  = SelectedNodeImage;
            _modelViewModel.AnimData = null;
            Model model = new Model();

            model.meshList = VifDecoder.Decode(
                log,
                childEntry.YakFile.FileData,
                childEntry.Value.VifOffset,
                childEntry.Value.TextureOffset,
                SelectedNodeImage.PixelWidth,
                SelectedNodeImage.PixelHeight);
            _modelViewModel.VifModel = model;

            LogText += log.ToString();

            _window.tabControl.SelectedIndex = 1; // Model View
            _window.ResetCamera();
            _window.SetViewportText(1, childEntry.Text + " of " + ((YakTreeViewItem)childEntry.Parent).Text, "");
        }
        private Visual3D LoadModelFromOtherLmp(string lmpName, string file, string textureFile)
        {
            var par = _manager.LevelViewModel.WorldNode.Parent.Parent;

            if (par is GobTreeViewModel)
            {
                var gob = (GobTreeViewModel)par;
                foreach (LmpTreeViewModel child in gob.Children)
                {
                    if (string.Compare(child.Text, lmpName, StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        child.ForceLoadChildren();
                        var entry    = child.LmpFileProperty.FindFile(file);
                        var texEntry = child.LmpFileProperty.FindFile(textureFile);

                        if (entry == null || texEntry == null)
                        {
                            return(CreateBox(5, Color.FromRgb(255, 0, 0)));
                        }

                        var tex = TexDecoder.Decode(child.LmpFileProperty.FileData, texEntry.StartOffset);

                        var logger   = new StringLogger();
                        var vifModel = VifDecoder.Decode(
                            logger,
                            child.LmpFileProperty.FileData,
                            entry.StartOffset,
                            entry.Length,
                            tex.PixelWidth,
                            tex.PixelHeight);

                        var model = new ModelVisual3D
                        {
                            Content   = Conversions.CreateModel3D(vifModel, tex, null, -1),
                            Transform = new ScaleTransform3D(1.0 / 4, 1.0 / 4, 1.0 / 4)
                        };
                        return(model);
                    }
                }
            }

            return(CreateBox(5, Color.FromRgb(255, 0, 0)));
        }
Exemplo n.º 3
0
        void SaveParsedDataClicked(object sender, RoutedEventArgs e)
        {
            if (_menu.DataContext == null)
            {
                return;
            }

            if (_menu.DataContext is LmpEntryTreeViewModel)
            {
                var lmpEntry = (LmpEntryTreeViewModel)_menu.DataContext;
                var lmpFile  = lmpEntry.LmpFileProperty;

                var entry    = lmpFile.Directory[lmpEntry.Text];
                var texEntry = lmpFile.Directory[Path.GetFileNameWithoutExtension(lmpEntry.Text) + ".tex"];

                var tex = TexDecoder.Decode(lmpFile.FileData, texEntry.StartOffset, texEntry.Length);

                if ((Path.GetExtension(lmpEntry.Text) ?? "").ToLower() != ".vif")
                {
                    MessageBox.Show("Not a .vif file!", "Error");
                    return;
                }

                var dialog = new SaveFileDialog();
                dialog.FileName = lmpEntry.Text + ".txt";

                bool?result = dialog.ShowDialog();
                if (result.GetValueOrDefault(false))
                {
                    var exporter = new VifExporter();

                    var logger = new StringLogger();
                    var chunks = VifDecoder.DecodeChunks(
                        logger,
                        lmpFile.FileData,
                        entry.StartOffset,
                        entry.Length,
                        tex.PixelWidth,
                        tex.PixelHeight);

                    exporter.WriteChunks(dialog.FileName, chunks);
                }
            }
            else if (_menu.DataContext is WorldElementTreeViewModel)
            {
                var worldElement = (WorldElementTreeViewModel)_menu.DataContext;
                var lmpEntry     = (LmpTreeViewModel)worldElement.Parent;
                var lmpFile      = lmpEntry.LmpFileProperty;

                var dialog = new SaveFileDialog();
                dialog.FileName = worldElement.Text + ".txt";

                bool?result = dialog.ShowDialog();
                if (result.GetValueOrDefault(false))
                {
                    var exporter = new VifExporter();

                    var logger = new StringLogger();
                    var chunks = VifDecoder.ReadVerts(
                        logger,
                        lmpFile.FileData,
                        worldElement.WorldElement.VifDataOffset,
                        worldElement.WorldElement.VifDataOffset + worldElement.WorldElement.VifDataLength);

                    exporter.WriteChunks(dialog.FileName, chunks);
                }
            }
        }
Exemplo n.º 4
0
        private void OnLmpEntrySelected(LmpEntryTreeViewModel lmpEntry)
        {
            var lmpFile = lmpEntry.LmpFileProperty;
            var entry   = lmpFile.Directory[lmpEntry.Text];

            var ext = (Path.GetExtension(lmpEntry.Text) ?? "").ToLower();

            switch (ext)
            {
            case ".tex":
            {
                SelectedNodeImage = TexDecoder.Decode(lmpFile.FileData, entry.StartOffset, entry.Length);

                _window.tabControl.SelectedIndex = 0;         // Texture View
            }
            break;

            case ".vif":
            {
                string texFilename = Path.GetFileNameWithoutExtension(lmpEntry.Text) + ".tex";
                var    texEntry    = lmpFile.Directory[texFilename];
                SelectedNodeImage = TexDecoder.Decode(lmpFile.FileData, texEntry.StartOffset, texEntry.Length);
                var log = new StringLogger();
                _modelViewModel.Texture  = SelectedNodeImage;
                _modelViewModel.AnimData = null;
                Model model = new Model();
                model.meshList = VifDecoder.Decode(log, lmpFile.FileData, entry.StartOffset, entry.Length,
                                                   SelectedNodeImage.PixelWidth, SelectedNodeImage.PixelHeight);
                _modelViewModel.VifModel = model;

                /*// Load animation data
                 * var animData = LoadFirstAnim(lmpFile);
                 * // Make sure the animation will work with the model
                 * if (animData.Count > 0 && animData[0].NumBones == model.CountBones())
                 *  _modelViewModel.AnimData = animData.Count == 0 ? null : animData.First();*/

                LogText += log.ToString();

                _window.tabControl.SelectedIndex = 1;         // Model View
                _window.ResetCamera();
                _window.SetViewportText(1, lmpEntry.Text, "");
            }
            break;

            case ".anm":
            {
                var engineVersion = App.Settings.Get("Core.EngineVersion", EngineVersion.DarkAlliance);
                var animData      = AnmDecoder.Decode(engineVersion, lmpFile.FileData, entry.StartOffset, entry.Length);
                _skeletonViewModel.AnimData = animData;
                LogText = animData.ToString();

                if (_modelViewModel.VifModel != null)
                {
                    int boneCount = _modelViewModel.VifModel.CountBones();
                    if (boneCount != 0 && boneCount == animData.NumBones)
                    {
                        _modelViewModel.AnimData = animData;

                        // Switch tab to animation tab only if the current tab isnt the model view tab
                        if (_window.tabControl.SelectedIndex != 1)        // Model View
                        {
                            _window.tabControl.SelectedIndex = 2;         // Skeleton View
                            _window.ResetCamera();
                        }
                    }
                    else
                    {
                        // Bone count doesn't match, switch to skeleton view
                        _window.tabControl.SelectedIndex = 2;         // Skeleton View
                        _window.ResetCamera();
                    }
                }
                else
                {
                    _window.tabControl.SelectedIndex = 2;         // Skeleton View
                    _window.ResetCamera();
                }
            }

                _window.SetViewportText(2, lmpEntry.Text, "");     // Set Skeleton View Text

                break;

            case ".ob":
                var objects = ObDecoder.Decode(lmpFile.FileData, entry.StartOffset, entry.Length);

                var sb = new StringBuilder();

                foreach (var obj in objects)
                {
                    sb.AppendFormat("Name: {0}\n", obj.Name);
                    sb.AppendFormat("I6: {0}\n", obj.I6.ToString("X4"));
                    sb.AppendFormat("Floats: {0},{1},{2}\n", obj.Floats[0], obj.Floats[1], obj.Floats[2]);
                    if (obj.Properties != null)
                    {
                        foreach (var prop in obj.Properties)
                        {
                            sb.AppendFormat("Property: {0}\n", prop);
                        }
                    }
                    sb.Append("\n");
                }

                LogText = sb.ToString();
                _window.tabControl.SelectedIndex = 4;     // Log View

                break;
            }
        }