private void AddObjectDirectory( IModelDirectory <GloModelFileBundle> parentNode, IFileHierarchy gloverFileHierarchy, IFileHierarchyDirectory objectDirectory) { var objectFiles = objectDirectory.FilesWithExtension(".glo"); var gloverSteamDirectory = gloverFileHierarchy.Root; var textureDirectories = gloverSteamDirectory .TryToGetSubdir("data/textures/generic") .Subdirs.ToList(); try { var levelTextureDirectory = gloverSteamDirectory.TryToGetSubdir( objectDirectory.LocalPath.Replace("data\\objects", "data\\textures")); textureDirectories.Add(levelTextureDirectory); textureDirectories.AddRange(levelTextureDirectory.Subdirs); } catch (Exception e) { ; } foreach (var objectFile in objectFiles) { parentNode.AddFileBundle( new GloModelFileBundle(objectFile, textureDirectories)); } }
private void ExtractFromDriverDirectory_( IModelDirectory <BmdModelFileBundle> node, IFileHierarchyDirectory directory) { var bmdFiles = directory.FilesWithExtension(".bmd") .ToArray(); var bcxFiles = directory.FilesWithExtensions(".bca", ".bck") .ToArray(); var driverBmdFiles = bmdFiles .Where(file => file.Name.StartsWith("driver")) .ToArray(); var driverBcxFiles = bcxFiles.Where(file => file.Name.StartsWith("b_") || file.Name.StartsWith("c_") || file.Name.StartsWith("all")) .ToArray(); this.ExtractModels_(node, driverBmdFiles, driverBcxFiles); var otherBmdFiles = bmdFiles.Where(file => !driverBmdFiles.Contains(file)) .ToArray(); if (otherBmdFiles.Length > 0) { var otherBcxFiles = bcxFiles.Where(file => !driverBcxFiles.Contains(file)) .ToArray(); this.ExtractModels_(node, otherBmdFiles, otherBcxFiles); } }
private void ExtractPikminAndCaptainModels_( IModelDirectory <BmdModelFileBundle> parentNode, IFileHierarchy fileHierarchy) { var pikminAndCaptainBaseDirectory = fileHierarchy.Root.TryToGetSubdir( @"user\Kando\piki\pikis_designer"); var bcxFiles = pikminAndCaptainBaseDirectory.TryToGetSubdir("motion") .Files; var captainSubdir = pikminAndCaptainBaseDirectory.TryToGetSubdir("orima_model"); this.ExtractModels_(parentNode.AddSubdir("captains"), captainSubdir.Files, bcxFiles); var pikminSubdir = pikminAndCaptainBaseDirectory.TryToGetSubdir("piki_model"); this.ExtractModels_(parentNode.AddSubdir("pikmin"), pikminSubdir.Files, bcxFiles); }
private void ExtractAllTreasures_( IModelDirectory <BmdModelFileBundle> parentNode, IFileHierarchy fileHierarchy) { var treasureBaseDirectory = fileHierarchy.Root.TryToGetSubdir(@"user\Abe\Pellet"); var baseDirectory = parentNode.AddSubdir("treasures"); foreach (var locale in treasureBaseDirectory.Subdirs) { var localeNode = baseDirectory.AddSubdir(locale.Name); foreach (var treasure in locale.Subdirs) { var treasureNode = localeNode.AddSubdir(treasure.Name); var bmdFiles = treasure.Files.Where(file => file.Extension == ".bmd") .ToArray(); if (bmdFiles.Length > 0) { var bcxFiles = treasure.Files .Where(file => file.Extension == ".bca" || file.Extension == ".bck") .ToList(); this.ExtractModels_(treasureNode, bmdFiles, bcxFiles); } } } }
public void ExtractModel_( IModelDirectory <CmbModelFileBundle> parentNode, IFileHierarchyDirectory subdir) { var cmbFiles = subdir.FilesWithExtension(".cmb").ToArray(); if (cmbFiles.Length == 0) { return; } var csabFiles = subdir.FilesWithExtension(".csab").ToArray(); var ctxbFiles = subdir.FilesWithExtension(".ctxb").ToArray(); var shpaFiles = subdir.FilesWithExtension(".shpa").ToArray(); try { var bundles = this.separator_.Separate(subdir, cmbFiles, csabFiles); foreach (var bundle in bundles) { parentNode.AddFileBundle(new CmbModelFileBundle( bundle.ModelFile, bundle.AnimationFiles.ToArray(), ctxbFiles, shpaFiles )); } } catch { } }
private void ExtractLeafBudFlower_( IModelDirectory <BmdModelFileBundle> parentNode, IFileHierarchy fileHierarchy) { var leafBudFlowerDirectory = fileHierarchy.Root.TryToGetSubdir( @"user\Kando\piki\pikis_designer\happa_model"); this.ExtractModelsInDirectoryAutomatically_( parentNode.AddSubdir("leaf_bud_flower"), leafBudFlowerDirectory); }
private void ExtractModelsInDirectoryAutomatically_( IModelDirectory <BmdModelFileBundle> parentNode, IFileHierarchyDirectory directory) { var bmdFiles = directory.FilesWithExtension(".bmd").ToArray(); if (bmdFiles.Length > 0) { var bcxFiles = directory.FilesWithExtensions(".bca", ".bck") .ToList(); var btiFiles = directory.FilesWithExtension(".bti").ToList(); this.ExtractModels_(parentNode, bmdFiles, bcxFiles, btiFiles); } }
/// <summary> /// Gets from model/animations in same szs (e.g. user\Kando) /// </summary> private void ExtractAllFromMergedDirectories_( IModelDirectory <BmdModelFileBundle> parentNode, IFileHierarchy fileHierarchy) { foreach (var subdir in fileHierarchy) { var arcSubdir = subdir.Subdirs.SingleOrDefault(dir => dir.Name == "arc"); if (arcSubdir != null && arcSubdir.FilesWithExtension(".bmd").Any()) { this.ExtractModelsInDirectoryAutomatically_( parentNode.AddSubdir(subdir.Name), arcSubdir); } } }
private void ExtractFromSeparateDriverDirectories_( IModelDirectory <BmdModelFileBundle> node, IFileHierarchyDirectory directory, IFileHierarchyDirectory common) { Asserts.Nonnull(common); var bmdFiles = directory.FilesWithExtension(".bmd") .ToArray(); var commonBcxFiles = common.FilesWithExtensions(".bca", ".bck") .ToArray(); var localBcxFiles = directory.FilesWithExtensions(".bca", ".bck") .ToArray(); this.ExtractModels_(node, bmdFiles, commonBcxFiles.Concat(localBcxFiles).ToArray()); }
private void ExtractModels_( IModelDirectory <BmdModelFileBundle> node, IReadOnlyList <IFileHierarchyFile> bmdFiles, IReadOnlyList <IFileHierarchyFile>?bcxFiles = null, IReadOnlyList <IFileHierarchyFile>?btiFiles = null ) { Asserts.True(bmdFiles.Count > 0); foreach (var bmdFile in bmdFiles) { node.AddFileBundle(new BmdModelFileBundle { BmdFile = bmdFile, BcxFiles = bcxFiles, BtiFiles = btiFiles, FrameRate = 60 }); } }
private void ExtractPrimaryAndSecondaryModels_( IModelDirectory <BmdModelFileBundle> node, IFileHierarchyDirectory directory, Func <IFileHierarchyFile, bool> primaryIdentifier ) { var bmdFiles = directory.Files.Where( file => file.Extension == ".bmd") .ToArray(); var bcxFiles = directory .Files.Where( file => file.Extension == ".bck" || file.Extension == ".bca") .ToArray(); this.ExtractPrimaryAndSecondaryModels_(node, primaryIdentifier, bmdFiles, bcxFiles); }
private void ExtractPrimaryAndSecondaryModels_( IModelDirectory <BmdModelFileBundle> node, Func <IFileHierarchyFile, bool> primaryIdentifier, IReadOnlyList <IFileHierarchyFile> bmdFiles, IReadOnlyList <IFileHierarchyFile>?bcxFiles = null ) { var primaryBmdFile = bmdFiles.Single(bmdFile => primaryIdentifier(bmdFile)); this.ExtractModels_(node, new[] { primaryBmdFile }, bcxFiles); var secondaryBmdFiles = bmdFiles .Where(bmdFile => !primaryIdentifier(bmdFile)) .ToArray(); if (secondaryBmdFiles.Length > 0) { this.ExtractModels_(node, secondaryBmdFiles); } }
private void ExtractFromSeparateDirectories_( IModelDirectory <BmdModelFileBundle> node, IFileHierarchyDirectory directory, IFileHierarchyDirectory common) { Asserts.Nonnull(common); var bmdFiles = directory.FilesWithExtension(".bmd") .ToArray(); var commonBcxFiles = common.FilesWithExtensions(".bca", ".bck") .ToArray(); var commonBtiFiles = common.FilesWithExtension(".bti") .ToArray(); var localBcxFiles = directory.FilesWithExtensions(".bca", ".bck") .ToArray(); if (bmdFiles.Length == 1) { this.ExtractModels_(node, bmdFiles, commonBcxFiles.Concat(localBcxFiles).ToArray(), commonBtiFiles); return; } try { Asserts.True(localBcxFiles.Length == 0); this.ExtractPrimaryAndSecondaryModels_( node, bmdFile => bmdFile.Name.StartsWith( "default"), bmdFiles, commonBcxFiles); } catch { ; } }
private FileNode AddDirectoryToNode_(IModelDirectory directory, FileNode parentNode) { var uiNode = parentNode.AddChild(directory.Name); foreach (var subdirectory in directory.Subdirs) { this.AddDirectoryToNode_(subdirectory, uiNode); } foreach (var fileBundle in directory.FileBundles) { uiNode.AddChild(fileBundle); } if (DebugFlags.OPEN_DIRECTORIES_BY_DEFAULT) { uiNode.Expand(); } return(uiNode); }
/// <summary> /// Gets from separate model/animation szs (e.g. Enemies) /// </summary> private void ExtractAllFromSeparateDirectories_( IModelDirectory <BmdModelFileBundle> parentNode, IFileHierarchy fileHierarchy) { foreach (var subdir in fileHierarchy) { var modelSubdir = subdir.Subdirs.SingleOrDefault(dir => dir.Name == "model"); var animSubdir = subdir.Subdirs.SingleOrDefault(dir => dir.Name == "anim"); if (modelSubdir != null && animSubdir != null) { var bmdFiles = modelSubdir.Files; var bcxFiles = animSubdir.Files; var btiFiles = subdir.FilesWithExtensionRecursive(".bti").ToArray(); this.ExtractModels_(parentNode.AddSubdir(subdir.Name), bmdFiles, bcxFiles, btiFiles); } } }
private void ExtractModelsAndAnimationsFromSceneObject_( IModelDirectory <BmdModelFileBundle> node, IFileHierarchyDirectory directory) { var bmdFiles = directory.Files.Where( file => file.Extension == ".bmd") .OrderByDescending(file => file.Name.Length) .ToArray(); var allBcxFiles = directory .Files.Where( file => file.Extension == ".bck" || file.Extension == ".bca") .ToArray(); var specialCase = false; if (allBcxFiles.Length == 1 && allBcxFiles[0].Name == "fish_swim.bck" && bmdFiles.All(file => file.Name.StartsWith("fish"))) { specialCase = true; } if (allBcxFiles.Length == 1 && allBcxFiles[0].Name == "butterfly_fly.bck" && bmdFiles.All(file => file.Name.StartsWith("butterfly"))) { specialCase = true; } if (allBcxFiles.All(file => file.Name.StartsWith("popo_")) && bmdFiles.All(file => file.Name.StartsWith("popo"))) { specialCase = true; } // If there is only one model or 0 animations, it's easy to tell which // animations go with which model. if (bmdFiles.Length == 1 || allBcxFiles.Length == 0 || specialCase) { foreach (var bmdFile in bmdFiles) { this.ExtractModels_(node, new[] { bmdFile }, allBcxFiles); } return; } if (directory.Name == "montemcommon" || directory.Name == "montewcommon") { foreach (var bmdFile in bmdFiles) { this.ExtractModels_(node, new[] { bmdFile }); } return; } var unclaimedBcxFiles = allBcxFiles.ToHashSet(); var bmdAndBcxFiles = new Dictionary <IFileHierarchyFile, IFileHierarchyFile[]>(); foreach (var bmdFile in bmdFiles) { var prefix = bmdFile.Name; prefix = prefix.Substring(0, prefix.Length - ".bmd".Length); // Blegh. These special cases are gross. { var modelIndex = prefix.IndexOf("_model"); if (modelIndex != -1) { prefix = prefix.Substring(0, modelIndex); } var bodyIndex = prefix.IndexOf("_body"); if (bodyIndex != -1) { prefix = prefix.Substring(0, bodyIndex); } prefix = prefix.Replace("peach_hair_ponytail", "peach_hair_pony"); prefix = prefix.Replace("eggyoshi_normal", "eggyoshi"); } var claimedBcxFiles = unclaimedBcxFiles .Where(bcxFile => bcxFile.Name.StartsWith(prefix)) .ToArray(); foreach (var claimedBcxFile in claimedBcxFiles) { unclaimedBcxFiles.Remove(claimedBcxFile); } bmdAndBcxFiles[bmdFile] = claimedBcxFiles; } //Asserts.True(unclaimedBcxFiles.Count == 0); foreach (var(bmdFile, bcxFiles) in bmdAndBcxFiles) { this.ExtractModels_(node, new[] { bmdFile }, bcxFiles); } }
private void ExtractModelsAndAnimationsFromSceneObject_( IModelDirectory <BmdModelFileBundle> node, IFileHierarchyDirectory directory) { var bmdFiles = directory.Files.Where( file => file.Extension == ".bmd") .OrderByDescending(file => file.Name.Length) .ToArray(); var allBcxFiles = directory .Files.Where( file => file.Extension == ".bck" || file.Extension == ".bca") .ToArray(); var btiFiles = directory.FilesWithExtension(".bti") .ToArray(); // If there is only one model or 0 animations, it's easy to tell which // animations go with which model. if (bmdFiles.Length == 1 || allBcxFiles.Length == 0) { foreach (var bmdFile in bmdFiles) { this.ExtractModels_(node, new[] { bmdFile }, allBcxFiles, btiFiles); } return; } var unclaimedBcxFiles = allBcxFiles.ToHashSet(); var bmdAndBcxFiles = new Dictionary <IFileHierarchyFile, IFileHierarchyFile[]>(); foreach (var bmdFile in bmdFiles) { var prefix = bmdFile.Name; prefix = prefix.Substring(0, prefix.Length - ".bmd".Length); // Blegh. These special cases are gross. { var modelIndex = prefix.IndexOf("_model"); if (modelIndex != -1) { prefix = prefix.Substring(0, modelIndex); } var babyIndex = prefix.IndexOf("_body"); if (babyIndex != -1) { prefix = prefix.Substring(0, babyIndex); } // TODO: Fix animations shared by piantas } var claimedBcxFiles = unclaimedBcxFiles .Where(bcxFile => bcxFile.Name.StartsWith(prefix)) .ToArray(); foreach (var claimedBcxFile in claimedBcxFiles) { unclaimedBcxFiles.Remove(claimedBcxFile); } bmdAndBcxFiles[bmdFile] = claimedBcxFiles; } Asserts.True(unclaimedBcxFiles.Count == 0); foreach (var(bmdFile, bcxFiles) in bmdAndBcxFiles) { this.ExtractModels_(node, new[] { bmdFile }, bcxFiles, btiFiles); } }