Пример #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));
        }
Пример #2
0
        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,
            }));
        }
Пример #3
0
        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);
        }
Пример #4
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);
        }
Пример #5
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);
        }
Пример #6
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));
        }
Пример #7
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));
        }
Пример #8
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));
        }
Пример #9
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));
        }
Пример #10
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));
        }