Skip to content

Commit 1d88b42

Browse files
committed
Continued work on Terrain rendering...
1 parent b0381eb commit 1d88b42

9 files changed

Lines changed: 131 additions & 9 deletions

File tree

MP-APS/.vs/MP-APS/v15/.suo

0 Bytes
Binary file not shown.

MP-APS/.vs/MP-APS/v15/Browse.VC.db

4 KB
Binary file not shown.

MP-APS/ShaderViewer.vcxproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@
285285
<ClCompile Include="SceneBase.cpp" />
286286
<ClCompile Include="Skybox.cpp" />
287287
<ClCompile Include="Terrain\Terrain.cpp" />
288+
<ClCompile Include="Terrain\TerrainRenderer.cpp" />
288289
<ClCompile Include="Timer.cpp" />
289290
<ClCompile Include="ViewFrustum.cpp" />
290291
</ItemGroup>
@@ -312,7 +313,7 @@
312313
<ClInclude Include="ResourceManager.h" />
313314
<ClInclude Include="SceneBase.h" />
314315
<ClInclude Include="Skybox.h" />
315-
<ClInclude Include="Terrain\Terrain.h" />
316+
<ClInclude Include="Terrain\TerrainRenderer.h" />
316317
<ClInclude Include="Terrain\TerrainNode.h" />
317318
<ClInclude Include="Timer.h" />
318319
<ClInclude Include="ViewFrustum.h" />

MP-APS/ShaderViewer.vcxproj.filters

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@
8989
<ClCompile Include="AI\AISystem.cpp">
9090
<Filter>AI</Filter>
9191
</ClCompile>
92+
<ClCompile Include="Terrain\TerrainRenderer.cpp">
93+
<Filter>Source Files</Filter>
94+
</ClCompile>
9295
</ItemGroup>
9396
<ItemGroup>
9497
<ClInclude Include="3rdParty\stb\stb_image.h">
@@ -163,15 +166,15 @@
163166
<ClInclude Include="Terrain\TerrainNode.h">
164167
<Filter>Terrain</Filter>
165168
</ClInclude>
166-
<ClInclude Include="Terrain\Terrain.h">
167-
<Filter>Terrain</Filter>
168-
</ClInclude>
169169
<ClInclude Include="Core\GUISystem.h">
170170
<Filter>Core</Filter>
171171
</ClInclude>
172172
<ClInclude Include="AI\AISystem.h">
173173
<Filter>AI</Filter>
174174
</ClInclude>
175+
<ClInclude Include="Terrain\TerrainRenderer.h">
176+
<Filter>Terrain</Filter>
177+
</ClInclude>
175178
</ItemGroup>
176179
<ItemGroup>
177180
<None Include="..\README.md" />

MP-APS/Terrain/Terrain.h

Lines changed: 0 additions & 3 deletions
This file was deleted.

MP-APS/Terrain/TerrainNode.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include <glm/vec3.hpp>
44

5-
#define TERRAIN_SUBDUV_CUTTOF 100
5+
#define TERRAIN_SUBDIV_CUTTOF 100
66

77
// http://victorbush.com/2015/01/tessellated-terrain/
88

