// 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)); }
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); }
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); }
// 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)); }
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)); }
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)); }
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)); }
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)); }