void UserInterface::RenderFilledTick() { GLFont *fillLabel = new GLFont(); fillLabel->Create("Fonts\\another_font.glf"); fillLabel->Begin(); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); fillLabel->RenderText("Fill ", workArea_TL.GetX() + 10.0f, workArea_BR.GetY() - 400.0f, 0, 8); fillLabel->End(); delete fillLabel; glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 400.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 420.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 420.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 400.0f); glEnd(); if (fill) { glBegin(GL_QUADS); glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 405.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 415.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 415.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 405.0f); glEnd(); } }
GLFont * FontMgr::loadFont() { if( _font ) { return _font; } glClearColor( 1.0, 1.0, 1.0, 1.0 ); glEnable( GL_TEXTURE_2D ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); GLFont * texfont = new GLFont(); GLuint texID; glGenTextures( 1, &texID ); if ( !texfont->Create( texID ) ) { // Font failed to load. assert( false ); delete texfont; texfont = 0; } else { _font = texfont; } glDisable( GL_TEXTURE_2D ); return texfont; }
void UserInterface::RenderSpinTick() { GLFont *spinLabel = new GLFont(); spinLabel->Create("Fonts\\another_font.glf"); spinLabel->Begin(); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); spinLabel->RenderText("Spin ", workArea_TL.GetX() + 10.0f, workArea_BR.GetY() - 350.0f, 0, 8); spinLabel->End(); delete spinLabel; glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 350.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 370.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 370.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 350.0f); glEnd(); if (spin) { glBegin(GL_QUADS); glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 355.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 365.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 365.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 355.0f); glEnd(); } }
void SlideBar::RenderLabel() { GLFont *Label = new GLFont(); Label->Create("Fonts\\another_font.glf"); Label->Begin(); glColor3f(1.0f, 1.0f, 1.0f); Label->RenderText(ID, slideBarLX - 10.0f, slideBarLY + 30.0f, 0, 8.0f); Label->End(); delete Label; }
void RenderText() { std::ostringstream output; if (g_displayHelp) { output << "Press W and S to move forwards and backwards" << std::endl << "Press A and D to strafe left and right" << std::endl << "Move mouse to free look" << std::endl << std::endl << "Press M to enable/disable mouse smoothing" << std::endl << "Press T to enable/disable textures" << std::endl << "Press V to enable/disable vertical sync" << std::endl << "Press SPACE to generate a new random terrain" << std::endl << "Press +/- to change camera rotation speed" << std::endl << "Press ALT + ENTER to toggle full screen" << std::endl << "Press ESC to exit" << std::endl << std::endl << "Press H to hide help"; } else { output.setf(std::ios::fixed, std::ios::floatfield); output << std::setprecision(2); output << "FPS: " << g_framesPerSecond << std::endl << "Anti-aliasing: " << GetAntiAliasingPixelFormatString() << std::endl << "Anisotropic filtering: " << g_maxAnisotrophy << "x" << std::endl << "Mouse smoothing: " << (Mouse::instance().mouseSmoothingIsEnabled() ? "on" : "off") << std::endl << std::endl << "Camera:" << std::endl << " Position:" << " x:" << g_camera.getPosition().x << " y:" << g_camera.getPosition().y << " z:" << g_camera.getPosition().z << std::endl << " Velocity:" << " x:" << g_camera.getCurrentVelocity().x << " y:" << g_camera.getCurrentVelocity().y << " z:" << g_camera.getCurrentVelocity().z << std::endl << " Rotation speed: " << g_camera.getRotationSpeed() << std::endl << std::endl << "Press H to display help"; } g_font.begin(); g_font.setColor(1.0f, 1.0f, 0.0f); g_font.drawText(1, 1, output.str().c_str()); g_font.end(); }
void CleanupApp() { for (int i = 0; i < TERRAIN_REGIONS_COUNT; ++i) { if (g_regions[i].texture) { glDeleteTextures(1, &g_regions[i].texture); g_regions[i].texture = 0; } } if (g_nullTexture) { glDeleteTextures(1, &g_nullTexture); g_nullTexture = 0; } if (g_terrainShader) { glUseProgram(0); glDeleteProgram(g_terrainShader); g_terrainShader = 0; } g_terrain.destroy(); g_font.destroy(); }
void TextSet::drawElement(RenderContext* renderContext, int index) { GLFont* font; if (!vertexArray[index].missing()) { GLboolean valid; material.useColor(index); glRasterPos3f( vertexArray[index].x, vertexArray[index].y, vertexArray[index].z ); glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid); if (valid) { font = fonts[index % fonts.size()]; if (font) { String text = textArray[index]; font->draw( text.text, text.length, adjx, adjy, *renderContext ); } } } SAVEGLERROR; }
void InitApp() { // Setup fonts. if (!g_font.create("Arial", 10, GLFont::BOLD)) throw std::runtime_error("Failed to create font."); // Setup textures. if (!(g_nullTexture = CreateNullTexture(2, 2))) throw std::runtime_error("failed to create null texture."); for (int i = 0; i < TERRAIN_REGIONS_COUNT; ++i) { if (!(g_regions[i].texture = LoadTexture(g_regions[i].filename.c_str()))) throw std::runtime_error("Failed to load texture: " + g_regions[i].filename); } // Setup shaders. std::string infoLog; if (!(g_terrainShader = LoadShaderProgram("content/shaders/terrain.glsl", infoLog))) throw std::runtime_error("Failed to load shader: terrain.glsl.\n" + infoLog); // Setup terrain. if (!g_terrain.create(HEIGHTMAP_SIZE, HEIGHTMAP_GRID_SPACING, HEIGHTMAP_SCALE)) throw std::runtime_error("Failed to create terrain."); GenerateTerrain(); // Setup camera. Vector3 pos; pos.x = HEIGHTMAP_SIZE * HEIGHTMAP_GRID_SPACING * 0.5f; pos.z = HEIGHTMAP_SIZE * HEIGHTMAP_GRID_SPACING * 0.5f; pos.y = g_terrain.getHeightMap().heightAt(pos.x, pos.z) + CAMERA_Y_OFFSET; g_camera.setBehavior(Camera::CAMERA_BEHAVIOR_FIRST_PERSON); g_camera.setPosition(pos); g_camera.setAcceleration(CAMERA_ACCELERATION); g_camera.setVelocity(CAMERA_VELOCITY); g_camera.perspective(CAMERA_FOVX, static_cast<float>(g_windowWidth) / static_cast<float>(g_windowHeight), CAMERA_ZNEAR, CAMERA_ZFAR); float upperBounds = (HEIGHTMAP_SIZE * HEIGHTMAP_GRID_SPACING - (2.0f * HEIGHTMAP_GRID_SPACING)); float lowerBounds = static_cast<float>(HEIGHTMAP_GRID_SPACING); g_cameraBoundsMax.x = upperBounds; g_cameraBoundsMax.y = CAMERA_ZFAR; g_cameraBoundsMax.z = upperBounds; g_cameraBoundsMin.x = lowerBounds; g_cameraBoundsMin.y = 0.0f; g_cameraBoundsMin.z = lowerBounds; // Setup input. Mouse::instance().hideCursor(true); Mouse::instance().setPosition(g_windowWidth / 2, g_windowHeight / 2); }
void UserInterface::RenderModelPicker() { //Renders the title GLFont *modelSelectorLabel = new GLFont(); modelSelectorLabel->Create("Fonts\\another_font.glf"); modelSelectorLabel->Begin(); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); modelSelectorLabel->RenderText("Model Selector: ", workArea_TL.GetX() + 10.0f, workArea_BR.GetY() - 450.0f, 0, 8); modelSelectorLabel->End(); delete modelSelectorLabel; /////////////////////////////////////////////////////////////////////////////// GLFont *teapotLabel = new GLFont(); teapotLabel->Create("Fonts\\another_font.glf"); teapotLabel->Begin(); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); teapotLabel->RenderText("Teapot ", workArea_TL.GetX() + 10.0f, workArea_BR.GetY() - 500.0f, 0, 8); teapotLabel->End(); delete teapotLabel; glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 500.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 520.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 520.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 500.0f); glEnd(); if (teapot) { glBegin(GL_QUADS); glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 505.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 515.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 515.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 505.0f); glEnd(); } //Desmond GLFont *desmondLabel = new GLFont(); desmondLabel->Create("Fonts\\another_font.glf"); desmondLabel->Begin(); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); desmondLabel->RenderText("Desmond Miles ", workArea_TL.GetX() + 10.0f, workArea_BR.GetY() - 550.0f, 0, 8); desmondLabel->End(); delete desmondLabel; glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 550.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 570.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 570.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 550.0f); glEnd(); if (desmond) { glBegin(GL_QUADS); glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 555.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 565.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 565.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 555.0f); glEnd(); } //Teddy GLFont *teddyLabel = new GLFont(); teddyLabel->Create("Fonts\\another_font.glf"); teddyLabel->Begin(); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); teddyLabel->RenderText("Teddy ", workArea_TL.GetX() + 10.0f, workArea_BR.GetY() - 600.0f, 0, 8); teddyLabel->End(); delete teddyLabel; glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 600.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 620.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 620.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 600.0f); glEnd(); if (teddy) { glBegin(GL_QUADS); glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 605.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 615.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 615.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 605.0f); glEnd(); } //C3P0 GLFont *C3P0Label = new GLFont(); C3P0Label->Create("Fonts\\another_font.glf"); C3P0Label->Begin(); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); C3P0Label->RenderText("C-3P0", workArea_TL.GetX() + 10.0f, workArea_BR.GetY() - 650.0f, 0, 8); C3P0Label->End(); delete C3P0Label; glBegin(GL_QUADS); glColor3f(1.0f, 1.0f, 1.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 650.0f); glVertex2f(workArea_TL.GetX() + 160.0f, workArea_BR.GetY() - 670.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 670.0f); glVertex2f(workArea_TL.GetX() + 180.0f, workArea_BR.GetY() - 650.0f); glEnd(); if (C3P0) { glBegin(GL_QUADS); glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 655.0f); glVertex2f(workArea_TL.GetX() + 165.0f, workArea_BR.GetY() - 665.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 665.0f); glVertex2f(workArea_TL.GetX() + 175.0f, workArea_BR.GetY() - 655.0f); glEnd(); } }
int RealTimeTest() { VideoInput vi; const int device1 = 0; IplImage *frame, *fgMask; char windowTitle[128]; double t0 = 0, t1 = 0; int nFrames = 0; int frameWidth, frameHeight; int frameNum = 0; string winner; double spf, t3=0; const int windowWidth = 640, windowHeight = 480; GLFont font; if(!font.Create("glfont2/04b_03.glf")) error("Could not create font"); // setup webcam if(!vi.setupDevice(device1, 320, 240)) error("Could not initialize video input"); frameWidth = vi.getWidth(device1); frameHeight = vi.getHeight(device1); // create images frame = cvCreateImage(cvSize(frameWidth, frameHeight), IPL_DEPTH_8U, 3); fgMask = cvCreateImage(cvSize(frameWidth, frameHeight), IPL_DEPTH_8U, 1); // initialize opengl/glfw glInit(windowWidth, windowHeight); // initialize face detector & optical flow FaceDetector fd(cvSize(frameWidth,frameHeight), 1.5, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING); OpticalFlow of(cvSize(frameWidth,frameHeight), cvSize(80,60)); Classifier classifier("shyp/5ppl-train.xml"); Texture tex(frameWidth, frameHeight); while(!glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED)) { if(vi.isFrameNew(device1)) { // compute fps t1 = glfwGetTime(); if(t1 - t0 > 1) { sprintf_s(windowTitle, "FPS: %.2f", (double)nFrames/(t1-t0)); glfwSetWindowTitle(windowTitle); nFrames = 0; t0 = glfwGetTime(); } ++nFrames; // get frame from cam vi.getPixels(device1, (unsigned char*)frame->imageData, false, true); // detect & track face fd.Detect(frame); // compute optical flow spf = glfwGetTime() - t3; of.Calculate(frame, spf); t3 = glfwGetTime(); of.Align(fd.center, fd.radius); of.Split(); of.Finalize(); if(frameNum >= 15) // wait for background subtraction to settle, and for frames to sum { cout << classifier.Classify(of.GetData()) << endl; } // draw tex.Load((unsigned char*)frame->imageData, GL_BGR); tex.Draw(0,0,windowWidth,windowHeight); fd.Draw(windowWidth, windowHeight); of.Draw(10,10,160,120); int i = 0; for(map<string, double>::const_iterator itr = classifier.votes.begin(); itr != classifier.votes.end(); ++itr, ++i) { float w = windowWidth/(float)classifier.votes.size(); glColor3f(1,0,0); glBegin(GL_LINE_LOOP); glVertex2f(i*w,windowHeight); glVertex2f(i*w,windowHeight-itr->second*80); glVertex2f((i+1)*w,windowHeight-itr->second*80); glVertex2f((i+1)*w,windowHeight); glEnd(); glColor3f(1,1,1); font.Begin(); font.DrawString(itr->first, i*w, windowHeight); font.End(); } glfwSwapBuffers(); ++frameNum; } } // clean up glfwTerminate(); cvReleaseImage(&frame); vi.stopDevice(device1); return EXIT_SUCCESS; }
void SlideBar::RenderValueDisplay() { glEnable(GL_BLEND); glBegin(GL_QUADS); glColor4f(1.0f, 1.0f, 1.0f, alpha); glVertex2f(slideBarRX + 10.0f, slideBarRY); glVertex2f(slideBarRX + 10.0f, slideBarRY - 15.0f); glVertex2f(slideBarRX + 69.0f, slideBarRY - 15.0f); glVertex2f(slideBarRX + 69.0f, slideBarRY); glEnd(); glBegin(GL_LINES); glColor4f(0.3f, 0.3f, 0.3f, alpha); glVertex2f(slideBarRX + 69.0f, slideBarRY + 1.0f); glVertex2f(slideBarRX + 9.0f, slideBarRY + 1.0f); glVertex2f(slideBarRX + 9.0f, slideBarRY + 1.0f); glVertex2f(slideBarRX + 9.0f, slideBarRY - 16.0f); glColor4f(0.8f, 0.8f, 0.8f, alpha); glVertex2f(slideBarRX + 9.0f, slideBarRY - 16.0f); glVertex2f(slideBarRX + 70.0f, slideBarRY - 16.0f); glVertex2f(slideBarRX + 70.0f, slideBarRY - 16.0f); glVertex2f(slideBarRX + 70.0f, slideBarRY + 1.0f); glEnd(); float percentage; //This gets the ratio of where the pointer is in relation to the left and right (X) of the total bar. if (slideBarLX >= 0) { percentage = ((spX - slideBarLX) / (slideBarRX - slideBarLX)) * 100; } else { percentage = ((spX + fabsf(slideBarLX)) / (slideBarRX - slideBarLX)) * 100; } //The slider happens to go above the bound by a float or two, this will be ignored as the value is set to the min/max bound by the mousemove function. //This will take over once the user puts the slider back in bounds. if (!belowLowerBound && !aboveUpperBound) { if (percentage == 0) { value = lowNumber; } else { //If the low number is below zero, it needs to be assumed as 0 until the end //To keep the correct range the absolute value of the low number is added to the high number //Then the absolute value of the low number is taken away at the end. if (lowNumber <= 0) { value = ((highNumber + fabsf(lowNumber)) - 0) * (percentage / 100) - fabsf(lowNumber); } else { value = (highNumber - lowNumber) * (percentage / 100); } } } std::ostringstream converter; converter << value; converter.precision(0); std::string valueString(converter.str()); GLFont *valueLabel = new GLFont(); valueLabel->Create("Fonts\\franklin_gothic.glf"); valueLabel->Begin(); glColor4f(0.0f, 0.0f, 0.0f, alpha); valueLabel->RenderText(valueString.c_str(), slideBarRX + 15.0f, slideBarRY, 0, 6); valueLabel->End(); delete valueLabel; }