Hi people
I've been working on a quad tree demo for some time and used this gentleman's code as a study to learn:
">
However my results for the island scene look like this:
">
I started following the base code loosely, but to try and get the rendering of the quadtree correct I adhered quite closely to the terrain files as I was being driven slowly crazy. Even now when I see very little difference between the sets of code there must be some faults.
The important code is as follows:
int halfWidth = m_width/2;
int halfHeight = m_height/2;
//init verts
vec3* vertData = new vec3[m_numVertices];
for(int z = 0; z < m_height; z++){
for(int x = 0; x < m_width; x++){
int index = z * m_width + x;
int imgIndexZ = z;
int imgIndexX = x;
if(z == imgHeight){
imgIndexZ--;
}
if(x == imgWidth){
imgIndexX--;
}
int imgIndex = imgIndexZ * m_width + imgIndexX;
vertData[index].x = (x - halfWidth) * LANDSCAPE_SCALE;
vertData[index].y = (float)data[imgIndex] * HEIGHT_SCALE;
vertData[index].z = (z - halfHeight) * LANDSCAPE_SCALE;
}
}
The above is how I init my vertices values, with data being an image file holding the height values. The land mass itself renders fine if I render it as a whole block without a quadtree using an indexed VAO and GL_TRIANGLES.
The indices generating function of the terrain chunks if I go the alternative route, however, is as follows:
int heightmapDataPosX = posX;
int heightmapDataPosY = posY;
unsigned int offset = (unsigned int)pow(2.0f, (float)(lod));
unsigned int div = (unsigned int)pow(2.0f, (float)(depth+lod));
int heightmapDataSizeX = HMsizeX/(div) + 1;
int heightmapDataSizeY = HMsizeY/(div) + 1;
int nHMWidth = heightmapDataSizeX;
int nHMHeight = heightmapDataSizeY;
int nHMOffsetX = heightmapDataPosX;
int nHMOffsetY = heightmapDataPosY;
GLuint nHMTotalWidth = HMsizeX;
GLuint nHMTotalHeight = HMsizeY;
m_indOffsetW[lod] = nHMWidth*2;
m_indOffsetH[lod] = nHMHeight-1;
GLuint numIndices = (nHMWidth-3)*(nHMHeight-4)*2;
m_indices[lod] = new GLuint[numIndices];
m_numIndices[lod] = numIndices;
int index = 0;
for(GLuint y=1; y< nHMHeight-3; y++)
{
for(GLuint x=1; x< nHMWidth-2; x++)
{
GLuint id0 = COORD(x*(offset) + nHMOffsetX, y*(offset) + nHMOffsetY);
GLuint id1 = COORD(x*(offset) + nHMOffsetX, y*(offset) + nHMOffsetY+(offset));
m_indices[lod][index++] = id0;
m_indices[lod][index++] = id1;
}
}
I have to alter the termination conditions for y and x and the numIndices because for some reason I get a memory access error, even though the numberOfVertices should be ok...
I know its masochistic but if anyone can help me I'd be so grateful! I've been going crazy for days... My github repo is here: https://github.com/LloydGhettoWolf/TitanicTerrain/tree/workingversion