1 | Index: 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 | }
|
---|