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 { }
        }
Example #2
0
        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);
            }
        }
        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 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 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());
        }
Example #6
0
        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 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);
            }
        }