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) |