Beispiel #1
0
void WriteOBJ(MeshData const& meshData, std::ostream* stream, IImportExportCallbacks* callbacks)
{
    auto posStream = meshData.GetVertexStream(ElementType::Position);
    auto uvStream = meshData.GetVertexStream(ElementType::TextureUV);
    auto normalStream = meshData.GetVertexStream(ElementType::Normal);
    auto indexData = meshData.GetRawIndexData();
    size_t indexCount = meshData.GetIndexCount();
    
    // streams must all have same size
    DebugAssert(posStream);
    DebugAssert(uvStream==nullptr || uvStream->Count == posStream->Count);
    DebugAssert(normalStream==nullptr || normalStream->Count == posStream->Count);

    // index buffer assumed to be triangles
    DebugAssert(indexCount % 3 == 0);

    struct Vec3
    {
        float x,y,z;
    };
    struct Vec2
    {
        float x,y;
    };

    size_t totalLines =
        posStream->Count +
        (uvStream ? uvStream->Count : 0) + 
        (normalStream ? normalStream->Count : 0) + 
        indexCount / 3;
    size_t numLines = 0;

    for (size_t i = 0; i < posStream->Count; i++)
    {
        HANDLE_PROGRESS;

        Vec3 v = posStream->GetElement<Vec3>(i);
        (*stream) << "v " << v.x << " " << v.y << " " << v.z << std::endl;
    }

    if( uvStream )
    {
        for (size_t i = 0; i < uvStream->Count; i++)
        {
            HANDLE_PROGRESS;

            Vec2 v = uvStream->GetElement<Vec2>(i);
            (*stream) << "vt " << v.x << " " << v.y << std::endl;
        }
    }

    if( normalStream )
    {
        for (size_t i = 0; i < normalStream->Count; i++)
        {
            HANDLE_PROGRESS;

            Vec3 v = normalStream->GetElement<Vec3>(i);
            (*stream) << "vn " << v.x << " " << v.y << " " << v.z << std::endl;
        }
    }

    for (size_t i = 0; i < indexCount; i += 3)
    {
        HANDLE_PROGRESS;

        (*stream) << "f ";
        WriteSlashedIndex(stream, indexData[i], uvStream != nullptr, normalStream != nullptr, false );
        WriteSlashedIndex(stream, indexData[i+1], uvStream != nullptr, normalStream != nullptr, false );
        WriteSlashedIndex(stream, indexData[i+2], uvStream != nullptr, normalStream != nullptr, true );
    }
}