예제 #1
0
        protected internal override object Read(ContentReader input)
        {
            builder.Begin();

            // Bone count
            var boneCount = input.ReadUInt32();

            builder.SetBoneCount(boneCount);

            builder.BeginBones();

            // Repeat <bone count>
            for (int i = 0; i < boneCount; i++)
            {
                builder.BeginBone(i);

                // Name
                builder.SetBoneName(input.ReadObject() as string);
                // Transform
                builder.SetBoneTransform(matrixReader.Read(input));

                builder.EndBone();
            }

            builder.EndBones();

            builder.BeginBoneHierarchies();

            // Repeat <bone count>: hierarchy
            for (int i = 0; i < boneCount; i++)
            {
                builder.BeginBoneHierarchy(i);

                // Parent bone
                builder.SetBoneHierarchyParentBone(ReadBoneReference(input, (int)boneCount));

                // Child bone count
                var childCount = input.ReadUInt32();
                builder.SetBoneHierarchyChildBoneCount(childCount);

                if (childCount != 0)
                {
                    builder.BeginBoneHierarchyChildBones();

                    for (int j = 0; j < childCount; j++)
                    {
                        builder.BeginBoneHierarchyChildBone(j);

                        // Child bone
                        builder.SetBoneHierarchyChildBone(ReadBoneReference(input, (int)boneCount));

                        builder.EndBoneHierarchyChildBone();
                    }

                    builder.EndBoneHierarchyChildBones();
                }

                builder.EndBoneHierarchy();
            }

            builder.EndBoneHierarchies();

            // Mesh count
            var meshCount = input.ReadUInt32();

            builder.SetMeshCount(meshCount);

            builder.BeginMeshes();

            // Repeat <mesh count>
            for (int i = 0; i < meshCount; i++)
            {
                builder.BeginMesh(i);

                // Name
                builder.SetMeshName(input.ReadObject() as string);

                // Parent bone
                builder.SetMeshParentBone(ReadBoneReference(input, (int)boneCount));

                // BoundingSphere
                builder.SetMeshBoundingSphere(boundingSphereReader.Read(input));

                // Tag
                builder.SetMeshTag(input.ReadObject());

                // Mesh part count
                var partCount = input.ReadUInt32();
                builder.SetMeshPartCount(partCount);

                builder.BeginMeshParts();

                // Repeat <mesh part count>
                for (int j = 0; j < partCount; j++)
                {
                    builder.BeginMeshPart(j);

                    // Vertex offset
                    builder.SetMeshPartVertexOffset(input.ReadUInt32());

                    // Num vertices
                    builder.SetMeshPartNumVertices(input.ReadUInt32());

                    // Start index
                    builder.SetMeshPartStartIndex(input.ReadUInt32());

                    // Primitive count
                    builder.SetMeshPartPrimitiveCount(input.ReadUInt32());

                    // Tag
                    builder.SetMeshPartTag(input.ReadObject());

                    // Vertex buffer
                    var vertexBufferId = input.ReadSharedResource(builder.GetMeshPartVertexBufferCallback());
                    builder.SetMeshPartVertexBuffer(vertexBufferId);

                    // Index buffer
                    var indexBufferId = input.ReadSharedResource(builder.GetMeshPartIndexBufferCallback());
                    builder.SetMeshPartIndexBuffer(indexBufferId);

                    // Effect
                    var effectId = input.ReadSharedResource(builder.GetMeshPartEffectCallback());
                    builder.SetMeshPartEffect(effectId);

                    builder.EndMeshPart();
                }

                builder.EndMeshParts();

                builder.EndMesh();
            }

            builder.EndMeshes();

            // Root bone
            builder.SetRootBone(ReadBoneReference(input, (int)boneCount));

            // Tag
            builder.SetTag(input.ReadObject());

            return(builder.End());
        }