Beispiel #1
0
        // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#meshes

        int ExportIndices(int[] indices)
        {
            // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#primitiveindices

            indices = CoordUtils.FlipIndices(indices).ToArray();

            // Scalar | UNSIGNED_BYTE
            //        | UNSIGNED_SHORT
            //        | UNSIGNED_INT! (TODO: optimize kind...)

            byte[] buffer    = PrimitiveExporter.Marshal(indices);
            var    viewIndex = BufferBuilder.AddView(
                new ArraySegment <byte>(buffer),
                null,
                Types.BufferView.TargetEnum.ELEMENT_ARRAY_BUFFER);

            var viewComponentType = Types.Accessor.ComponentTypeEnum.UNSIGNED_INT;

            var accessor = new Types.Accessor
            {
                BufferView    = viewIndex,
                ByteOffset    = 0,
                ComponentType = viewComponentType,
                Count         = indices.Length,
                Type          = Types.Accessor.TypeEnum.Scalar,
            };

            return(Types.GltfExtensions.AddAccessor(Gltf, accessor));
        }
Beispiel #2
0
        int ExportPositionsBuffer(ref Vector3[] vec3, out Types.Accessor.ComponentTypeEnum componentType)
        {
            vec3 = vec3.Select(CoordUtils.ConvertSpace).ToArray();

            // VEC3! | FLOAT!
            byte[] buffer    = PrimitiveExporter.Marshal(vec3);
            var    viewIndex = BufferBuilder.AddView(new ArraySegment <byte>(buffer));

            componentType = Types.Accessor.ComponentTypeEnum.FLOAT;

            return(viewIndex);
        }
Beispiel #3
0
        int ExportSparseIndicesBuffer(ref int[] indices, out Types.Accessor.SparseType.IndicesType.ComponentTypeEnum componentType)
        {
            // Scalar | UNSIGNED_BYTE
            //        | UNSIGNED_SHORT
            //        | UNSIGNED_INT! (TODO: optimize kind...)
            byte[] buffer    = PrimitiveExporter.Marshal(indices);
            var    viewIndex = BufferBuilder.AddView(new ArraySegment <byte>(buffer));

            componentType = Types.Accessor.SparseType.IndicesType.ComponentTypeEnum.UNSIGNED_INT;

            return(viewIndex);
        }
Beispiel #4
0
        // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skin

        int ExportInverseBindMatrices(Matrix4x4[] matrices)
        {
            matrices = matrices.Select(CoordUtils.ConvertSpace).ToArray();

            // MAT4! | FLOAT!
            byte[] buffer    = PrimitiveExporter.Marshal(matrices);
            var    viewIndex = BufferBuilder.AddView(new ArraySegment <byte>(buffer));

            var accessor = new Types.Accessor
            {
                BufferView    = viewIndex,
                ByteOffset    = 0,
                ComponentType = Types.Accessor.ComponentTypeEnum.FLOAT,
                Count         = matrices.Length,
                Type          = Types.Accessor.TypeEnum.Mat4,
            };

            return(Types.GltfExtensions.AddAccessor(Gltf, accessor));
        }
Beispiel #5
0
        int ExportWeights(Vector4[] weights)
        {
            // VEC4! | FLOAT!
            //       | UNSIGNED_BYTE  (normalized)
            //       | UNSIGNED_SHORT (normalized)
            byte[] buffer    = PrimitiveExporter.Marshal(weights);
            var    viewIndex = BufferBuilder.AddView(new ArraySegment <byte>(buffer));

            var accessor = new Types.Accessor
            {
                BufferView    = viewIndex,
                ByteOffset    = 0,
                ComponentType = Types.Accessor.ComponentTypeEnum.FLOAT,
                Count         = weights.Length,
                Type          = Types.Accessor.TypeEnum.Vec4,
            };

            return(Types.GltfExtensions.AddAccessor(Gltf, accessor));
        }
Beispiel #6
0
        int ExportTangents(Vector4[] vec4)
        {
            vec4 = vec4.Select(CoordUtils.ConvertSpace).ToArray();

            // VEC4! | FLOAT!
            byte[] buffer    = PrimitiveExporter.Marshal(vec4);
            var    viewIndex = BufferBuilder.AddView(new ArraySegment <byte>(buffer));

            var accessor = new Types.Accessor
            {
                BufferView    = viewIndex,
                ByteOffset    = 0,
                ComponentType = Types.Accessor.ComponentTypeEnum.FLOAT,
                Count         = vec4.Length,
                Type          = Types.Accessor.TypeEnum.Vec4,
            };

            return(Types.GltfExtensions.AddAccessor(Gltf, accessor));
        }
Beispiel #7
0
        int ExportUV(Vector2[] uv)
        {
            uv = uv.Select(CoordUtils.ConvertUV).ToArray();

            // VEC2! | FLOAT!
            //       | UNSIGNED_BYTE  (normalized)
            //       | UNSIGNED_SHORT (normalized)
            byte[] buffer    = PrimitiveExporter.Marshal(uv);
            var    viewIndex = BufferBuilder.AddView(new ArraySegment <byte>(buffer));

            var accessor = new Types.Accessor
            {
                BufferView    = viewIndex,
                ByteOffset    = 0,
                ComponentType = Types.Accessor.ComponentTypeEnum.FLOAT,
                Count         = uv.Length,
                Type          = Types.Accessor.TypeEnum.Vec2,
            };

            return(Types.GltfExtensions.AddAccessor(Gltf, accessor));
        }
Beispiel #8
0
        int ExportJoints(Vec4 <int>[] joints)
        {
            // VEC4! | UNSIGNED_BYTE
            //       | UNSIGNED_SHORT!
            byte[] buffer = PrimitiveExporter.Marshal(
                joints
                .Select(v => new Vec4 <ushort>((ushort)v.x, (ushort)v.y, (ushort)v.z, (ushort)v.w))
                .ToArray()
                );
            var viewIndex = BufferBuilder.AddView(new ArraySegment <byte>(buffer));

            var accessor = new Types.Accessor
            {
                BufferView    = viewIndex,
                ByteOffset    = 0,
                ComponentType = Types.Accessor.ComponentTypeEnum.UNSIGNED_SHORT,
                Count         = joints.Length,
                Type          = Types.Accessor.TypeEnum.Vec4,
            };

            return(Types.GltfExtensions.AddAccessor(Gltf, accessor));
        }