public void Reload(MaterialAnim anim) { Name = anim.Name; FrameCount = anim.FrameCount; FrameRate = 60.0f; Loop = anim.Loop; if (anim.TextureNames != null) { TextureList = anim.TextureNames.Keys.ToList(); } if (anim.MaterialAnimDataList == null) { return; } AnimGroups.Clear(); foreach (var matAnim in anim.MaterialAnimDataList) { var group = new MaterialAnimGroup(); AnimGroups.Add(group); group.Name = matAnim.Name; //Get the material animation's texture pattern animation lists //Each sampler has their own info for (int i = 0; i < matAnim.PatternAnimInfos.Count; i++) { var patternInfo = matAnim.PatternAnimInfos[i]; //Get the curve index for animated indices int curveIndex = patternInfo.CurveIndex; //Get the base index for starting values int textureBaseIndex = matAnim.BaseDataList.Length > i ? matAnim.BaseDataList[i] : 0; //Make a new sampler track using step interpolation var samplerTrack = new SamplerTrack(); samplerTrack.InterpolationType = STInterpoaltionType.Step; samplerTrack.Sampler = patternInfo.Name; group.Tracks.Add(samplerTrack); if (curveIndex != -1) { BfresAnimations.GenerateKeys(samplerTrack, matAnim.Curves[curveIndex], true); } else //Use the base data and make a constant key { samplerTrack.KeyFrames.Add(new STKeyFrame(0, textureBaseIndex)); } } //Get the list of animated parameters for (int i = 0; i < matAnim.ParamAnimInfos.Count; i++) { ParamAnimGroup paramGroup = new ParamAnimGroup(); paramGroup.Name = matAnim.ParamAnimInfos[i].Name; group.SubAnimGroups.Add(paramGroup); var paramInfo = matAnim.ParamAnimInfos[i]; //Params have int and float curves int curveIndex = paramInfo.BeginCurve; int constantIndex = paramInfo.BeginConstant; int numFloats = paramInfo.FloatCurveCount; int numInts = paramInfo.IntCurveCount; int numConstants = paramInfo.ConstantCount; //Each constant and curve get's their own value using a value offset for (int j = 0; j < numConstants; j++) { var constant = matAnim.Constants[constantIndex + j]; float value = constant.Value; //A bit hacky, convert int32 types by value range SRT modes use if (constant.Value.Int32 > 0 && constant.Value.Int32 < 6) { value = constant.Value.Int32; } paramGroup.Tracks.Add(new ParamTrack() { Name = constant.AnimDataOffset.ToString("X"), ValueOffset = constant.AnimDataOffset, //Not the best way, but 4 is typically the stride size for each value ChannelIndex = (int)(constant.AnimDataOffset / 4), KeyFrames = new List <STKeyFrame>() { new STKeyFrame(0, value) }, InterpolationType = STInterpoaltionType.Constant, }); } //Loop through all int and float curve values for (int j = 0; j < numInts + numFloats; j++) { var curve = matAnim.Curves[curveIndex + j]; var paramTrack = new ParamTrack() { Name = curve.AnimDataOffset.ToString("X") }; paramTrack.ValueOffset = curve.AnimDataOffset; //Not the best way, but 4 is typically the stride size for each value paramTrack.ChannelIndex = (int)(curve.AnimDataOffset / 4); paramGroup.Tracks.Add(paramTrack); BfresAnimations.GenerateKeys(paramTrack, curve); } } } }
private NodeBase CreateParamNodeHierachy(FMAT material, ParamAnimGroup group) { var groupNode = new NodeBase(group.Name); groupNode.Tag = group; var tracks = group.GetTracks(); if (material != null) { List <ParamTrack> paramTracks = new List <ParamTrack>(); var param = material.ShaderParams[group.Name]; switch (param.Type) { case ShaderParamType.TexSrt: case ShaderParamType.TexSrtEx: var texSrt = ((TexSrt)param.DataValue); paramTracks.Add(new ParamTrack(0, (float)texSrt.Mode, "Mode")); paramTracks.Add(new ParamTrack(4, (float)texSrt.Scaling.X, "Scale.X")); paramTracks.Add(new ParamTrack(8, (float)texSrt.Scaling.Y, "Scale.Y")); paramTracks.Add(new ParamTrack(12, (float)texSrt.Rotation, "Rotate")); paramTracks.Add(new ParamTrack(16, (float)texSrt.Translation.X, "Position.X")); paramTracks.Add(new ParamTrack(20, (float)texSrt.Translation.Y, "Position.X")); break; case ShaderParamType.Float: paramTracks.Add(new ParamTrack(0, (float)param.DataValue, "Value")); break; case ShaderParamType.Float2: case ShaderParamType.Float3: case ShaderParamType.Float4: var values = ((float[])param.DataValue); string[] channel = new string[4] { "X", "Y", "Z", "W" }; for (int i = 0; i < values.Length; i++) { paramTracks.Add(new ParamTrack((uint)i * 4, values[i], channel[i])); } break; } for (int i = 0; i < paramTracks.Count; i++) { var targetTrack = group.Tracks.FirstOrDefault(x => ((ParamTrack)x).ValueOffset == paramTracks[i].ValueOffset); if (targetTrack == null) { group.Tracks.Add(paramTracks[i]); } else { targetTrack.Name = paramTracks[i].Name; } } } foreach (ParamTrack track in group.Tracks.OrderBy(x => ((ParamTrack)x).ValueOffset)) { track.ChannelIndex = ((int)track.ValueOffset / 4); var trackNode = new NodeBase(track.Name); trackNode.Tag = track; groupNode.AddChild(trackNode); } return(groupNode); }