示例#1
0
        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);
            }
        }
示例#2
0
 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());
 }
示例#3
0
        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);
        }