​​Chap 14/100: Terrain QUAD + FRUSTRUM (optimization)​​​
​
What I will Learn here?:
​On this tutorial ​​we will see how to Optimize the data sent to Vertex Shader, in order to avoid sending off-screen vertices to the pipeline.
We will also see how to detect collisions with the terrain surface and we will also add gravity to the terrain!
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​Note:
All this new feactures and look at the speed, increased due to the use of quad tree to avoid sending vertices outside of our camera view to the GPU.
​
My old computer with 4 years old with:
- Intel-Core2-Duo-Processor-E8400-(6M-Cache-3_00-GHz-1333-MHz-FSB)
- GTX 560 ti
Can do +-2000 fps overclocked at full screen 1920x1080
Try in your computer Maximize the Window then ALT ENTER ...
​
​Let's check our current main source tree, except the LIBs:
​
Added source on White:
​
​│ Applicationclass.cpp
│ Applicationclass.h
│ counter.h
│ main.cpp
│ main.h
│
├───camera
│ cameraClass.cpp
│ cameraClass.h
│ frustumClass.cpp
│ frustumClass.h​
│ lightClass.cpp
│ lightClass.h
│ positionClass.cpp
│ positionClass.h
│
├───game
│ playerClass.cpp
│ playerClass.h​
│​
├───graphics
│ spriteClass.cpp
│ spriteClass.h​
│ textClass.cpp
│ textClass.h
│ textFontClass.cpp
│ textFontClass.h
│
├───input
│ inputClass.cpp
│ inputClass.h
│
├───loader
│ objModelV2Class.cpp
│ objModelV2Class.h
│
├───shader
│ shaderClass.cpp
│ shaderClass.h
│
├───system
│ dx11Class.cpp
│ dx11class.h
│ SystemClass.cpp
│ SystemClass.h
│ xml_loader.cpp
│ xml_loader.h​
│
└───terrain
quadtreeClass.cpp
quadtreeClass.h
terrainClass.cpp
terrainClass.h
terrainManagerClass.cpp
terrainManagerClass.h
​
​​​(main.h) ​
- Set for Chapter 14
​
​Colision Detection:
​
We will use a new variable/flag that swi​tch with Key F12 between colision detection on / off
​
#if TUTORIAL_CHAP >= 14
bool g_GOD_MODE = false;
#endif/
​
// Proccess "F12": GOD MODE SWITCH
// --------------------------------------------------------------------------------------------
#if TUTORIAL_CHAP >= 14
{ static bool state = false;
if ((m_player[g_NetID]->p_player.IsGodModePressed) && (!state)) {
state = true;
}
if ((!m_player[g_NetID]->p_player.IsGodModePressed) && (state)) {
g_GOD_MODE = !g_GOD_MODE;
state = false;
}
}
#endif
Also use Key "A" and "Z" to go up and down on god mode:
if (g_GOD_MODE) {
m_NextPosition.MoveUpward(m_player[g_NetID]->p_player.IsAPressed);
m_NextPosition.MoveDownward(m_player[g_NetID]->p_player.IsZPressed);
}
This is the new part to detect colisions with the terrain comparing the normals (nx and nz <=0.5):​
​​
​ //[3] - Check Colisions:
// --------------------------------------------------------------------------------------------
#if TUTORIAL_CHAP >= 14
if (!g_GOD_MODE)
nextHeight = m_TerrainManager.m_Terrain->getTerrainHeight(m_NextPosition.m_positionX, m_NextPosition.m_positionZ);
//Detect colision with terrain:
float nx=1.0f, nz=1.0f;
if (!g_GOD_MODE) {
if ((m_NextPosition.m_positionZ < m_TerrainManager.m_Terrain->m_terrainHeight) && (m_NextPosition.m_positionX < m_TerrainManager.m_Terrain->m_terrainWidth)) {
#if TUTORIAL_CHAP >= 14 && TUTORIAL_CHAP < 18
nx = m_TerrainManager.m_Terrain->m_heightMap_13[(m_TerrainManager.m_Terrain->m_terrainHeight * ((int)m_NextPosition.m_positionZ)) + ((int)m_NextPosition.m_positionX)].nx;//TODO: all map types
nz = m_TerrainManager.m_Terrain->m_heightMap_13[(m_TerrainManager.m_Terrain->m_terrainHeight * ((int)m_NextPosition.m_positionZ)) + ((int)m_NextPosition.m_positionX)].nz;
#elif TUTORIAL_CHAP >= 18 && TUTORIAL_CHAP < 19
// Future
#elif TUTORIAL_CHAP >= 19 && TUTORIAL_CHAP < 21
// Future
#elif TUTORIAL_CHAP >= 21
// Future
#endif
}
}
if (!g_GOD_MODE) {
if ( abs(nz) <= 0.5f || nextHeight < m_Position[g_NetID]->m_positionY)
#if TUTORIAL_CHAP >= 96
if ( CompoundZnormalOK )
#endif
m_Position[g_NetID]->m_positionZ = m_NextPosition.m_positionZ;
if ( abs(nx) <= 0.5f || nextHeight < m_Position[g_NetID]->m_positionY)
#if TUTORIAL_CHAP >= 96
if ( CompoundXnormalOK )
#endif
m_Position[g_NetID]->m_positionX = m_NextPosition.m_positionX;
} else {
m_Position[g_NetID]->m_positionZ = m_NextPosition.m_positionZ;
m_Position[g_NetID]->m_positionX = m_NextPosition.m_positionX;
}
// Update also "Y" position (Get Height at our position)
// --------------------------------------------------------------------------------------------
if (!g_GOD_MODE)
height = m_TerrainManager.m_Terrain->getTerrainHeight(m_Position[g_NetID]->m_positionX, m_Position[g_NetID]->m_positionZ); // Gravity to Terrain
else
height = m_NextPosition.m_positionY;
#else
//[4] Get the new allowed positions:
m_Position[g_NetID]->m_positionZ = m_NextPosition.m_positionZ;
m_Position[g_NetID]->m_positionX = m_NextPosition.m_positionX;
#endif
​​​​Project Code:
​
http://woma.no-ip.org/woma/WoMA_PartII_Chap14.zip
​What's next?
On next tutorial we will see how to Render the Respective Mini-Map of this Big Map