void TerrainRenderer::drawNode(GLdouble offsetX, GLdouble offsetY, GLdouble size, QuadTreeNode *node){ size = size/2; for(int i=0; i<2; i++){ for(int j=0; j<2; j++){ QuadTreeNode *child; if(i==0 && j==0) child = node->tlNode; if(i==1 && j==0) child = node->trNode; if(i==0 && j==1) child = node->blNode; if(i==1 && j==1) child = node->brNode; GLfloat tile_x = size*i+offsetX; GLfloat tile_y = size*i+offsetY; GLfloat d = getTileDistance(tile_x, tile_y, transformHeight(child->min), transformHeight(child->max), size); if(tile_x == 0.0 && tile_y == 0.0 && size == 0.5) printf("Distance from %i, %i: %f\n", i, j, d); if(d < size*2 && !child->isLeaf()){ drawNode(size*i+offsetX, size*j+offsetY, size, child); }else{ drawHeightmap(size*i+offsetX, size*j+offsetY, size, child); } } } }
void display() { displayPrev = displayCurrent; displayCurrent = clock(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (drawHeightmapFlag){ drawHeightmap(); glutSwapBuffers(); return; } if (drawFogFlag){ glEnable(GL_FOG); glFogf(GL_FOG_MODE, GL_EXP); glFogf(GL_FOG_DENSITY, 0.008); GLfloat fogColor[4] = { 0.3f, 0.3f, 0.3f, 1.0f }; // Fog Color glFogfv(GL_FOG_COLOR, fogColor); } else{ glDisable(GL_FOG); } //Vale tin kamera glLoadIdentity(); gluLookAt(cameraPosition[0], cameraPosition[1], cameraPosition[2], 0, 0, 0, 0, 1, 0); //Draw Skybox if (drawSkyboxFlag){ drawSkybox(); } // Draw Terrain drawTerrain(); //Draw Sea if (drawSeaFlag){ drawSea(); } drawSun(); //Add Light glEnable(GL_NORMALIZE); glEnable(GL_LINEAR_ATTENUATION); glShadeModel(GL_SMOOTH); float zeros[3] = { 0, 0, 0 }; glMaterialfv(GL_FRONT, GL_EMISSION, zeros); GLfloat lightPos[] = { lightPosition[0], lightPosition[1], lightPosition[2], 1 }; glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glutSwapBuffers(); }