public FormStaticEditor(WadToolClass tool, DeviceManager deviceManager, Wad2 wad, WadStatic @static) { _doChangesInLighting = false; InitializeComponent(); _wad = wad; _tool = tool; _device = deviceManager.___LegacyDevice; Static = @static; _workingStatic = @static.Clone(); panelRendering.InitializeRendering(tool, deviceManager); panelRendering.Configuration = _tool.Configuration; panelRendering.Static = _workingStatic; panelRendering.DrawGrid = true; panelRendering.DrawGizmo = true; panelRendering.DrawLights = true; comboLightType.SelectedIndex = (int)_workingStatic.LightingType; UpdateVisibilityBoxUI(); UpdateCollisionBoxUI(); UpdatePositionUI(); UpdateLightsList(); UpdateLightUI(); numAmbient.Value = (decimal)_workingStatic.AmbientLight; _tool.EditorEventRaised += Tool_EditorEventRaised; _doChangesInLighting = true; }
public static WadStatic ConvertTrLevelStaticMeshToWadStatic(Wad2 wad, TrLevel oldLevel, int staticIndex, TextureArea[] objectTextures) { tr_staticmesh oldStatic = oldLevel.StaticMeshes[staticIndex]; var newStatic = new WadStatic(new WadStaticId(oldStatic.ObjectID)); // First setup collisional and visibility bounding boxes newStatic.CollisionBox = new BoundingBox(new Vector3(oldStatic.CollisionBox.X1, -oldStatic.CollisionBox.Y1, oldStatic.CollisionBox.Z1), new Vector3(oldStatic.CollisionBox.X2, -oldStatic.CollisionBox.Y2, oldStatic.CollisionBox.Z2)); newStatic.VisibilityBox = new BoundingBox(new Vector3(oldStatic.VisibilityBox.X1, -oldStatic.VisibilityBox.Y1, oldStatic.VisibilityBox.Z1), new Vector3(oldStatic.VisibilityBox.X2, -oldStatic.VisibilityBox.Y2, oldStatic.VisibilityBox.Z2)); // Then import the mesh. If it was already added, the mesh will not be added to the dictionary. newStatic.Mesh = ConvertTrLevelMeshToWadMesh(wad, oldLevel, oldLevel.GetMeshFromPointer(oldStatic.Mesh), objectTextures); return(newStatic); }
public static Wad2 ConvertTrLevel(TrLevel oldLevel) { var wad = new Wad2() { GameVersion = oldLevel.Version, SoundSystem = SoundSystem.Xml }; logger.Info("Converting TR level to WAD2"); // Convert textures TextureArea[] objectTextures = ConvertTrLevelTexturesToWadTexture(oldLevel); logger.Info("Texture conversion complete."); // Then convert moveables and static meshes // Meshes will be converted inside each model for (int i = 0; i < oldLevel.Moveables.Count; i++) { WadMoveable moveable = ConvertTrLevelMoveableToWadMoveable(wad, oldLevel, i, objectTextures); wad.Moveables.Add(moveable.Id, moveable); } logger.Info("Moveable conversion complete."); for (int i = 0; i < oldLevel.StaticMeshes.Count; i++) { WadStatic @static = ConvertTrLevelStaticMeshToWadStatic(wad, oldLevel, i, objectTextures); wad.Statics.Add(@static.Id, @static); } logger.Info("Static mesh conversion complete."); // Convert sprites ConvertTrLevelSprites(wad, oldLevel); logger.Info("Sprite conversion complete."); return(wad); }
public static void ImportModelAsStaticMesh(WadToolClass tool, IWin32Window owner) { if (tool.DestinationWad == null) { tool.SendMessage("You must have a wad opened", PopupType.Error); return; } using (FileDialog dialog = new OpenFileDialog()) { try { dialog.InitialDirectory = Path.GetDirectoryName(tool.DestinationWad.FileName); dialog.FileName = Path.GetFileName(tool.DestinationWad.FileName); } catch { // ignored } dialog.Filter = BaseGeometryImporter.FileExtensions.GetFilter(); dialog.Title = "Select a 3D file that you want to see imported."; if (dialog.ShowDialog(owner) != DialogResult.OK) { return; } using (var form = new GeometryIOSettingsDialog(new IOGeometrySettings())) { form.AddPreset(IOSettingsPresets.GeometryImportSettingsPresets); if (form.ShowDialog(owner) != DialogResult.OK) { return; } var @static = new WadStatic(tool.DestinationWad.GetFirstFreeStaticMesh()); var mesh = WadMesh.ImportFromExternalModel(dialog.FileName, form.Settings); if (mesh == null) { tool.SendMessage("Error while loading the 3D model. Please check that the file " + "is one of the supported formats and that the meshes are textured", PopupType.Error); return; } @static.Mesh = mesh; @static.VisibilityBox = @static.Mesh.BoundingBox; @static.CollisionBox = @static.Mesh.BoundingBox; tool.DestinationWad.Statics.Add(@static.Id, @static); tool.WadChanged(WadArea.Destination); } } }
public StaticModel GetStatic(WadStatic @static, bool maybeRebuildAll = true) { // Check if the data is already loaded // If yes attempt to use that one StaticModel model; if (Statics.TryGetValue(@static, out model)) { if (model.Version >= @static.Version) { return(model); } ReclaimTextureSpace(model); model.Dispose(); Statics.Remove(@static); } // The data is either new or has changed, unfortunately we need to reload it try { model = new StaticModel(GraphicsDevice); model.Meshes.Add(ObjectMesh.FromWad2(GraphicsDevice, @static.Mesh, AllocateTexture)); model.UpdateBuffers(); } catch (TextureAtlasFullException exc) { logger.Info(exc.Message); if (maybeRebuildAll) { logger.Info("Starting to rebuild the entire atlas."); Dispose(); return(GetStatic(@static, false)); } } Statics.Add(@static, model); return(model); }
public bool AutoStaticMeshMergeContainsStaticMesh(WadStatic staticMesh) => AutoStaticMeshMerges.Where(e => e.meshId == staticMesh.Id.TypeId).Any();
internal static WadStatic ConvertTr4StaticMeshToWadStatic(Wad2 wad, Tr4Wad oldWad, int staticIndex, /*List<WadMesh> meshes*/ Dictionary <int, WadTexture> textures) { var oldStaticMesh = oldWad.Statics[staticIndex]; var newId = new WadStaticId(oldStaticMesh.ObjectId); // A workaround to find out duplicated item IDs produced by StrPix unpatched for v130 wads. // In such case, a legacy name is used to guess real item ID, if this fails - broken item is filtered out. if (wad.Statics.ContainsKey(newId)) { var message = "Duplicated static ID " + oldStaticMesh.ObjectId + " was identified while loading " + oldWad.BaseName + ". "; if (oldWad.LegacyNames.Count - oldWad.Moveables.Count < staticIndex) { logger.Warn(message + "Can't restore real ID by name, name table is too short. Ignoring static."); return(null); } bool isMoveable; var guessedId = TrCatalog.GetItemIndex(TRVersion.Game.TR4, oldWad.LegacyNames[oldWad.Moveables.Count + staticIndex], out isMoveable); if (!isMoveable && guessedId.HasValue) { newId = new WadStaticId(guessedId.Value); if (wad.Statics.ContainsKey(newId)) { logger.Warn(message + "Can't restore real ID by name, name table is inconsistent. Ignoring static."); return(null); } else { logger.Warn(message + "Successfully restored real ID by name."); } } else { logger.Warn(message + "Can't find provided name in catalog. Ignoring static."); return(null); } } var staticMesh = new WadStatic(newId); //staticMesh.Name = TrCatalog.GetStaticName(WadTombRaiderVersion.TR4, oldStaticMesh.ObjectId); // First setup collisional and visibility bounding boxes staticMesh.CollisionBox = new BoundingBox(new Vector3(oldStaticMesh.CollisionX1, -oldStaticMesh.CollisionY1, oldStaticMesh.CollisionZ1), new Vector3(oldStaticMesh.CollisionX2, -oldStaticMesh.CollisionY2, oldStaticMesh.CollisionZ2)); staticMesh.VisibilityBox = new BoundingBox(new Vector3(oldStaticMesh.VisibilityX1, -oldStaticMesh.VisibilityY1, oldStaticMesh.VisibilityZ1), new Vector3(oldStaticMesh.VisibilityX2, -oldStaticMesh.VisibilityY2, oldStaticMesh.VisibilityZ2)); staticMesh.Mesh = ConvertTr4MeshToWadMesh(wad, oldWad, textures, oldWad.Meshes[(int)oldWad.RealPointers[oldStaticMesh.PointersIndex]], (int)oldStaticMesh.ObjectId); wad.Statics.Add(staticMesh.Id, staticMesh); return(staticMesh); }