Ticket #2692: TerrainRenderer.cpp.patch

File TerrainRenderer.cpp.patch, 2.7 KB (added by Vladislav Belov, 8 years ago)
  • source/renderer/TerrainRenderer.cpp

     
    579579    std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup];
    580580
    581581    CBoundingBoxAligned scissor;
     582    CVector4D v[8];
    582583    for (size_t i = 0; i < visiblePatches.size(); ++i)
    583584    {
    584585        CPatchRData* data = visiblePatches[i];
     
    586587        if (waterBounds.IsEmpty())
    587588            continue;
    588589
    589         CVector4D v1 = viewproj.Transform(CVector4D(waterBounds[0].X, waterBounds[1].Y, waterBounds[0].Z, 1.0f));
    590         CVector4D v2 = viewproj.Transform(CVector4D(waterBounds[1].X, waterBounds[1].Y, waterBounds[0].Z, 1.0f));
    591         CVector4D v3 = viewproj.Transform(CVector4D(waterBounds[0].X, waterBounds[1].Y, waterBounds[1].Z, 1.0f));
    592         CVector4D v4 = viewproj.Transform(CVector4D(waterBounds[1].X, waterBounds[1].Y, waterBounds[1].Z, 1.0f));
    593         CBoundingBoxAligned screenBounds;
    594         #define ADDBOUND(v1, v2, v3, v4) \
    595             if (v1.Z >= -v1.W) \
    596                 screenBounds += CVector3D(v1.X, v1.Y, v1.Z) * (1.0f / v1.W); \
    597             else \
    598             { \
    599                 float t = v1.Z + v1.W; \
    600                 if (v2.Z > -v2.W) \
    601                 { \
    602                     CVector4D c2 = v1 + (v2 - v1) * (t / (t - (v2.Z + v2.W))); \
    603                     screenBounds += CVector3D(c2.X, c2.Y, c2.Z) * (1.0f / c2.W); \
    604                 } \
    605                 if (v3.Z > -v3.W) \
    606                 { \
    607                     CVector4D c3 = v1 + (v3 - v1) * (t / (t - (v3.Z + v3.W))); \
    608                     screenBounds += CVector3D(c3.X, c3.Y, c3.Z) * (1.0f / c3.W); \
    609                 } \
    610                 if (v4.Z > -v4.W) \
    611                 { \
    612                     CVector4D c4 = v1 + (v4 - v1) * (t / (t - (v4.Z + v4.W))); \
    613                     screenBounds += CVector3D(c4.X, c4.Y, c4.Z) * (1.0f / c4.W); \
    614                 } \
    615             }
    616         ADDBOUND(v1, v2, v3, v4);
    617         ADDBOUND(v2, v1, v3, v4);
    618         ADDBOUND(v3, v1, v2, v4);
    619         ADDBOUND(v4, v1, v2, v3);
    620         #undef ADDBOUND
    621         if (screenBounds[0].X >= 1.0f || screenBounds[1].X <= -1.0f || screenBounds[0].Y >= 1.0f || screenBounds[1].Y <= -1.0f)
     590        for (int it = 0; it < 8; ++it)
     591        {
     592            v[it] = CVector4D(waterBounds[it & 1].X, waterBounds[(it >> 1) & 1].Y, waterBounds[(it >> 2) & 1].Z, 1.0f);
     593            v[it] = viewproj.Transform(v[it]);
     594            v[it] /= v[it].W;
     595        }
     596
     597        CBoundingBoxAligned screenBounds(CVector3D(v[0].X, v[0].Y, v[0].Z), CVector3D(v[1].X, v[1].Y, v[1].Z));
     598        for (int it = 2; it < 8; ++it)
     599            screenBounds += CVector3D(v[it].X, v[it].Y, v[it].Z);
     600
     601        if (screenBounds[0].X >= 1.0f || screenBounds[1].X <= -1.0f ||
     602            screenBounds[0].Y >= 1.0f || screenBounds[1].Y <= -1.0f)
    622603            continue;
     604
    623605        scissor += screenBounds;
    624606    }
     607
    625608    return CBoundingBoxAligned(CVector3D(clamp(scissor[0].X, -1.0f, 1.0f), clamp(scissor[0].Y, -1.0f, 1.0f), -1.0f),
    626609                  CVector3D(clamp(scissor[1].X, -1.0f, 1.0f), clamp(scissor[1].Y, -1.0f, 1.0f), 1.0f));
    627610}