Ejemplo n.º 1
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }