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); }
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); }
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(); }