Example #1
0
            public void CreateSampler(string Name, bool IsConstant)
            {
                var mat = MaterialAnimData;

                var SamplerInfo = new TexturePatternAnimInfo();

                if (IsConstant)
                {
                    SamplerInfo.BeginConstant = (ushort)mat.Constants.Count;
                    SamplerInfo.CurveIndex    = (ushort)65535;
                }
                else
                {
                    SamplerInfo.BeginConstant = (ushort)65535;
                    SamplerInfo.CurveIndex    = (ushort)mat.Curves.Count;
                }
                mat.TexturePatternAnimInfos.Add(SamplerInfo);

                BfresSamplerAnim sampler = new BfresSamplerAnim(SamplerInfo.Name, matAnimWrapper, this);

                Samplers.Add(sampler);
            }
Example #2
0
            public MaterialAnim FromYaml()
            {
                MaterialAnim matAnim = new MaterialAnim();

                matAnim.Name         = Name;
                matAnim.Path         = Path;
                matAnim.Loop         = Loop;
                matAnim.FrameCount   = FrameCount;
                matAnim.TextureNames = GenerateTextureList();
                matAnim.BindIndices  = new ushort[MaterialAnimConfigs.Count];
                for (int i = 0; i < matAnim.BindIndices.Length; i++)
                {
                    matAnim.BindIndices[i] = ushort.MaxValue;
                }

                int ShaderParamCurveIndex    = 0;
                int TexturePatternCurveIndex = 0;

                Console.WriteLine("MaterialAnimConfigs " + MaterialAnimConfigs.Count);
                foreach (var matCfg in MaterialAnimConfigs)
                {
                    var matAnimData = new MaterialAnimData();
                    matAnimData.Name      = matCfg.Name;
                    matAnimData.Constants = new List <AnimConstant>();
                    matAnimData.Curves    = new List <AnimCurve>();
                    matAnimData.TexturePatternAnimInfos  = new List <TexturePatternAnimInfo>();
                    matAnimData.ParamAnimInfos           = new List <ParamAnimInfo>();
                    matAnimData.BeginVisalConstantIndex  = -1;
                    matAnimData.ShaderParamCurveIndex    = -1;
                    matAnimData.VisualConstantIndex      = -1;
                    matAnimData.TexturePatternCurveIndex = -1;
                    matAnimData.VisalCurveIndex          = -1;
                    matAnim.MaterialAnimDataList.Add(matAnimData);

                    ushort CurveIndex         = 0;
                    ushort BeginConstantIndex = 0;

                    foreach (var texturePatternCfg in matCfg.TexturePatternInfos)
                    {
                        TexturePatternAnimInfo patternInfo = new TexturePatternAnimInfo();
                        patternInfo.Name = texturePatternCfg.Name;
                        matAnimData.TexturePatternAnimInfos.Add(patternInfo);

                        if (texturePatternCfg.IsConstant && texturePatternCfg.ConstantValue != null)
                        {
                            patternInfo.BeginConstant = BeginConstantIndex++;

                            AnimConstant constant = new AnimConstant();
                            constant.AnimDataOffset = 0;
                            constant.Value          = matAnim.TextureNames.IndexOf(texturePatternCfg.ConstantValue.Texture);
                            matAnimData.Constants.Add(constant);

                            matAnimData.VisualConstantIndex     = 0;
                            matAnimData.BeginVisalConstantIndex = 0;
                        }
                        else if (texturePatternCfg.CurveData != null)
                        {
                            patternInfo.CurveIndex = CurveIndex++;

                            matAnimData.TexturePatternCurveIndex = TexturePatternCurveIndex;
                            matAnimData.BeginVisalConstantIndex  = 0;

                            AnimCurve curve = new AnimCurve();
                            matAnimData.Curves.Add(curve);

                            curve.Offset         = 0;
                            curve.AnimDataOffset = 0;
                            curve.Scale          = 1;
                            curve.CurveType      = AnimCurveType.StepInt;
                            curve.StartFrame     = 0;

                            int FrameCount = texturePatternCfg.CurveData.KeyFrames.Count;

                            curve.Frames = new float[FrameCount];
                            curve.Keys   = new float[FrameCount, 1];

                            int MaxFrame = 0;
                            int MaxIndex = 0;

                            int i = 0;
                            foreach (var KeyFrame in texturePatternCfg.CurveData.KeyFrames)
                            {
                                int Index = matAnim.TextureNames.IndexOf(KeyFrame.Value);
                                Console.WriteLine($"{Index} {KeyFrame.Value}");

                                curve.Frames[i]  = KeyFrame.Key;
                                curve.Keys[i, 0] = Index;

                                MaxFrame = Math.Max(MaxIndex, KeyFrame.Key);
                                MaxIndex = Math.Max(MaxIndex, Index);

                                i++;
                            }

                            curve.EndFrame = curve.Frames.Max();

                            if (curve.Keys.Length > 1)
                            {
                                curve.Delta = curve.Keys[curve.Keys.Length - 1, 0] - curve.Keys[0, 0];
                            }

                            if (MaxFrame < byte.MaxValue)
                            {
                                curve.FrameType = AnimCurveFrameType.Byte;
                            }
                            else if (MaxFrame < ushort.MaxValue)
                            {
                                curve.FrameType = AnimCurveFrameType.Decimal10x5;
                            }
                            else
                            {
                                curve.FrameType = AnimCurveFrameType.Single;
                            }

                            if (MaxIndex < byte.MaxValue)
                            {
                                curve.KeyType = AnimCurveKeyType.SByte;
                            }
                            else if (MaxIndex < ushort.MaxValue)
                            {
                                curve.KeyType = AnimCurveKeyType.Int16;
                            }
                            else
                            {
                                curve.KeyType = AnimCurveKeyType.Single;
                            }
                        }
                    }

                    foreach (var paramCfg in matCfg.ParamInfos)
                    {
                        ParamAnimInfo paramInfo = new ParamAnimInfo();
                        paramInfo.Name = paramCfg.Name;
                        matAnimData.ParamAnimInfos.Add(paramInfo);

                        if (paramCfg.Constants != null && paramCfg.Constants.Count > 0)
                        {
                            paramInfo.BeginConstant = BeginConstantIndex;
                            paramInfo.ConstantCount = (ushort)paramCfg.Constants.Count;

                            BeginConstantIndex += (ushort)paramCfg.Constants.Count;
                            foreach (var constantCfg in paramCfg.Constants)
                            {
                                AnimConstant constant = new AnimConstant();
                                constant.AnimDataOffset = ConvertParamOffset(constantCfg.Offset);
                                constant.Value          = constantCfg.Value;
                                matAnimData.Constants.Add(constant);
                            }
                        }

                        if (paramCfg.CurveData != null && paramCfg.CurveData.Count > 0)
                        {
                            matAnimData.ShaderParamCurveIndex = ShaderParamCurveIndex;

                            paramInfo.BeginCurve      = CurveIndex;
                            paramInfo.FloatCurveCount = (ushort)paramCfg.CurveData.Count;

                            CurveIndex += (ushort)paramCfg.CurveData.Count;
                            foreach (var curveCfg in paramCfg.CurveData)
                            {
                                AnimCurve curve = new AnimCurve();
                                matAnimData.Curves.Add(curve);
                                curve.Offset         = 0;
                                curve.AnimDataOffset = ConvertParamOffset(curveCfg.Offset);
                                curve.Scale          = 1;
                                curve.CurveType      = AnimCurveType.Linear;
                                curve.StartFrame     = 0;

                                int   MaxFrame = 0;
                                float MaxValue = 0;

                                int FrameCount = curveCfg.KeyFrames.Count;
                                curve.Frames = new float[FrameCount];
                                curve.Keys   = new float[FrameCount, 2];

                                int i      = 0;
                                var values = curveCfg.KeyFrames.Values.ToList();
                                foreach (var KeyFrame in curveCfg.KeyFrames)
                                {
                                    curve.Frames[i]  = KeyFrame.Key;
                                    curve.Keys[i, 0] = KeyFrame.Value;

                                    //Calculate delta
                                    float Delta = 0;
                                    if (i < values.Count - 1)
                                    {
                                        Delta = values[i + 1] - values[i];
                                    }

                                    curve.Keys[i, 1] = Delta;

                                    MaxFrame = Math.Max(MaxFrame, KeyFrame.Key);
                                    MaxValue = Math.Max(MaxValue, KeyFrame.Value);
                                    i++;
                                }

                                curve.EndFrame = curve.Frames.Max();

                                if (curve.Keys.Length > 1)
                                {
                                    curve.Delta = values[values.Count - 1] - values[0];
                                }

                                curve.KeyType   = AnimCurveKeyType.Single;
                                curve.FrameType = AnimCurveFrameType.Single;

                                /*    if (MaxFrame < byte.MaxValue)
                                 *      curve.FrameType = AnimCurveFrameType.Byte;
                                 *  else if (MaxFrame < ushort.MaxValue)
                                 *      curve.FrameType = AnimCurveFrameType.Decimal10x5;
                                 *  else
                                 *      curve.FrameType = AnimCurveFrameType.Single;
                                 *
                                 *  if (MaxValue < byte.MaxValue)
                                 *      curve.KeyType = AnimCurveKeyType.SByte;
                                 *  else if (MaxValue < ushort.MaxValue)
                                 *      curve.KeyType = AnimCurveKeyType.Int16;
                                 *  else
                                 *      curve.KeyType = AnimCurveKeyType.Single;*/
                            }
                        }
                    }

                    TexturePatternCurveIndex += matAnimData.TexturePatternAnimInfos.Where(item => item.CurveIndex != uint.MaxValue).ToList().Count;
                    ShaderParamCurveIndex    += CurveIndex;
                }

                return(matAnim);
            }
