コード例 #1
0
ファイル: Combo.cs プロジェクト: Toocanzs/OWLib
        public static void SaveAnimation(ICLIFlags flags, string path, FindLogic.Combo.ComboInfo info, ulong animation,
                                         ulong model)
        {
            bool convertAnims = false;

            if (flags is ExtractFlags extractFlags)
            {
                convertAnims = extractFlags.ConvertAnimations && !extractFlags.Raw;
                if (extractFlags.SkipAnimations)
                {
                    return;
                }
            }

            SEAnimWriter animWriter = new SEAnimWriter();

            FindLogic.Combo.AnimationInfoNew animationInfo = info.Animations[animation];

            using (Stream animStream = OpenFile(animation)) {
                if (animStream == null)
                {
                    return;
                }
                MemoryStream animMemStream = new MemoryStream();
                animStream.CopyTo(animMemStream);

                if (info.SaveRuntimeData.Threads)
                {
                    info.SaveRuntimeData.Tasks.Add(Task.Run(() => {
                        ConvertAnimation(animMemStream, path, convertAnims, animWriter, animationInfo);
                    }));
                }
                else
                {
                    ConvertAnimation(animMemStream, path, convertAnims, animWriter, animationInfo);
                }
            }

            if (!info.SaveConfig.SaveAnimationEffects)
            {
                return;
            }
            FindLogic.Combo.EffectInfoCombo animationEffect;


            // just create a fake effect if it doesn't exist
            if (animationInfo.Effect == 0)
            {
                animationEffect = new FindLogic.Combo.EffectInfoCombo(0)
                {
                    Effect = new EffectParser.EffectInfo()
                };
                animationEffect.Effect.SetupEffect();
            }
            else if (info.Effects.ContainsKey(animationInfo.Effect))
            {
                // wot, why
                animationEffect = info.Effects[animationInfo.Effect];
            }
            else
            {
                animationEffect = info.AnimationEffects[animationInfo.Effect];
            }

            Effect.OWAnimWriter owAnimWriter = new Effect.OWAnimWriter();
            string animationEffectDir        = Path.Combine(path, Model.AnimationEffectDir, animationInfo.GetNameIndex());
            string animationEffectFile       =
                Path.Combine(animationEffectDir, $"{animationInfo.GetNameIndex()}{owAnimWriter.Format}");
            Dictionary <ulong, HashSet <FindLogic.Combo.VoiceLineInstanceInfo> > svceLines = new Dictionary <ulong, HashSet <FindLogic.Combo.VoiceLineInstanceInfo> >();

            if (animationEffect.GUID != 0)
            {
                SaveEffectExtras(flags, animationEffectDir, info, animationEffect.Effect, out svceLines);
            }
            if (info.SaveRuntimeData.Threads)
            {
                info.SaveRuntimeData.Tasks.Add(Task.Run(() => {
                    SaveOWAnimFile(animationEffectFile, animationEffect, animationInfo, info, owAnimWriter, model, svceLines);
                }));
            }
            else
            {
                SaveOWAnimFile(animationEffectFile, animationEffect, animationInfo, info, owAnimWriter, model, svceLines);
            }
        }
コード例 #2
0
ファイル: Combo.cs プロジェクト: Toocanzs/OWLib
        private static void ConvertAnimation(Stream animStream, string path, bool convertAnims, SEAnimWriter animWriter, FindLogic.Combo.AnimationInfoNew animationInfo)
        {
            animStream.Position = 0;
            Animation parsedAnimation = new Animation(animStream);

            string animationDirectory =
                Path.Combine(path, "Animations", parsedAnimation.Header.priority.ToString());

            if (convertAnims)
            {
                string animOutput = Path.Combine(animationDirectory,
                                                 animationInfo.GetNameIndex() + animWriter.Format);
                CreateDirectoryFromFile(animOutput);
                using (Stream fileStream = new FileStream(animOutput, FileMode.Create)) {
                    animWriter.Write(parsedAnimation, fileStream, new object[] { });
                }
            }
            else
            {
                string rawAnimOutput = Path.Combine(animationDirectory,
                                                    $"{animationInfo.GetNameIndex()}.{GUID.Type(animationInfo.GUID):X3}");
                CreateDirectoryFromFile(rawAnimOutput);
                using (Stream fileStream = new FileStream(rawAnimOutput, FileMode.Create)) {
                    animStream.CopyTo(fileStream);
                }
            }
            animStream.Dispose();
        }