Example #1
0
        internal MemoryAccessor _GetMemoryAccessor()
        {
            var view = SourceBufferView;
            var info = new MemoryAccessInfo(null, ByteOffset, Count, view.ByteStride, Dimensions, Encoding, Normalized);

            return(new MemoryAccessor(view.Content, info));
        }
Example #2
0
        public static MemoryAccessor[] CreateVertexMemoryAccessors <TVertex>(this IReadOnlyList <TVertex> vertices, Schema2.EncodingType jointEncoding)
            where TVertex : IVertexBuilder
        {
            if (vertices == null || vertices.Count == 0)
            {
                return(null);
            }

            // determine the vertex attributes from the first vertex.
            var attributes = GetVertexAttributes(vertices[0], vertices.Count, jointEncoding);

            // create a buffer
            int byteStride = attributes[0].ByteStride;
            var vbuffer    = new ArraySegment <byte>(new Byte[byteStride * vertices.Count]);

            // fill the buffer with the vertex attributes.
            var accessors = MemoryAccessInfo
                            .Slice(attributes, 0, vertices.Count)
                            .Select(item => new MemoryAccessor(vbuffer, item))
                            .ToArray();

            foreach (var accessor in accessors)
            {
                accessor.FillAccessor(vertices);
            }

            return(accessors);
        }
Example #3
0
        internal MemoryAccessor _GetMemoryAccessor(string name = null)
        {
            var view = SourceBufferView;
            var info = new MemoryAccessInfo(name, ByteOffset, Count, view.ByteStride, Format);

            return(new MemoryAccessor(view.Content, info));
        }
        public static MemoryAccessInfo[] GetVertexAttributes(this IVertexBuilder firstVertex, int vertexCount, PackedEncoding vertexEncoding)
        {
            var tvg = firstVertex.GetGeometry().GetType();
            var tvm = firstVertex.GetMaterial().GetType();
            var tvs = firstVertex.GetSkinning().GetType();

            var attributes = new List <MemoryAccessInfo>();

            foreach (var finfo in tvg.GetFields())
            {
                var attribute = _GetMemoryAccessInfo(finfo);
                if (attribute.HasValue)
                {
                    attributes.Add(attribute.Value);
                }
            }

            foreach (var finfo in tvm.GetFields())
            {
                var attribute = _GetMemoryAccessInfo(finfo);
                if (attribute.HasValue)
                {
                    attributes.Add(attribute.Value);
                }
            }

            foreach (var finfo in tvs.GetFields())
            {
                var attribute = _GetMemoryAccessInfo(finfo);
                if (attribute.HasValue)
                {
                    var a = attribute.Value;
                    if (a.Name.StartsWith("JOINTS_", StringComparison.OrdinalIgnoreCase))
                    {
                        a.Encoding = vertexEncoding.JointsEncoding.Value;
                    }
                    if (a.Name.StartsWith("WEIGHTS_", StringComparison.OrdinalIgnoreCase))
                    {
                        a.Encoding = vertexEncoding.WeightsEncoding.Value;
                        if (a.Encoding != ENCODING.FLOAT)
                        {
                            a.Normalized = true;
                        }
                    }

                    attributes.Add(a);
                }
            }

            var array = attributes.ToArray();

            MemoryAccessInfo.SetInterleavedInfo(array, 0, vertexCount);

            return(array);
        }
Example #5
0
        public static IndicesAccessor CreateAccessors(int itemsCount)
        {
            var info = MemoryAccessInfo.CreateDefaultElement("INDEX");

            info.ItemsCount = itemsCount;

            var data = new ArraySegment <Byte>(new Byte[info.ByteLength * itemsCount]);

            var accessor = new IndicesAccessor(info);

            accessor._MemoryAccessor.SetIndexDataSource(data, 0, itemsCount);

            return(accessor);
        }
