private static byte[] WriteRig(int id, VoxelData.RigData rig) { List <byte> bytes = new List <byte>(); bytes.AddRange(GetBytes(id)); // Bones bytes.AddRange(GetBytes(rig.Bones.Count)); for (int i = 0; i < rig.Bones.Count; i++) { var bone = rig.Bones[i]; AddVoxStringBytes(ref bytes, bone.Name); bytes.AddRange(GetBytes(bone.ParentIndex)); bytes.AddRange(GetBytes(bone.PositionX)); bytes.AddRange(GetBytes(bone.PositionY)); bytes.AddRange(GetBytes(bone.PositionZ)); } // Weights bytes.AddRange(GetBytes(rig.Weights.Count)); for (int i = 0; i < rig.Weights.Count; i++) { var weight = rig.Weights[i]; bytes.AddRange(GetBytes(weight.X)); bytes.AddRange(GetBytes(weight.Y)); bytes.AddRange(GetBytes(weight.Z)); bytes.AddRange(GetBytes(weight.BoneIndexA)); bytes.AddRange(GetBytes(weight.BoneIndexB)); } return(ToChrunkByte(bytes, "_RIG")); }
private static int ReadRig(BinaryReader _br, ref VoxelData data, int version) { int chunkSize = _br.ReadInt32(); int childrenSize = _br.ReadInt32(); int id = _br.ReadInt32(); var rigData = new VoxelData.RigData() { Bones = new List <VoxelData.RigData.Bone>(), Weights = new List <VoxelData.RigData.Weight>(), Version = version, }; // Bone int boneCount = _br.ReadInt32(); for (int i = 0; i < boneCount; i++) { var bone = new VoxelData.RigData.Bone { Name = ReadString(_br), ParentIndex = _br.ReadInt32(), PositionX = _br.ReadInt32(), PositionY = _br.ReadInt32(), PositionZ = _br.ReadInt32(), }; rigData.Bones.Add(bone); } for (int i = 0; i < rigData.Bones.Count; i++) { int pIndex = rigData.Bones[i].ParentIndex; if (pIndex >= 0 && pIndex < rigData.Bones.Count) { rigData.Bones[i].Parent = rigData.Bones[pIndex]; } } // Weight int WeightCount = _br.ReadInt32(); for (int i = 0; i < WeightCount; i++) { var weight = new VoxelData.RigData.Weight { X = _br.ReadInt32(), Y = _br.ReadInt32(), Z = _br.ReadInt32(), BoneIndexA = _br.ReadInt32(), BoneIndexB = _br.ReadInt32(), }; rigData.Weights.Add(weight); } // Version rigData.FixVersion(); // End if (!data.Rigs.ContainsKey(id)) { data.Rigs.Add(id, rigData); } if (childrenSize > 0) { _br.ReadBytes(childrenSize); } return(chunkSize + childrenSize + 4 + 4); }