Beispiel #1
0
        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"));
        }
Beispiel #2
0
        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);
        }