public Memory.IEncodedArray <Vector3> AsVector3Array() { if (!_Sparse.HasValue) { return(_MemoryAccessor.AsVector3Array()); } return(MemoryAccessor.CreateVector3SparseArray(_MemoryAccessor, _Sparse.Value.Key, _Sparse.Value.Value)); }
public static MemoryAccessor CreateVertexMemoryAccessors <TVertex>(this IReadOnlyList <TVertex> vertices, string attributeName) 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); var isMorphTangent = attributeName == "MORPHTANGENT"; if (isMorphTangent) { attributeName = "TANGENT"; } var attribute = attributes.FirstOrDefault(item => item.Name == attributeName); if (attribute.Name == null) { return(null); } attribute.ByteOffset = 0; attribute.ByteStride = 0; if (isMorphTangent) { attribute.Dimensions = Schema2.DimensionType.VEC3; } // create a buffer var vbuffer = new ArraySegment <byte>(new Byte[attribute.PaddedByteLength * vertices.Count]); // fill the buffer with the vertex attributes. var accessor = new MemoryAccessor(vbuffer, attribute); if (isMorphTangent) { var columnFunc = _GetVertexBuilderAttributeFunc("MORPHTANGENT"); accessor.AsVector3Array().Fill(vertices._GetColumn <TVertex, Vector3>(columnFunc)); } else { accessor.FillAccessor(vertices); } return(accessor); }
private static void FillAccessor <TVertex>(this MemoryAccessor dstAccessor, IReadOnlyList <TVertex> srcVertices) where TVertex : IVertexBuilder { var columnFunc = _GetVertexBuilderAttributeFunc(dstAccessor.Attribute.Name); if (dstAccessor.Attribute.Dimensions == Schema2.DimensionType.SCALAR) { dstAccessor.AsScalarArray().Fill(srcVertices._GetColumn <TVertex, Single>(columnFunc)); } if (dstAccessor.Attribute.Dimensions == Schema2.DimensionType.VEC2) { dstAccessor.AsVector2Array().Fill(srcVertices._GetColumn <TVertex, Vector2>(columnFunc)); } if (dstAccessor.Attribute.Dimensions == Schema2.DimensionType.VEC3) { dstAccessor.AsVector3Array().Fill(srcVertices._GetColumn <TVertex, Vector3>(columnFunc)); } if (dstAccessor.Attribute.Dimensions == Schema2.DimensionType.VEC4) { dstAccessor.AsVector4Array().Fill(srcVertices._GetColumn <TVertex, Vector4>(columnFunc)); } }