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 static void FromStruct(MaterialAnim anim, MaterialAnimHelper animJson) { anim.TextureNames = new ResDict <TextureRef>(); foreach (var tex in animJson.TextureList) { anim.TextureNames.Add(tex, new TextureRef() { Name = tex }); } anim.Name = animJson.Name; anim.Baked = animJson.Baked; anim.Loop = animJson.Loop; anim.FrameCount = animJson.FrameCount; anim.Baked = animJson.Baked; anim.MaterialAnimDataList = new List <MaterialAnimData>(); anim.BindIndices = new ushort[animJson.MaterialAnims.Count]; for (int i = 0; i < anim.BindIndices.Length; i++) { anim.BindIndices[i] = 65535; } anim.UserData = UserDataConvert.Convert(animJson.UserData); foreach (var matAnimJson in animJson.MaterialAnims) { MaterialAnimData matAnim = new MaterialAnimData(); anim.MaterialAnimDataList.Add(matAnim); matAnim.Name = matAnimJson.Name; matAnim.ParamAnimInfos = new List <ParamAnimInfo>(); matAnim.PatternAnimInfos = new List <PatternAnimInfo>(); matAnim.ShaderParamCurveIndex = 0; List <ushort> texturePatternBase = new List <ushort>(); foreach (var samplerInfo in matAnimJson.Samplers) { var info = new PatternAnimInfo(); info.Name = samplerInfo.Name; info.CurveIndex = -1; if (samplerInfo.Curve != null) { info.CurveIndex = (short)matAnim.Curves.Count; } matAnim.PatternAnimInfos.Add(info); texturePatternBase.Add(samplerInfo.Constant); if (samplerInfo.Curve != null) { matAnim.Curves.Add(CurveAnimHelper.GenerateCurve(samplerInfo.Curve, 0, false)); } } ushort curveIndex = 0; ushort constantIndex = 0; foreach (var paramInfo in matAnimJson.Params) { var info = new ParamAnimInfo(); info.BeginCurve = curveIndex; info.BeginConstant = constantIndex; info.ConstantCount = (ushort)paramInfo.Constants.Count; info.FloatCurveCount = (ushort)paramInfo.Curves.Count(); info.IntCurveCount = 0; info.Name = paramInfo.Name; matAnim.ParamAnimInfos.Add(info); if (paramInfo.Curves.Count > 0) { matAnim.VisualConstantIndex = 0; } foreach (var curveJson in paramInfo.Curves) { uint target = uint.Parse(curveJson.Target); matAnim.Curves.Add(CurveAnimHelper.GenerateCurve(curveJson, target, false)); } foreach (var constJson in paramInfo.Constants) { matAnim.Constants.Add(constJson); } curveIndex += (ushort)matAnim.Curves.Count; constantIndex += (ushort)matAnim.Constants.Count; } matAnim.BaseDataList = texturePatternBase.ToArray(); } }