Beispiel #1
0
        static void UpdateParamInfo(BfresMaterialAnim anim, STAnimGroup paramGroup)
        {
            var materials = anim.GetMaterials(SelectedMaterial);

            if (materials.Count > 0)
            {
                var mat = materials.FirstOrDefault();
                if (mat.ShaderParams.ContainsKey(paramGroup.Name))
                {
                    ParamProperty.ParamType = mat.ShaderParams[paramGroup.Name].Type;
                }
            }
            if (paramGroup.Name.Contains("color") || paramGroup.Name.Contains("Color"))
            {
                isColor = true;
            }
        }
Beispiel #2
0
        private void ParseAnimationTrack(STAnimGroup group, FMAT mat)
        {
            foreach (var track in group.GetTracks())
            {
                if (track is SamplerTrack)
                {
                    ParseSamplerTrack(mat, (SamplerTrack)track);
                }
                if (track is ParamTrack)
                {
                    ParseParamTrack(mat, group, (ParamTrack)track);
                }
            }

            foreach (var subGroup in group.SubAnimGroups)
            {
                ParseAnimationTrack(subGroup, mat);
            }
        }
Beispiel #3
0
        private NodeBase CreateGroupHierachy(FMAT material, STAnimGroup group)
        {
            if (group is ParamAnimGroup)
            {
                return(CreateParamNodeHierachy(material, (ParamAnimGroup)group));
            }

            var groupNode = new NodeBase(group.Name);

            groupNode.Tag = group;

            //Params have their own sub group for each parameter
            //The X, Y, Z values being individual tracks
            foreach (STAnimGroup subGroup in group.SubAnimGroups)
            {
                groupNode.AddChild(CreateGroupHierachy(material, subGroup));
            }

            var tracks = group.GetTracks();

            return(groupNode);
        }
Beispiel #4
0
        private void AddGroup(TreeNodeCollection nodes, STAnimGroup group)
        {
            TreeNode groupNode = new TreeNode(group.Name)
            {
                Tag = group, ImageKey = "AnimationGroup",
            };

            nodes.Add(groupNode);

            foreach (var subGroup in group.SubAnimGroups)
            {
                AddGroup(groupNode.Nodes, subGroup);
            }

            foreach (var track in group.GetTracks())
            {
                if (!track.HasKeys)
                {
                    continue;
                }

                string imageKey = "AnimationTrack";
                if (track.Name.EndsWith("R"))
                {
                    imageKey = "AnimationTrackR";
                }
                if (track.Name.EndsWith("G"))
                {
                    imageKey = "AnimationTrackG";
                }
                if (track.Name.EndsWith("B"))
                {
                    imageKey = "AnimationTrackB";
                }
                if (track.Name.EndsWith("A"))
                {
                    imageKey = "AnimationTrackA";
                }
                if (track.Name.EndsWith("X"))
                {
                    imageKey = "AnimationTrackX";
                }
                if (track.Name.EndsWith("Y"))
                {
                    imageKey = "AnimationTrackY";
                }
                if (track.Name.EndsWith("Z"))
                {
                    imageKey = "AnimationTrackZ";
                }
                if (track.Name.EndsWith("W"))
                {
                    imageKey = "AnimationTrackW";
                }

                TreeNode trackNode = new TreeNode(track.Name)
                {
                    Tag = track, ImageKey = imageKey, SelectedImageKey = imageKey,
                };
                groupNode.Nodes.Add(trackNode);
            }
        }
Beispiel #5
0
        public LytAnimGroup(BxlanPaiEntry entry)
        {
            animEntry = entry;
            Name      = entry.Name;
            if (entry.Target == AnimationTarget.Material)
            {
                Category = "Materials";
            }
            else if (entry.Target == AnimationTarget.Pane)
            {
                Category = "Panes";
            }
            else
            {
                Category = "User Data";
            }

            //Generate sub groups which contain the track data
            for (int i = 0; i < entry.Tags?.Count; i++)
            {
                STAnimGroup group = new STAnimGroup();
                string      tag   = entry.Tags[i].Tag.Remove(0, 1);
                switch (tag)
                {
                case "LPA":
                    group = new LytPaneSRTGroup(entry.Tags[i]);
                    break;

                case "LVI":
                    group = new LytVisibiltyGroup(entry.Tags[i]);
                    break;

                case "LTS":
                    group = new LytTextureSRTGroup(entry.Tags[i]);
                    break;

                case "LVC":
                    group = new LytVertexColorGroup(entry.Tags[i]);
                    break;

                case "LMC":
                    group = new LytMaterialColorGroup(entry.Tags[i]);
                    break;

                case "LIM":
                    group = new LytIndirectSRTGroup(entry.Tags[i]);
                    break;

                case "LTP":
                    group = new LytTexturePatternGroup(entry.Tags[i]);
                    break;

                case "LAC":
                    group = new LytAlphaTestGroup(entry.Tags[i]);
                    break;

                case "LCT":
                    group = new LytFontShadowGroup(entry.Tags[i]);
                    break;

                case "LCC":
                    group = new LytPerCharacterTransformCurveGroup(entry.Tags[i]);
                    break;
                }

                foreach (var keyGroup in entry.Tags[i].Entries)
                {
                    if (!(group is IAnimationTarget))
                    {
                        continue;
                    }

                    var targetGroup = ((IAnimationTarget)group).GetTrack(keyGroup.AnimationTarget);
                    if (targetGroup != null)
                    {
                        targetGroup.LoadKeyFrames(keyGroup.KeyFrames);
                        targetGroup.Name = keyGroup.TargetName;

                        if (keyGroup.CurveType == CurveType.Constant)
                        {
                            targetGroup.InterpolationType = STInterpoaltionType.Constant;
                        }
                        else if (keyGroup.CurveType == CurveType.Hermite)
                        {
                            targetGroup.InterpolationType = STInterpoaltionType.Hermite;
                        }
                        else if (keyGroup.CurveType == CurveType.Step)
                        {
                            targetGroup.InterpolationType = STInterpoaltionType.Step;
                        }
                    }
                    else
                    {
                        Console.WriteLine($"Unsupported track type for tag {keyGroup.TargetName} {keyGroup.AnimationTarget}");
                    }
                }

                group.Name = entry.Tags[i].Type;
                SubAnimGroups.Add(group);
            }
        }
