// 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)); }
public int Export(Texture2D tex) { RenderTexture renderTex = RenderTexture.GetTemporary( tex.width, tex.height, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Linear); Graphics.Blit(tex, renderTex); RenderTexture previous = RenderTexture.active; RenderTexture.active = renderTex; Texture2D readableText = new Texture2D(tex.width, tex.height, TextureFormat.RGBA32, true, true); readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0); readableText.Apply(); RenderTexture.active = previous; RenderTexture.ReleaseTemporary(renderTex); var pngBytes = readableText.EncodeToPNG(); var viewIndex = BufferBuilder.AddView(new ArraySegment <byte>(pngBytes)); return(Types.GltfExtensions.AddImage(Gltf, new Types.Image { Name = tex.name, MimeType = Types.Image.MimeTypeEnum.ImagePng, BufferView = viewIndex, })); }
public void BuildTest() { var bufferBuilder = new BufferBuilder(); var view0 = new ArraySegment <byte>(new byte[] { 0x00, 0x01, 0x02 }); var view0Index = bufferBuilder.AddView(view0, 4, Types.BufferView.TargetEnum.ELEMENT_ARRAY_BUFFER); var view1 = new ArraySegment <byte>(new byte[] { 0x10, 0x11 }); var view1Index = bufferBuilder.AddView(view1); var view2 = new ArraySegment <byte>(new byte[] { 0x20, 0x21, 0x22, 0x23 }); var view2Index = bufferBuilder.AddView(view2); List <Types.BufferView> views; var bufferBytes = bufferBuilder.BuildBytes(out views); Assert.AreEqual(12, bufferBytes.Length); // Actual size is 5Bytes, but aligned to 4Bytes. Assert.That(bufferBytes, Is.EquivalentTo(new byte[] { 0x00, 0x01, 0x02, /* Align */ 0x00, 0x10, 0x11, /* Align */ 0x00, 0x00, 0x20, 0x21, 0x22, 0x23 })); Assert.AreEqual(3, views.Count); Assert.AreEqual(0, views[0].Buffer); Assert.AreEqual(0, views[0].ByteOffset); Assert.AreEqual(3, views[0].ByteLength); Assert.AreEqual(4, views[0].ByteStride); Assert.AreEqual(Types.BufferView.TargetEnum.ELEMENT_ARRAY_BUFFER, views[0].Target); Assert.AreEqual(0, views[1].Buffer); Assert.AreEqual(4, views[1].ByteOffset); Assert.AreEqual(2, views[1].ByteLength); Assert.AreEqual(null, views[1].ByteStride); Assert.AreEqual(null, views[1].Target); Assert.AreEqual(0, views[2].Buffer); Assert.AreEqual(8, views[2].ByteOffset); Assert.AreEqual(4, views[2].ByteLength); Assert.AreEqual(null, views[2].ByteStride); Assert.AreEqual(null, views[2].Target); }
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)); }