public static void Import_SKIN(this StreamReader r, MyProgressBar mpb, SKIN skin) { string tagLine = r.ReadTag(); string[] split = tagLine.Split(new char[] { ' ', }, StringSplitOptions.RemoveEmptyEntries); if (split.Length != 2) { throw new InvalidDataException("Invalid tag line read for 'skin'."); } if (split[0] != "skin") { throw new InvalidDataException("Expected line tag 'skin' not found."); } int count; if (!int.TryParse(split[1], out count)) { throw new InvalidDataException("'skin' line has invalid count."); } if (count == 0) { return; } skin.Bones = new SKIN.BoneList(null); mpb.Init("Import SKIN...", count); for (int b = 0; b < count; b++) { split = r.ReadLine().Split(new char[] { ' ', }, StringSplitOptions.RemoveEmptyEntries); if (split.Length != 14) { throw new InvalidDataException(string.Format("'skin' line {0} has invalid format.", b)); } int index; if (!int.TryParse(split[0], out index)) { throw new InvalidDataException(string.Format("'skin' line {0} has invalid line index.", b)); } if (index != b) { throw new InvalidDataException(string.Format("'vrtf' line {0} has incorrect line index value {1}.", b, index)); } uint name; if (!uint.TryParse(split[1], System.Globalization.NumberStyles.HexNumber, null, out name)) { throw new InvalidDataException(string.Format("'skin' line {0} has invalid name hash.", b)); } //if (name != mesh.JointReferences[b]) //throw new InvalidDataException(string.Format("'skin' line {0} name 0x{1:X8} does not match mesh joint reference 0x{2:X8}.", b, name, mesh.JointReferences[b])); float[] values = split.ConvertAll <Single>(2); if (values.Length != 12) { throw new InvalidDataException(string.Format("'skin' line {0} has incorrect number of float values {1}.", b, values.Length)); } SKIN.Bone bone = new SKIN.Bone(0, null) { NameHash = name, InverseBindPose = new Matrix43(0, null), }; bone.InverseBindPose.Right.X = values[0]; bone.InverseBindPose.Right.Y = values[1]; bone.InverseBindPose.Right.Z = values[2]; bone.InverseBindPose.Translate.X = values[3]; bone.InverseBindPose.Up.X = values[4]; bone.InverseBindPose.Up.Y = values[5]; bone.InverseBindPose.Up.Z = values[6]; bone.InverseBindPose.Translate.Y = values[7]; bone.InverseBindPose.Back.X = values[8]; bone.InverseBindPose.Back.Y = values[9]; bone.InverseBindPose.Back.Z = values[10]; bone.InverseBindPose.Translate.Z = values[11]; skin.Bones.Add(bone); mpb.Value++; } mpb.Done(); }
public static void Import_SKIN(this StreamReader r, MyProgressBar mpb, SKIN skin) { string tagLine = r.ReadTag(); string[] split = tagLine.Split(new char[] { ' ', }, StringSplitOptions.RemoveEmptyEntries); if (split.Length != 2) throw new InvalidDataException("Invalid tag line read for 'skin'."); if (split[0] != "skin") throw new InvalidDataException("Expected line tag 'skin' not found."); int count; if (!int.TryParse(split[1], out count)) throw new InvalidDataException("'skin' line has invalid count."); if (count == 0) return; skin.Bones = new SKIN.BoneList(null); mpb.Init("Import SKIN...", count); for (int b = 0; b < count; b++) { split = r.ReadLine().Split(new char[] { ' ', }, StringSplitOptions.RemoveEmptyEntries); if (split.Length != 14) throw new InvalidDataException(string.Format("'skin' line {0} has invalid format.", b)); int index; if (!int.TryParse(split[0], out index)) throw new InvalidDataException(string.Format("'skin' line {0} has invalid line index.", b)); if (index != b) throw new InvalidDataException(string.Format("'vrtf' line {0} has incorrect line index value {1}.", b, index)); uint name; if (!uint.TryParse(split[1], System.Globalization.NumberStyles.HexNumber, null, out name)) throw new InvalidDataException(string.Format("'skin' line {0} has invalid name hash.", b)); //if (name != mesh.JointReferences[b]) //throw new InvalidDataException(string.Format("'skin' line {0} name 0x{1:X8} does not match mesh joint reference 0x{2:X8}.", b, name, mesh.JointReferences[b])); float[] values = split.ConvertAll<Single>(2); if (values.Length != 12) throw new InvalidDataException(string.Format("'skin' line {0} has incorrect number of float values {1}.", b, values.Length)); SKIN.Bone bone = new SKIN.Bone(0, null) { NameHash = name, InverseBindPose = new Matrix43(0, null), }; bone.InverseBindPose.Right.X = values[0]; bone.InverseBindPose.Right.Y = values[1]; bone.InverseBindPose.Right.Z = values[2]; bone.InverseBindPose.Translate.X = values[3]; bone.InverseBindPose.Up.X = values[4]; bone.InverseBindPose.Up.Y = values[5]; bone.InverseBindPose.Up.Z = values[6]; bone.InverseBindPose.Translate.Y = values[7]; bone.InverseBindPose.Back.X = values[8]; bone.InverseBindPose.Back.Y = values[9]; bone.InverseBindPose.Back.Z = values[10]; bone.InverseBindPose.Translate.Z = values[11]; skin.Bones.Add(bone); mpb.Value++; } mpb.Done(); }