Exemplo n.º 1
0
        private static Gltf.Accessor getAccessor(Gltf.Gltf gltfModel, Gltf.Mesh gltfMesh, string key)
        {
            if (gltfMesh.Primitives[0].Attributes.TryGetValue(key, out var index))
            {
                return(gltfModel.Accessors[index]);
            }

            return(null);
        }
Exemplo n.º 2
0
        public static ushort[] readIndices(string rootPath, Gltf.Gltf model, Gltf.Mesh mesh)
        {
            var accessor = model.Accessors[(int)mesh.Primitives[0].Indices];
            var buffer   = readBuffer(rootPath, model, accessor);

            var indexArray = new ushort[accessor.Count];

            System.Buffer.BlockCopy(buffer, 0, indexArray, 0, buffer.Length);

            return(indexArray);
        }
Exemplo n.º 3
0
        private static byte[] readBuffer(string rootPath, Gltf.Gltf model, Gltf.Accessor accessor)
        {
            var bufferView = model.BufferViews[(int)accessor.BufferView];
            var buffer     = model.Buffers[bufferView.Buffer];

            using (var fs = new FileStream(Path.Combine(rootPath, buffer.Uri), FileMode.Open))
                using (var reader = new BinaryReader(fs))
                {
                    var byteArray = new byte[bufferView.ByteLength];

                    reader.BaseStream.Seek(bufferView.ByteOffset, SeekOrigin.Begin);
                    return(reader.ReadBytes(bufferView.ByteLength));
                }
        }
Exemplo n.º 4
0
        public Mesh(string rootPath, Gltf.Gltf model, Gltf.Mesh mesh)
        {
            var vertices  = BufferReader.readVec3(rootPath, model, mesh, "POSITION");
            var normals   = BufferReader.readVec3(rootPath, model, mesh, "NORMAL");
            var tangents  = BufferReader.readVec4(rootPath, model, mesh, "TANGENT");
            var texCoords = BufferReader.readVec2(rootPath, model, mesh, "TEXCOORD_0");
            var indices   = BufferReader.readIndices(rootPath, model, mesh);

            IndexCount = indices.Length;
            Material   = new Material(rootPath, model, mesh);

            VaoId = GL.GenVertexArray();

            GL.BindVertexArray(VaoId);

            VertexBuffer = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBuffer);
            GL.BufferData <Vector3>(BufferTarget.ArrayBuffer, vertices.Length * Vector3.SizeInBytes, vertices, BufferUsageHint.StaticDraw);
            GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vector3.SizeInBytes, 0);

            TexCoordBuffer = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ArrayBuffer, TexCoordBuffer);
            GL.BufferData <Vector2>(BufferTarget.ArrayBuffer, texCoords.Length * Vector2.SizeInBytes, texCoords, BufferUsageHint.StaticDraw);
            GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, Vector2.SizeInBytes, 0);

            if (normals.Length > 0)
            {
                NormalBuffer = GL.GenBuffer();
                GL.BindBuffer(BufferTarget.ArrayBuffer, NormalBuffer);
                GL.BufferData <Vector3>(BufferTarget.ArrayBuffer, normals.Length * Vector3.SizeInBytes, normals, BufferUsageHint.StaticDraw);
                GL.VertexAttribPointer(2, 3, VertexAttribPointerType.Float, false, Vector3.SizeInBytes, 0);
            }

            if (tangents.Length > 0)
            {
                TangentBuffer = GL.GenBuffer();
                GL.BindBuffer(BufferTarget.ArrayBuffer, TangentBuffer);
                GL.BufferData <Vector4>(BufferTarget.ArrayBuffer, tangents.Length * Vector4.SizeInBytes, tangents, BufferUsageHint.StaticDraw);
                GL.VertexAttribPointer(3, 4, VertexAttribPointerType.Float, false, Vector4.SizeInBytes, 0);
            }

            IndexBuffer = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, IndexBuffer);
            GL.BufferData <ushort>(BufferTarget.ElementArrayBuffer, IndexCount * sizeof(ushort), indices, BufferUsageHint.StaticDraw);
            GL.BindVertexArray(0);
        }
Exemplo n.º 5
0
        public static Vector2[] readVec2(string rootPath, Gltf.Gltf model, Gltf.Mesh mesh, string key)
        {
            var result   = new List <Vector2>();
            var accessor = getAccessor(model, mesh, key);

            if (accessor == null)
            {
                return new Vector2[] { }
            }
            ;

            var buffer     = readBuffer(rootPath, model, accessor);
            var floatArray = new float[accessor.Count * 2];

            System.Buffer.BlockCopy(buffer, 0, floatArray, 0, buffer.Length);

            for (var i = 0; i < accessor.Count * 2; i += 2)
            {
                result.Add(new Vector2(floatArray[i], floatArray[i + 1]));
            }

            return(result.ToArray());
        }
Exemplo n.º 6
0
        public Material(string rootPath, Gltf.Gltf model, Gltf.Mesh mesh)
        {
            var materialId = mesh.Primitives[0].Material;

            if (materialId == null)
            {
                throw new Exception("Mesh does not have a material!");
            }

            var material = model.Materials[(int)materialId];


            var baseColorTextureIndex = material.PbrMetallicRoughness.BaseColorTexture.Index;
            var baseColorTextureName  = model.Images[(int)model.Textures[baseColorTextureIndex].Source].Uri;

            BaseColorTexture = new Texture();
            BaseColorTexture.LoadTexture(Path.Combine(rootPath, baseColorTextureName), true);

            if (material.NormalTexture != null)
            {
                var normalTextureIndex = material.NormalTexture.Index;
                var normalTextureName  = model.Images[(int)model.Textures[normalTextureIndex].Source].Uri;
                NormalTexture = new Texture();
                NormalTexture.LoadTexture(Path.Combine(rootPath, normalTextureName), true);
            }

            if (material.PbrMetallicRoughness.MetallicRoughnessTexture != null)
            {
                var roughnessTextureIndex = material.NormalTexture.Index;
                var roughnessTextureName  = model.Images[(int)model.Textures[roughnessTextureIndex].Source].Uri;
                RoughnessTexture = new Texture();
                RoughnessTexture.LoadTexture(Path.Combine(rootPath, roughnessTextureName), true);
            }

            DoubleSided = material.DoubleSided;
            Roughness   = material.PbrMetallicRoughness.RoughnessFactor;
        }