public override TexSrt ReadJson(JsonReader reader, Type objectType, TexSrt existingValue, bool hasExistingValue, JsonSerializer serializer)
            {
                TexSrtMode mode = TexSrtMode.ModeMaya;

                float[] scaling = new float[2] {
                    1, 1
                };
                float[] translate = new float[2] {
                    0, 0
                };
                float rotate = 0;

                while (reader.Read())
                {
                    if (reader.TokenType != JsonToken.PropertyName)
                    {
                        break;
                    }

                    var propertyName = (string)reader.Value;
                    if (!reader.Read())
                    {
                        continue;
                    }

                    if (propertyName == "Mode")
                    {
                        mode = serializer.Deserialize <TexSrtMode>(reader);
                    }
                    if (propertyName == "Scaling")
                    {
                        scaling = serializer.Deserialize <float[]>(reader);
                    }
                    if (propertyName == "Translation")
                    {
                        translate = serializer.Deserialize <float[]>(reader);
                    }
                    if (propertyName == "Rotation")
                    {
                        rotate = serializer.Deserialize <float>(reader);
                    }
                }

                return(new TexSrt()
                {
                    Mode = mode,
                    Rotation = rotate,
                    Scaling = new Syroot.Maths.Vector2F(scaling[0], scaling[1]),
                    Translation = new Syroot.Maths.Vector2F(translate[0], translate[1]),
                });
            }
Exemple #2
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;
            }
        }