Example #6
0
        public static MemoryAccessInfo[] GetVertexAttributes(this IVertexBuilder firstVertex, int vertexCount, Schema2.EncodingType jointEncoding)
        {
            var tvg = firstVertex.GetGeometry().GetType();
            var tvm = firstVertex.GetMaterial().GetType();
            var tvs = firstVertex.GetSkinning().GetType();

            var attributes = new List <MemoryAccessInfo>();

            foreach (var finfo in tvg.GetFields())
            {
                var attribute = _GetMemoryAccessInfo(finfo);
                if (attribute.HasValue)
                {
                    attributes.Add(attribute.Value);
                }
            }

            foreach (var finfo in tvm.GetFields())
            {
                var attribute = _GetMemoryAccessInfo(finfo);
                if (attribute.HasValue)
                {
                    attributes.Add(attribute.Value);
                }
            }

            foreach (var finfo in tvs.GetFields())
            {
                var attribute = _GetMemoryAccessInfo(finfo);
                if (attribute.HasValue)
                {
                    var a = attribute.Value;
                    if (a.Name.StartsWith("JOINTS_", StringComparison.OrdinalIgnoreCase))
                    {
                        a.Encoding = jointEncoding;
                    }

                    attributes.Add(a);
                }
            }

            var array = attributes.ToArray();

            MemoryAccessInfo.SetInterleavedInfo(array, 0, vertexCount);

            return(array);
        }
Example #7
0
        public static MemoryAccessor CreateIndexMemoryAccessor(this IReadOnlyList <Int32> indices, Schema2.EncodingType encoding)
        {
            if (indices == null || indices.Count == 0)
            {
                return(null);
            }

            var attribute = new MemoryAccessInfo("INDEX", 0, indices.Count, 0, Schema2.DimensionType.SCALAR, encoding);

            // create buffer
            var ibytes  = new Byte[encoding.ByteLength() * indices.Count];
            var ibuffer = new ArraySegment <byte>(ibytes);

            // fill the buffer with indices.
            var accessor = new MemoryAccessor(ibuffer, attribute.Slice(0, indices.Count));

            accessor.AsIntegerArray().Fill(indices);

            return(accessor);
        }
Example #8
0
        public static MemoryAccessInfo[] GetVertexAttributes(this IVertexBuilder firstVertex, int vertexCount)
        {
            var tvg = firstVertex.GetGeometry().GetType();
            var tvm = firstVertex.GetMaterial().GetType();
            var tvs = firstVertex.GetSkinning().GetType();

            var attributes = new List <MemoryAccessInfo>();

            foreach (var finfo in tvg.GetFields())
            {
                var attribute = _GetMemoryAccessInfo(finfo);
                if (attribute.HasValue)
                {
                    attributes.Add(attribute.Value);
                }
            }

            foreach (var finfo in tvm.GetFields())
            {
                var attribute = _GetMemoryAccessInfo(finfo);
                if (attribute.HasValue)
                {
                    attributes.Add(attribute.Value);
                }
            }

            foreach (var finfo in tvs.GetFields())
            {
                var attribute = _GetMemoryAccessInfo(finfo);
                if (attribute.HasValue)
                {
                    attributes.Add(attribute.Value);
                }
            }

            var array = attributes.ToArray();

            MemoryAccessInfo.SetInterleavedInfo(array, 0, vertexCount);

            return(array);
        }
Example #9
0
        public static VertexAccessor[] CreateAccessors(int itemsCount, params string[] attributes)
        {
            var accessors = MemoryAccessInfo
                            .Create(attributes)
                            .Select(item => new VertexAccessor(item))
                            .ToArray();

            int byteOffset = 0;
            var byteStride = accessors.Sum(item => item._MemoryAccessor.Attribute.ByteLength);

            var data = new ArraySegment <Byte>(new Byte[byteStride * itemsCount]);

            for (int i = 0; i < accessors.Length; ++i)
            {
                var a = accessors[i];

                a._MemoryAccessor.SetVertexDataSource(data, byteOffset, itemsCount, byteStride);

                byteOffset += a._MemoryAccessor.Attribute.ByteLength;
            }

            return(accessors);
        }
Example #10
0
 public VertexAccessor(MemoryAccessInfo info)
 {
     _MemoryAccessor = new MemoryAccessor(info);
 }
Example #11
0
 public IndicesAccessor(MemoryAccessInfo info)
 {
     _MemoryAccessor = new MemoryAccessor(info);
 }