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]), }); }
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; } }