//-------------------------------------------------------------- void testApp::draw(){ if(fboUsed) { // set the rendering destination to FBO glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); nmShader.setShaderActive(true); glViewport(0, 0, ofGetWidth(), ofGetHeight()); glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); camera->setView(); drawCity(); glPopMatrix(); nmShader.setShaderActive(false); #ifdef DEBUG // glReadPixels(0,0,ofGetWidth(),ofGetHeight(),GL_COLOR_ATTACHMENT0_EXT,GL_RGB8, colourBytes); // colourImage.saveImage("ColourBuffer.png"); // glReadPixels(0,0,ofGetWidth(),ofGetHeight(),GL_DEPTH_ATTACHMENT_EXT,GL_UNSIGNED_BYTE, depthBytes); // depthImage.saveImage("DepthBuffer.png"); #endif // Switch to Final Render Buffer glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboIdFinal); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // trigger mipmaps generation explicitly // NOTE: If GL_GENERATE_MIPMAP is set to GL_TRUE, then glCopyTexSubImage2D() // triggers mipmap generation automatically. However, the texture attached // onto a FBO should generate mipmaps manually via glGenerateMipmapEXT(). // back to normal viewport and projection matrix glViewport(0, 0, ofGetWidth(), ofGetHeight()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-ofGetWidth()/2,ofGetWidth()/2,-ofGetHeight()/2,ofGetHeight()/2,1,20); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_TEXTURE_2D); ssao2Shader.setShaderActive(true); glActiveTextureARB(GL_TEXTURE0_ARB); glGenerateMipmapEXT(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,colourTextureId); glActiveTextureARB(GL_TEXTURE1_ARB); glBindTexture(GL_TEXTURE_2D,noiseTextureId); // This is needed and fails without but I suspect is a slow down bottleneck! ssao2Shader.setUniformVariable1i("normalMap",0); ssao2Shader.setUniformVariable1i("rnm",1); ssao2Shader.setUniformVariable1f("totStrength", totStrength); ssao2Shader.setUniformVariable1f("strength", ssaoStrength); ssao2Shader.setUniformVariable1f("offset", ssaoOffset); ssao2Shader.setUniformVariable1f("falloff",ssaoFalloff ); ssao2Shader.setUniformVariable1f("rad", ssaoRad); glScalef(0.25, 0.25, 0.25); glTranslated(0,0,-2); glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); glMultiTexCoord2f(GL_TEXTURE0_ARB, 0, 0); glMultiTexCoord2f(GL_TEXTURE1_ARB, 0, 0); glVertex3f(-ofGetWidth()/2,-ofGetHeight()/2,0); glMultiTexCoord2f(GL_TEXTURE0_ARB, 1, 0); glMultiTexCoord2f(GL_TEXTURE1_ARB, 1, 0); glVertex3f(ofGetWidth()/2,-ofGetHeight()/2,0); glMultiTexCoord2f(GL_TEXTURE0_ARB, 1, 1); glMultiTexCoord2f(GL_TEXTURE1_ARB, 1, 1); glVertex3f(ofGetWidth()/2,ofGetHeight()/2,0); glMultiTexCoord2f(GL_TEXTURE0_ARB, 0, 1); glMultiTexCoord2f(GL_TEXTURE1_ARB, 0, 1); glVertex3f(-ofGetWidth()/2,ofGetHeight()/2,0); glEnd(); ssao2Shader.setShaderActive(false); // back to normal window-system-provided framebuffer glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // unbind glViewport(0, 0, ofGetWidth(), ofGetHeight()); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-ofGetWidth()/2,ofGetWidth()/2,-ofGetHeight()/2,ofGetHeight()/2,1,20); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if (blurStep){ blurShader.setShaderActive(true); blurShader.setUniformVariable2f("ScaleU",1.0/ofGetWidth(),1.0/ofGetHeight()); blurShader.setUniformVariable1i("textureSource",2); } glActiveTextureARB(GL_TEXTURE2_ARB); glBindTexture(GL_TEXTURE_2D,finalTextureId); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glPushMatrix(); glTranslated(0,0,-5); glColor3f(0.95, 0.97, 1.0); glBegin(GL_QUADS); glMultiTexCoord2f(GL_TEXTURE2_ARB, 0, 0);glVertex3f(-ofGetWidth()/2,-ofGetHeight()/2,0); glMultiTexCoord2f(GL_TEXTURE2_ARB, 1, 0);glVertex3f(ofGetWidth()/2,-ofGetHeight()/2,0); glMultiTexCoord2f(GL_TEXTURE2_ARB, 1, 1);glVertex3f(ofGetWidth()/2,ofGetHeight()/2,0); glMultiTexCoord2f(GL_TEXTURE2_ARB, 0, 1);glVertex3f(-ofGetWidth()/2,ofGetHeight()/2,0); glEnd(); glPopMatrix(); if(blurStep) blurShader.setShaderActive(false); glDisable(GL_TEXTURE_2D); glPushMatrix(); glTranslated(-ofGetWidth() /2,ofGetHeight() /2,-2); glRotatef(180, 1.0, 0, 0); if (showGui) gui.draw(); glPopMatrix(); } else { glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(-ofGetWidth()/2,ofGetWidth()/2,-ofGetHeight()/2,ofGetHeight()/2,1,20); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glTranslated(0,0,-1500); glColor3f(1.0, 0.0, 0.0); glBegin(GL_QUADS); glVertex3f(-ofGetWidth()/2,-ofGetHeight()/2,0); glVertex3f(ofGetWidth()/2,-ofGetHeight()/2,0); glVertex3f(ofGetWidth()/2,ofGetHeight()/2,0); glVertex3f(-ofGetWidth()/2,ofGetHeight()/2,0); glEnd(); glPopMatrix(); } // Flick back to standard projection and draw our QUAD }
void drawConvexHull() { fillConstants(); const unsigned char black[] = {0,0,0}; const unsigned char red[] = { 255,0,0 }; const unsigned char green[] = { 0,255,0 }; //const unsigned char blue[] = { 0,0,255 }; CImg<unsigned char> visu(COLUMNS,ROWS,1,3,255); CImgDisplay draw_disp(visu,"Cities"); //draw cities for(int i=0;i<nodes;++i) { visu.draw_circle(xtoc(x[i]),ytor(y[i]),CITYRADIUS,black,1,1); } drawCity(45,&visu,green); drawCity(35,&visu,green); drawCity(48,&visu,green); drawCity(63,&visu,green); //draw convex hull cout << "Checkpoint 1" << "\n"; convexHullAlgorithm(); cout << "Checkpoint 2" << "\n"; displayCurrentHull(&visu,red); /* int i=0; while(mask[i]<0) { ++i; } cout << "Checkpoint 3: " << i << "\n"; int firstNode = i; int currNode = i; int nextNode = mask[currNode]; cout << "Current Node: " << currNode << "\n"; cout << "Next Node: " << nextNode << "\n"; while(nextNode!=firstNode && nextNode>=0) { visu.draw_line( xtoc(x[currNode]),ytor(y[currNode]), xtoc(x[nextNode]),ytor(y[nextNode]), red,1,~0U); currNode = nextNode; nextNode = mask[nextNode]; } */ visu.display(draw_disp); while ( !draw_disp.is_closed() ) { draw_disp.wait(); } }