Beispiel #6
0
        private void ParseParamTrack(FMAT material, STAnimGroup group, ParamTrack track)
        {
            if (!material.ShaderParams.ContainsKey(group.Name))
            {
                return;
            }

            var value = track.GetFrameValue(this.Frame);

            //4 bytes per float or int value
            uint index = track.ValueOffset / 4;

            var targetParam = material.ShaderParams[group.Name];

            var param = new ShaderParam();

            if (!material.AnimatedParams.ContainsKey(group.Name))
            {
                if (targetParam.DataValue is float[])
                {
                    float[] values = (float[])targetParam.DataValue;
                    float[] dest   = new float[values.Length];
                    Array.Copy(values, dest, values.Length);
                    param.DataValue = dest;
                }
                else
                {
                    param.DataValue = targetParam.DataValue;
                }

                param.Type = targetParam.Type;
                param.Name = group.Name;

                material.AnimatedParams.Add(group.Name, param);
            }

            param = material.AnimatedParams[group.Name];

            switch (targetParam.Type)
            {
            case ShaderParamType.Float: param.DataValue = (float)value; break;

            case ShaderParamType.Float2:
            case ShaderParamType.Float3:
            case ShaderParamType.Float4:
                ((float[])param.DataValue)[index] = value;
                break;

            case ShaderParamType.Int: param.DataValue = value; break;

            case ShaderParamType.Int2:
            case ShaderParamType.Int3:
            case ShaderParamType.Int4:
                ((int[])param.DataValue)[index] = (int)value;
                break;

            case ShaderParamType.TexSrt:
            case ShaderParamType.TexSrtEx:
            {
                TexSrtMode mode       = ((TexSrt)param.DataValue).Mode;
                var        translateX = ((TexSrt)param.DataValue).Translation.X;
                var        translateY = ((TexSrt)param.DataValue).Translation.Y;
                var        rotate     = ((TexSrt)param.DataValue).Rotation;
                var        scaleX     = ((TexSrt)param.DataValue).Scaling.X;
                var        scaleY     = ((TexSrt)param.DataValue).Scaling.Y;

                // if (track.ValueOffset == 0) mode = (TexSrtMode)Convert.ToUInt32(value);
                if (track.ValueOffset == 4)
                {
                    scaleX = value;
                }
                if (track.ValueOffset == 8)
                {
                    scaleY = value;
                }
                if (track.ValueOffset == 12)
                {
                    rotate = value;
                }
                if (track.ValueOffset == 16)
                {
                    translateX = value;
                }
                if (track.ValueOffset == 20)
                {
                    translateY = value;
                }

                param.DataValue = new TexSrt()
                {
                    Mode        = mode,
                    Scaling     = new Syroot.Maths.Vector2F(scaleX, scaleY),
                    Translation = new Syroot.Maths.Vector2F(translateX, translateY),
                    Rotation    = rotate,
                };
            }
            break;

            case ShaderParamType.Srt2D:
            {
                var translateX = ((Srt2D)param.DataValue).Translation.X;
                var translateY = ((Srt2D)param.DataValue).Translation.Y;
                var rotate     = ((Srt2D)param.DataValue).Rotation;
                var scaleX     = ((Srt2D)param.DataValue).Scaling.X;
                var scaleY     = ((Srt2D)param.DataValue).Scaling.Y;

                if (track.ValueOffset == 0)
                {
                    scaleX = value;
                }
                if (track.ValueOffset == 4)
                {
                    scaleY = value;
                }
                if (track.ValueOffset == 8)
                {
                    rotate = value;
                }
                if (track.ValueOffset == 12)
                {
                    translateX = value;
                }
                if (track.ValueOffset == 16)
                {
                    translateY = value;
                }

                param.DataValue = new Srt2D()
                {
                    Scaling     = new Syroot.Maths.Vector2F(scaleX, scaleY),
                    Translation = new Syroot.Maths.Vector2F(translateX, translateY),
                    Rotation    = rotate,
                };
            }
            break;
            }
        }