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))); }
private void UpdateModel(Boolean updateCamera) { if (_vifModel != null) { var newModel = (GeometryModel3D)VifDecoder.CreateModel3D(_vifModel.meshList, _texture, _animData, CurrentFrame); var container = new ModelVisual3D(); container.Content = newModel; if (_modelView.normalsBox.IsChecked.GetValueOrDefault()) { var normal = new MeshNormals3D(); normal.Mesh = (MeshGeometry3D)newModel.Geometry; container.Children.Add(normal); } Model = container; if (updateCamera) { UpdateCamera(_model); } } }
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); } } }
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; } }
public void RebuildScene() { List <ModelVisual3D> scene = buildLights(); foreach (var element in _worldData.worldElements) { ModelVisual3D mv3d = new ModelVisual3D(); var model3D = VifDecoder.CreateModel3D(element.model.meshList, element.Texture, null, 0); mv3d.Content = model3D; var modelBounds = model3D.Bounds; Transform3DGroup transform3DGroup = new Transform3DGroup(); transform3DGroup.Children.Add(new TranslateTransform3D(element.pos)); Matrix3D mtx = Matrix3D.Identity; if (element.usesRotFlags) { if ((element.xyzRotFlags & 4) == 4) { // Flip x, y mtx.M11 = 0; mtx.M21 = 1; mtx.M12 = 1; mtx.M22 = 0; } if ((element.xyzRotFlags & 2) == 2) { mtx.M11 = -mtx.M11; mtx.M21 = -mtx.M21; } if ((element.xyzRotFlags & 1) == 1) { mtx.M12 = -mtx.M12; mtx.M22 = -mtx.M22; } if (element.xyzRotFlags == 2) { mtx.M11 = -mtx.M11; mtx.M12 = -mtx.M12; mtx.M21 = -mtx.M21; mtx.M22 = -mtx.M22; } if (element.xyzRotFlags == 1) { mtx.M12 = -mtx.M12; mtx.M22 = -mtx.M22; mtx.M11 = -mtx.M11; mtx.M21 = -mtx.M21; } } else { // Change handedness by reversing angle (sign on sin) mtx.M11 = element.cosAlpha; mtx.M21 = -element.sinAlpha; mtx.M12 = element.sinAlpha; mtx.M22 = element.cosAlpha; if (element.negYaxis) { // Should this be col1 due to handed change? mtx.M12 = -mtx.M12; mtx.M22 = -mtx.M22; } } if (!mtx.IsIdentity) { transform3DGroup.Children.Add(new MatrixTransform3D(mtx)); } mv3d.Transform = transform3DGroup; scene.Add(mv3d); } ObjectManager.AddObjectsToScene(scene); Scene = scene; }