Example #3
0
        public GifToTexturePatternAnimation(string FileName, BNTX TargetBNTX, FMAA fmaa)
        {
            string TextureName = System.IO.Path.GetFileNameWithoutExtension(FileName);

            Image gifImg = Image.FromFile(FileName);

            //Add all the images
            var images = GetImages(gifImg);

            TargetBNTX.ImportTexture(images, TextureName);

            //Now load the key data to the animation
            fmaa.MaterialAnim              = new Syroot.NintenTools.NSW.Bfres.MaterialAnim();
            fmaa.MaterialAnim.Name         = fmaa.Text;
            fmaa.MaterialAnim.Path         = "";
            fmaa.MaterialAnim.Loop         = true;
            fmaa.MaterialAnim.FrameCount   = images.Length;
            fmaa.MaterialAnim.TextureNames = new List <string>();
            foreach (ImageKeyFrame key in images)
            {
                fmaa.MaterialAnim.TextureNames.Add($"{TextureName}{key.Frame}");
            }

            var material = new MaterialAnimData();

            material.Name = "NewMaterial";

            material.TexturePatternAnimInfos  = new List <TexturePatternAnimInfo>();
            material.TexturePatternCurveIndex = 0;
            material.BeginVisalConstantIndex  = 0;

            TexturePatternAnimInfo info = new TexturePatternAnimInfo();

            info.CurveIndex    = 0;
            info.SubBindIndex  = -1;
            info.BeginConstant = ushort.MaxValue;
            info.Name          = "_a0";
            material.TexturePatternAnimInfos.Add(info);

            fmaa.MaterialAnim.MaterialAnimDataList.Add(material);
            AnimCurve curve = new AnimCurve();

            curve.AnimDataOffset = 0;
            curve.CurveType      = AnimCurveType.StepInt;
            curve.Delta          = 0;
            curve.EndFrame       = images.Length;
            curve.StartFrame     = 0;
            curve.FrameType      = AnimCurveFrameType.Byte;
            curve.Scale          = 1;
            curve.Offset         = 0;
            curve.Frames         = new float[(int)curve.EndFrame];

            for (int i = 0; i < curve.EndFrame; i++)
            {
                curve.Frames[i] = images[i].Frame;
            }

            curve.Keys = new float[(int)curve.Frames.Length, 1];
            for (int i = 0; i < (ushort)curve.Keys.Length; i++)
            {
                int index = fmaa.MaterialAnim.TextureNames.IndexOf($"{TextureName}{images[i].Frame}");
                curve.Keys[i, 0] = index;
            }

            material.Curves.Add(curve);

            fmaa.UpdateMaterialBinds();
        }