public bool GetNormals(out Vector3[] normals, int usageIndex) { normals = null; VertexLayout vertexLayout = GetVertexLayout(0); if (vertexLayout == null) { return(false); } VertexLayout.Entry.DataTypes dataType; int streamOffset; int streamIndex; //todo: if normal does not exist, we can determine it from the tangent and binormal, if it exists bool normalExists = vertexLayout.GetEntryInfo(VertexLayout.Entry.DataUsages.Normal, usageIndex, out dataType, out streamIndex, out streamOffset); if (!normalExists) { return(false); } normals = new Vector3[VertexCount]; Mesh.VertexStream vertexStream = VertexStreams[streamIndex]; switch (dataType) { case VertexLayout.Entry.DataTypes.Float3: { vertexStream.ReadFloat3s(normals, streamOffset, 0, (int)VertexCount); } break; case VertexLayout.Entry.DataTypes.ubyte4n: { vertexStream.ReadUByte4Ns(normals, streamOffset, 0, (int)VertexCount); } break; default: break; } return(true); }
public bool GetPositions(out List <Vector3> positions, int usageIndex) { positions = null; VertexLayout vertexLayout = GetVertexLayout(0); if (vertexLayout == null) { return(false); } VertexLayout.Entry.DataTypes dataType; int streamOffset; int streamIndex; bool positionExists = vertexLayout.GetEntryInfo(VertexLayout.Entry.DataUsages.Position, usageIndex, out dataType, out streamIndex, out streamOffset); if (!positionExists) { return(false); } positions = new List <Vector3>((int)VertexCount); Mesh.VertexStream vertexStream = VertexStreams[streamIndex]; switch (dataType) { case VertexLayout.Entry.DataTypes.Float3: { vertexStream.ReadFloat3s(positions, streamOffset, 0, (int)VertexCount); } break; default: break; } return(true); }