Ticket #2692: potential fix.diff

File potential fix.diff, 3.2 KB (added by pendingchaos, 9 years ago)

A potential fix for the red water bug (c comment 4 details)

Line 
1Index: source/renderer/TerrainRenderer.cpp
2===================================================================
3--- source/renderer/TerrainRenderer.cpp (revision 16411)
4+++ source/renderer/TerrainRenderer.cpp (working copy)
5@@ -575,51 +575,53 @@
6 CBoundingBoxAligned TerrainRenderer::ScissorWater(int cullGroup, const CMatrix3D &viewproj)
7 {
8 std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup];
9
10- CBoundingBoxAligned scissor;
11+ CBoundingBoxAligned scissor(CVector3D(0.0, 0.0, 0.0), CVector3D(0.0, 0.0, 0.0));
12 for (size_t i = 0; i < visiblePatches.size(); ++i)
13 {
14 CPatchRData* data = visiblePatches[i];
15 const CBoundingBoxAligned& waterBounds = data->GetWaterBounds();
16 if (waterBounds.IsEmpty())
17 continue;
18
19- CVector4D v1 = viewproj.Transform(CVector4D(waterBounds[0].X, waterBounds[1].Y, waterBounds[0].Z, 1.0f));
20- CVector4D v2 = viewproj.Transform(CVector4D(waterBounds[1].X, waterBounds[1].Y, waterBounds[0].Z, 1.0f));
21- CVector4D v3 = viewproj.Transform(CVector4D(waterBounds[0].X, waterBounds[1].Y, waterBounds[1].Z, 1.0f));
22- CVector4D v4 = viewproj.Transform(CVector4D(waterBounds[1].X, waterBounds[1].Y, waterBounds[1].Z, 1.0f));
23- CBoundingBoxAligned screenBounds;
24+ CVector4D v1 = viewproj.Transform(CVector4D(waterBounds[0].X, waterBounds[0].Y, waterBounds[0].Z, 1.0f));
25+ CVector4D v2 = viewproj.Transform(CVector4D(waterBounds[1].X, waterBounds[0].Y, waterBounds[0].Z, 1.0f));
26+ CVector4D v3 = viewproj.Transform(CVector4D(waterBounds[0].X, waterBounds[0].Y, waterBounds[1].Z, 1.0f));
27+ CVector4D v4 = viewproj.Transform(CVector4D(waterBounds[1].X, waterBounds[0].Y, waterBounds[1].Z, 1.0f));
28+ CBoundingBoxAligned screenBounds(CVector3D(0.0, 0.0, 0.0), CVector3D(0.0, 0.0, 0.0));
29 #define ADDBOUND(v1, v2, v3, v4) \
30 if (v1.Z >= -v1.W) \
31 screenBounds += CVector3D(v1.X, v1.Y, v1.Z) * (1.0f / v1.W); \
32 else \
33 { \
34 float t = v1.Z + v1.W; \
35 if (v2.Z > -v2.W) \
36 { \
37 CVector4D c2 = v1 + (v2 - v1) * (t / (t - (v2.Z + v2.W))); \
38 screenBounds += CVector3D(c2.X, c2.Y, c2.Z) * (1.0f / c2.W); \
39 } \
40 if (v3.Z > -v3.W) \
41 { \
42 CVector4D c3 = v1 + (v3 - v1) * (t / (t - (v3.Z + v3.W))); \
43 screenBounds += CVector3D(c3.X, c3.Y, c3.Z) * (1.0f / c3.W); \
44 } \
45 if (v4.Z > -v4.W) \
46 { \
47 CVector4D c4 = v1 + (v4 - v1) * (t / (t - (v4.Z + v4.W))); \
48 screenBounds += CVector3D(c4.X, c4.Y, c4.Z) * (1.0f / c4.W); \
49 } \
50 }
51 ADDBOUND(v1, v2, v3, v4);
52 ADDBOUND(v2, v1, v3, v4);
53 ADDBOUND(v3, v1, v2, v4);
54 ADDBOUND(v4, v1, v2, v3);
55 #undef ADDBOUND
56
57 if (screenBounds[0].X >= 1.0f || screenBounds[1].X <= -1.0f || screenBounds[0].Y >= 1.0f || screenBounds[1].Y <= -1.0f)
58 continue;
59 scissor += screenBounds;
60 }
61
62 return CBoundingBoxAligned(CVector3D(clamp(scissor[0].X, -1.0f, 1.0f), clamp(scissor[0].Y, -1.0f, 1.0f), -1.0f),
63 CVector3D(clamp(scissor[1].X, -1.0f, 1.0f), clamp(scissor[1].Y, -1.0f, 1.0f), 1.0f));
64 }