MP-APS/Terrain/TerrainRenderer.cpp

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#include "TerrainRenderer.h"
2+
#include "TerrainNode.h"
3+
4+
#include <cstring>
5+
6+
/***********************************************************************************/
7+
void TerrainRenderer::Init() {
8+
9+
m_terrainTree = new TerrainNode[m_MaxTerrainNodes];
10+
clearTerrainTree();
11+
}
12+
13+
/***********************************************************************************/
14+
void TerrainRenderer::Render() {
15+
}
16+
17+
/***********************************************************************************/
18+
void TerrainRenderer::Shutdown() {
19+
delete[] m_terrainTree;
20+
21+
m_terrainTree = nullptr;
22+
m_terrainTreeTail = nullptr;
23+
}
24+
25+
/***********************************************************************************/
26+
void TerrainRenderer::clearTerrainTree() {
27+
m_terrainTreeTail = m_terrainTree;
28+
std::memset(m_terrainTree, 0, m_MaxTerrainNodes * sizeof(TerrainNode));
29+
m_numTerrainNodes = 0;
30+
}
31+
32+
/***********************************************************************************/
33+
void TerrainRenderer::calcTesselationScale(TerrainNode* node) {
34+
35+
// Positive Z (north)
36+
TerrainNode* temp = findNode(m_terrainTree, node->Origin[0], node->Origin[2] + 1 + node->Width / 2.0f);
37+
if (temp->Width > node->Width) {
38+
node->TScalePosZ = 2.0f;
39+
}
40+
41+
// Positive X (east)
42+
temp = findNode(m_terrainTree, node->Origin[0] + 1 + node->Width / 2.0f, node->Origin[2]);
43+
if (temp->Width > node->Width) {
44+
node->TScalePosX = 2.0f;
45+
}
46+
47+
// Negative Z (south)
48+
temp = findNode(m_terrainTree, node->Origin[0], node->Origin[2] - 1 - node->Width / 2.0f);
49+
if (temp->Width > node->Width) {
50+
node->TScaleNegZ = 2.0f;
51+
}
52+
53+
// Negative X (west)
54+
temp = findNode(m_terrainTree, node->Origin[0] - 1 - node->Width / 2.0f, node->Origin[2]);
55+
if (temp->Width > node->Width) {
56+
node->TScaleNegX = 2.0f;
57+
}
58+
}
59+
60+
/***********************************************************************************/
61+
TerrainNode* TerrainRenderer::findNode(TerrainNode* node, const float x, const float z) {
62+
63+
if (node->Origin[0] == x && node->Origin[2] == z) {
64+
return node;
65+
}
66+
67+
if (node->Child1 == nullptr && node->Child2 == nullptr && node->Child3 == nullptr && node->Child4 == nullptr) {
68+
return node;
69+
}
70+
71+
if (node->Origin[0] >= x && node->Origin[2] >= z && node->Child1) {
72+
return findNode(node->Child1, x, z);
73+
}
74+
75+
if (node->Origin[0] <= x && node->Origin[2] >= z && node->Child2) {
76+
return findNode(node->Child2, x, z);
77+
}
78+
79+
if (node->Origin[0] <= x && node->Origin[2] <= z && node->Child3) {
80+
return findNode(node->Child3, x, z);
81+
}
82+
83+
if (node->Origin[0] >= x && node->Origin[2] <= z && node->Child4) {
84+
return findNode(node->Child4, x, z);
85+
}
86+
87+
return node;
88+
}

MP-APS/Terrain/TerrainRenderer.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma once
2+
3+
#include <cstddef>
4+
5+
//http://victorbush.com/2015/01/tessellated-terrain/
6+
7+
/***********************************************************************************/
8+
// Forward Declarations
9+
struct TerrainNode;
10+
11+
/***********************************************************************************/
12+
class TerrainRenderer {
13+
14+
public:
15+
TerrainRenderer() = default;
16+
17+
void Init();
18+
void Render();
19+
void Shutdown();
20+
21+
private:
22+
void clearTerrainTree();
23+
// Calculate the tessellation scale factor for a node depending on the neighboring patches
24+
void calcTesselationScale(TerrainNode* node);
25+
// Search for a node in the tree given xz coordinate
26+
TerrainNode* findNode(TerrainNode* node, const float x, const float z);
27+
28+
TerrainNode* m_terrainTree = nullptr;
29+
TerrainNode* m_terrainTreeTail = nullptr;
30+
31+
const std::size_t m_MaxTerrainNodes = 500;
32+
std::size_t m_numTerrainNodes = 0;
33+
};

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Bloom:
4040
* Depth-buffer optimization ([https://outerra.blogspot.ca/2012/11/maximizing-depth-buffer-range-and.html](https://outerra.blogspot.ca/2012/11/maximizing-depth-buffer-range-and.html)).
4141

4242
## Roadmap
43-
* Shadow volumes ([http://www.alexandre-pestana.com/volumetric-lights/](http://www.alexandre-pestana.com/volumetric-lights/)).
43+
* Shadow volumes ([http://www.alexandre-pestana.com/volumetric-lights/](http://www.alexandre-pestana.com/volumetric-lights/), [https://www.slideshare.net/BenjaminGlatzel/volumetric-lighting-for-many-lights-in-lords-of-the-fallen](https://www.slideshare.net/BenjaminGlatzel/volumetric-lighting-for-many-lights-in-lords-of-the-fallen)).
4444
* Per-material array textures:
4545
* ([https://www.gamedev.net/forums/topic/662654-best-practise-texture-atlas-38-vbo/?do=findComment&comment=5191703](https://www.gamedev.net/forums/topic/662654-best-practise-texture-atlas-38-vbo/?do=findComment&comment=5191703))
4646
* ([https://www.khronos.org/opengl/wiki/Array_Texture](https://www.khronos.org/opengl/wiki/Array_Texture))

0 commit comments

Comments
 (0)