private static void ParseFromFile(ResourceFile file, UnsafeBufferWriter <Vertex> verticesBuffer, UnsafeBufferWriter <int> indicesBuffer) { using var stream = file.GetStream(); using var obj = ObjParser.ParseUnsafe(stream); var hasUV = !obj.UVIndices.IsEmpty; using var uvIndicesBuf = hasUV ? UnsafeRawArray <int> .Empty : new UnsafeRawArray <int>(obj.PositionIndices.Length, true); var uvs = hasUV ? obj.UVs : stackalloc Vector2[1] { Vector2.Zero }; var uvIndices = hasUV ? obj.UVIndices : uvIndicesBuf.AsSpan(); var hasNormal = !obj.NormalIndices.IsEmpty; if (hasNormal == false) { using var normalsBuf = new UnsafeBufferWriter <Vector3>(); var positions = obj.Positions; var posNormalIndices = obj.PositionIndices; var normals = MeshOperations.RecalculateNormal(positions, posNormalIndices, normalsBuf); MeshOperations.CreateInterleavedVertices(positions, posNormalIndices, normals, posNormalIndices, uvs, uvIndices, verticesBuffer, indicesBuffer); } else { MeshOperations.CreateInterleavedVertices(obj.Positions, obj.PositionIndices, obj.Normals, obj.NormalIndices, uvs, uvIndices, verticesBuffer, indicesBuffer); } }
public static (Vertex[] vertices, int[] indices) CreateInterleavedVertices( ReadOnlySpan <Vector3> positions, ReadOnlySpan <int> positionIndices, ReadOnlySpan <Vector3> normals, ReadOnlySpan <int> normalIndices, ReadOnlySpan <Vector2> uvs, ReadOnlySpan <int> uvIndices) { using var verticesBuffer = new UnsafeBufferWriter <Vertex>(); using var indicesBuffer = new UnsafeBufferWriter <int>(); var(vertices, indices) = CreateInterleavedVertices(positions, positionIndices, normals, normalIndices, uvs, uvIndices, verticesBuffer, indicesBuffer); return(vertices.ToArray(), indices.ToArray()); }
private static async UniTask Build(StateObject state, Model3D model, Model3DLoadMeshDelegate load) { var(file, ct) = state; var screen = model.GetValidScreen(); ct.ThrowIfCancellationRequested(); await UniTask.SwitchToThreadPool(); ct.ThrowIfCancellationRequested(); using var verticesBuffer = new UnsafeBufferWriter <Vertex>(); using var indicesBuffer = new UnsafeBufferWriter <int>(); ParseFromFile(file, verticesBuffer, indicesBuffer); await screen.TimingPoints.Update.Next(ct); load.Invoke(verticesBuffer.WrittenSpan, indicesBuffer.WrittenSpan); }