| #include "Renderer.hpp" |
| #include "wipemalloc.h" |
| #include "math.h" |
| #include "Common.hpp" |
| #include "KeyHandler.hpp" |
| #include "TextureManager.hpp" |
| #include <iostream> |
| #include <algorithm> |
| #include <cassert> |
| #include "omptl/omptl" |
| #include "omptl/omptl_algorithm" |
| #include "UserTexture.hpp" |
| |
| class Preset; |
| |
| Renderer::Renderer(int width, int height, int gx, int gy, int texsize, BeatDetect *beatDetect, std::string _presetURL, |
| std::string _titlefontURL, std::string _menufontURL) : |
| title_fontURL(_titlefontURL), menu_fontURL(_menufontURL), presetURL(_presetURL), m_presetName("None"), vw(width), |
| vh(height), texsize(texsize), mesh(gx, gy) |
| { |
| int x; |
| int y; |
| |
| this->totalframes = 1; |
| this->noSwitch = false; |
| this->showfps = false; |
| this->showtitle = false; |
| this->showpreset = false; |
| this->showhelp = false; |
| this->showstats = false; |
| this->studio = false; |
| this->realfps = 0; |
| |
| this->drawtitle = 0; |
| |
| //this->title = "Unknown"; |
| |
| /** Other stuff... */ |
| this->correction = true; |
| this->aspect = (float) height / (float) width;; |
| |
| /// @bug put these on member init list |
| this->renderTarget = new RenderTarget(texsize, width, height); |
| this->textureManager = new TextureManager(presetURL); |
| this->beatDetect = beatDetect; |
| |
| #ifdef USE_FTGL |
| /**f Load the standard fonts */ |
| |
| title_font = new FTGLPixmapFont(title_fontURL.c_str()); |
| other_font = new FTGLPixmapFont(menu_fontURL.c_str()); |
| poly_font = new FTGLExtrdFont(title_fontURL.c_str()); |
| |
| if(title_font->Error()) { |
| fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str()); |
| } else { |
| title_font->UseDisplayList(true); |
| } |
| |
| other_font->UseDisplayList(true); |
| |
| if(poly_font->Error()) { |
| fprintf(stderr, "Failed to open font %s\n", title_fontURL.c_str()); |
| } else { |
| poly_font->UseDisplayList(true); |
| poly_font->Depth(20); |
| poly_font->FaceSize(72); |
| } |
| |
| #endif /** USE_FTGL */ |
| |
| |
| int size = (mesh.height - 1) *mesh.width * 5 * 2; |
| p = ( float * ) wipemalloc ( size * sizeof ( float ) ); |
| |
| |
| for (int j = 0; j < mesh.height - 1; j++) |
| { |
| int base = j * mesh.width * 2 * 5; |
| |
| |
| for (int i = 0; i < mesh.width; i++) |
| { |
| int index = j * mesh.width + i; |
| int index2 = (j + 1) * mesh.width + i; |
| |
| int strip = base + i * 10; |
| p[strip + 2] = mesh.identity[index].x; |
| p[strip + 3] = mesh.identity[index].y; |
| p[strip + 4] = 0; |
| |
| p[strip + 7] = mesh.identity[index2].x; |
| p[strip + 8] = mesh.identity[index2].y; |
| p[strip + 9] = 0; |
| } |
| } |
| |
| |
| #ifdef USE_CG |
| shaderEngine.setParams(renderTarget->texsize, renderTarget->textureID[1], aspect, beatDetect, textureManager); |
| #endif |
| |
| } |
| |
| void Renderer::SetPipeline(Pipeline &pipeline) |
| { |
| currentPipe = &pipeline; |
| #ifdef USE_CG |
| shaderEngine.reset(); |
| shaderEngine.loadShader(pipeline.warpShader); |
| shaderEngine.loadShader(pipeline.compositeShader); |
| #endif |
| } |
| |
| void Renderer::ResetTextures() |
| { |
| textureManager->Clear(); |
| |
| delete (renderTarget); |
| renderTarget = new RenderTarget(texsize, vw, vh); |
| reset(vw, vh); |
| |
| textureManager->Preload(); |
| } |
| |
| void Renderer::SetupPass1(const Pipeline &pipeline, const PipelineContext &pipelineContext) |
| { |
| //glMatrixMode(GL_PROJECTION); |
| //glPushMatrix(); |
| //glMatrixMode(GL_MODELVIEW); |
| //glPushMatrix(); |
| |
| totalframes++; |
| renderTarget->lock(); |
| glViewport(0, 0, renderTarget->texsize, renderTarget->texsize); |
| |
| glEnable(GL_TEXTURE_2D); |
| |
| //If using FBO, switch to FBO texture |
| |
| glMatrixMode(GL_TEXTURE); |
| glLoadIdentity(); |
| |
| glMatrixMode(GL_PROJECTION); |
| glLoadIdentity(); |
| |
| #ifdef USE_GLES1 |
| glOrthof(0.0, 1, 0.0, 1, -40, 40); |
| #else |
| glOrtho(0.0, 1, 0.0, 1, -40, 40); |
| #endif |
| |
| glMatrixMode(GL_MODELVIEW); |
| glLoadIdentity(); |
| |
| #ifdef USE_CG |
| shaderEngine.RenderBlurTextures(pipeline, pipelineContext, renderTarget->texsize); |
| #endif |
| } |
| |
| void Renderer::RenderItems(const Pipeline &pipeline, const PipelineContext &pipelineContext) |
| { |
| renderContext.time = pipelineContext.time; |
| renderContext.texsize = texsize; |
| renderContext.aspectCorrect = correction; |
| renderContext.aspectRatio = aspect; |
| renderContext.textureManager = textureManager; |
| renderContext.beatDetect = beatDetect; |
| |
| for (std::vector<RenderItem*>::const_iterator pos = pipeline.drawables.begin(); pos != pipeline.drawables.end(); ++pos) |
| { |
| if (*pos != NULL) |
| { |
| (*pos)->Draw(renderContext); |
| } |
| } |
| } |
| |
| void Renderer::FinishPass1() |
| { |
| draw_title_to_texture(); |
| /** Restore original view state */ |
| //glMatrixMode(GL_MODELVIEW); |
| //glPopMatrix(); |
| |
| //glMatrixMode(GL_PROJECTION); |
| //glPopMatrix(); |
| |
| renderTarget->unlock(); |
| |
| } |
| |
| void Renderer::Pass2(const Pipeline &pipeline, const PipelineContext &pipelineContext) |
| { |
| //BEGIN PASS 2 |
| // |
| //end of texture rendering |
| //now we copy the texture from the FBO or framebuffer to |
| //video texture memory and render fullscreen. |
| |
| /** Reset the viewport size */ |
| #ifdef USE_FBO |
| if (renderTarget->renderToTexture) |
| { |
| glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->renderTarget->fbuffer[1]); |
| glViewport(0, 0, this->renderTarget->texsize, this->renderTarget->texsize); |
| } |
| else |
| #endif |
| glViewport(0, 0, this->vw, this->vh); |
| |
| glBindTexture(GL_TEXTURE_2D, this->renderTarget->textureID[0]); |
| |
| glMatrixMode(GL_PROJECTION); |
| glLoadIdentity(); |
| #ifdef USE_GLES1 |
| glOrthof(-0.5, 0.5, -0.5, 0.5, -40, 40); |
| #else |
| glOrtho(-0.5, 0.5, -0.5, 0.5, -40, 40); |
| #endif |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| |
| glLineWidth(this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize / 512.0); |
| |
| CompositeOutput(pipeline, pipelineContext); |
| |
| glMatrixMode(GL_MODELVIEW); |
| glLoadIdentity(); |
| glTranslatef(-0.5, -0.5, 0); |
| |
| // When console refreshes, there is a chance the preset has been changed by the user |
| refreshConsole(); |
| draw_title_to_screen(false); |
| if (this->showhelp % 2) |
| draw_help(); |
| if (this->showtitle % 2) |
| draw_title(); |
| if (this->showfps % 2) |
| draw_fps(this->realfps); |
| if (this->showpreset % 2) |
| draw_preset(); |
| if (this->showstats % 2) |
| draw_stats(); |
| glTranslatef(0.5, 0.5, 0); |
| |
| #ifdef USE_FBO |
| if (renderTarget->renderToTexture) |
| glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); |
| #endif |
| } |
| |
| void Renderer::RenderFrame(const Pipeline &pipeline, const PipelineContext &pipelineContext) |
| { |
| |
| SetupPass1(pipeline, pipelineContext); |
| |
| #ifdef USE_CG |
| shaderEngine.enableShader(currentPipe->warpShader, pipeline, pipelineContext); |
| #endif |
| Interpolation(pipeline); |
| #ifdef USE_CG |
| shaderEngine.disableShader(); |
| #endif |
| |
| RenderItems(pipeline, pipelineContext); |
| FinishPass1(); |
| Pass2(pipeline, pipelineContext); |
| } |
| |
| void Renderer::Interpolation(const Pipeline &pipeline) |
| { |
| if (this->renderTarget->useFBO) |
| glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[1]); |
| else |
| glBindTexture(GL_TEXTURE_2D, renderTarget->textureID[0]); |
| |
| //Texture wrapping( clamp vs. wrap) |
| if (pipeline.textureWrap == 0) |
| { |
| #ifdef USE_GLES1 |
| glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| #else |
| glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); |
| glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); |
| #endif |
| } |
| else |
| { |
| glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); |
| glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); |
| } |
| |
| glMatrixMode(GL_TEXTURE); |
| glLoadIdentity(); |
| |
| glBlendFunc(GL_SRC_ALPHA, GL_ZERO); |
| |
| glColor4f(1.0, 1.0, 1.0, pipeline.screenDecay); |
| |
| glEnable(GL_TEXTURE_2D); |
| |
| |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
| glDisableClientState(GL_COLOR_ARRAY); |
| |
| |
| //glVertexPointer(2, GL_FLOAT, 0, p); |
| //glTexCoordPointer(2, GL_FLOAT, 0, t); |
| glTexCoordPointer (2, GL_FLOAT, sizeof (GLfloat) * 5, (GLfloat *) p); |
| glVertexPointer (3, GL_FLOAT, sizeof (GLfloat) * 5, (GLfloat *) p + 2); |
| |
| |
| if (pipeline.staticPerPixel) |
| { |
| for (int j = 0; j < mesh.height - 1; j++) |
| { |
| int base = j * mesh.width * 2 * 5; |
| |
| for (int i = 0; i < mesh.width; i++) |
| { |
| int strip = base + i * 10; |
| p[strip] = pipeline.x_mesh[i][j]; |
| p[strip + 1] = pipeline.y_mesh[i][j]; |
| |
| p[strip + 5] = pipeline.x_mesh[i][j+1]; |
| p[strip + 6] = pipeline.y_mesh[i][j+1]; |
| } |
| } |
| |
| } |
| else |
| { |
| mesh.Reset(); |
| omptl::transform(mesh.p.begin(), mesh.p.end(), mesh.identity.begin(), mesh.p.begin(), &Renderer::PerPixel); |
| |
| for (int j = 0; j < mesh.height - 1; j++) |
| { |
| int base = j * mesh.width * 2 * 5; |
| |
| for (int i = 0; i < mesh.width; i++) |
| { |
| int strip = base + i * 10; |
| int index = j * mesh.width + i; |
| int index2 = (j + 1) * mesh.width + i; |
| |
| p[strip] = mesh.p[index].x; |
| p[strip + 1] = mesh.p[index].y; |
| |
| p[strip + 5] = mesh.p[index2].x; |
| p[strip + 6] = mesh.p[index2].y; |
| |
| |
| } |
| } |
| |
| } |
| |
| for (int j = 0; j < mesh.height - 1; j++) |
| glDrawArrays(GL_TRIANGLE_STRIP,j* mesh.width* 2,mesh.width*2); |
| |
| |
| glDisable(GL_TEXTURE_2D); |
| |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| |
| } |
| Pipeline* Renderer::currentPipe; |
| |
| Renderer::~Renderer() |
| { |
| |
| int x; |
| |
| if (renderTarget) |
| delete (renderTarget); |
| if (textureManager) |
| delete (textureManager); |
| |
| //std::cerr << "grid assign end" << std::endl; |
| |
| free(p); |
| |
| #ifdef USE_FTGL |
| // std::cerr << "freeing title fonts" << std::endl; |
| if (title_font) |
| delete title_font; |
| if (poly_font) |
| delete poly_font; |
| if (other_font) |
| delete other_font; |
| // std::cerr << "freeing title fonts finished" << std::endl; |
| #endif |
| // std::cerr << "exiting destructor" << std::endl; |
| } |
| |
| void Renderer::reset(int w, int h) |
| { |
| aspect = (float) h / (float) w; |
| this -> vw = w; |
| this -> vh = h; |
| |
| #if USE_CG |
| shaderEngine.setAspect(aspect); |
| #endif |
| |
| glShadeModel(GL_SMOOTH); |
| |
| glCullFace(GL_BACK); |
| //glFrontFace( GL_CCW ); |
| |
| glClearColor(0, 0, 0, 0); |
| |
| glViewport(0, 0, w, h); |
| |
| glMatrixMode(GL_TEXTURE); |
| glLoadIdentity(); |
| |
| glMatrixMode(GL_PROJECTION); |
| glLoadIdentity(); |
| |
| glMatrixMode(GL_MODELVIEW); |
| glLoadIdentity(); |
| |
| #ifndef USE_GLES1 |
| glDrawBuffer(GL_BACK); |
| glReadBuffer(GL_BACK); |
| #endif |
| glEnable(GL_BLEND); |
| |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| |
| glEnable(GL_LINE_SMOOTH); |
| |
| glEnable(GL_POINT_SMOOTH); |
| glClear(GL_COLOR_BUFFER_BIT); |
| |
| #ifndef USE_GLES1 |
| glLineStipple(2, 0xAAAA); |
| #endif |
| |
| glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
| glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
| |
| glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); |
| |
| //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); |
| //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); |
| //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); |
| |
| if (!this->renderTarget->useFBO) |
| { |
| this->renderTarget->fallbackRescale(w, h); |
| } |
| } |
| |
| GLuint Renderer::initRenderToTexture() |
| { |
| return renderTarget->initRenderToTexture(); |
| } |
| |
| void Renderer::draw_title_to_texture() |
| { |
| #ifdef USE_FTGL |
| if (this->drawtitle > 100) |
| { |
| draw_title_to_screen(true); |
| this->drawtitle = 0; |
| } |
| #endif /** USE_FTGL */ |
| } |
| |
| float title_y; |
| |
| void Renderer::draw_title_to_screen(bool flip) |
| { |
| |
| #ifdef USE_FTGL |
| if (this->drawtitle > 0) |
| { |
| |
| //setUpLighting(); |
| |
| //glEnable(GL_POLYGON_SMOOTH); |
| //glEnable( GL_CULL_FACE); |
| glEnable(GL_DEPTH_TEST); |
| glClear(GL_DEPTH_BUFFER_BIT); |
| |
| int draw; |
| if (drawtitle >= 80) |
| draw = 80; |
| else |
| draw = drawtitle; |
| |
| float easein = ((80 - draw) * .0125); |
| float easein2 = easein * easein; |
| |
| if (drawtitle == 1) |
| { |
| title_y = (float) rand() / RAND_MAX; |
| title_y *= 2; |
| title_y -= 1; |
| title_y *= .6; |
| } |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| //glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE); |
| glColor4f(1.0, 1.0, 1.0, 1.0); |
| |
| glMatrixMode(GL_PROJECTION); |
| glPushMatrix(); |
| glLoadIdentity(); |
| |
| glFrustum(-1, 1, -1 * (float) vh / (float) vw, 1 * (float) vh / (float) vw, 1, 1000); |
| if (flip) |
| glScalef(1, -1, 1); |
| glMatrixMode(GL_MODELVIEW); |
| glPushMatrix(); |
| glLoadIdentity(); |
| |
| glTranslatef(-850, title_y * 850 * vh / vw, easein2 * 900 - 900); |
| |
| glRotatef(easein2 * 360, 1, 0, 0); |
| |
| poly_font->Render(this->title.c_str()); |
| |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| |
| this->drawtitle++; |
| |
| glPopMatrix(); |
| glMatrixMode(GL_PROJECTION); |
| glPopMatrix(); |
| |
| glMatrixMode(GL_MODELVIEW); |
| |
| glDisable(GL_CULL_FACE); |
| glDisable(GL_DEPTH_TEST); |
| |
| glDisable(GL_COLOR_MATERIAL); |
| |
| glDisable(GL_LIGHTING); |
| glDisable(GL_POLYGON_SMOOTH); |
| } |
| #endif /** USE_FTGL */ |
| } |
| |
| void Renderer::draw_title() |
| { |
| #ifdef USE_FTGL |
| //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); |
| |
| glColor4f(1.0, 1.0, 1.0, 1.0); |
| // glPushMatrix(); |
| // glTranslatef(this->vw*.001,this->vh*.03, -1); |
| // glScalef(this->vw*.015,this->vh*.025,0); |
| |
| glRasterPos2f(0.01, 0.05); |
| title_font->FaceSize((unsigned) (20 * (this->vh / 512.0))); |
| |
| title_font->Render(this->title.c_str()); |
| // glPopMatrix(); |
| //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); |
| |
| #endif /** USE_FTGL */ |
| } |
| |
| void Renderer::draw_preset() |
| { |
| #ifdef USE_FTGL |
| //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); |
| |
| glColor4f(1.0, 1.0, 1.0, 1.0); |
| // glPushMatrix(); |
| //glTranslatef(this->vw*.001,this->vh*-.01, -1); |
| //glScalef(this->vw*.003,this->vh*.004,0); |
| |
| |
| glRasterPos2f(0.01, 0.01); |
| |
| title_font->FaceSize((unsigned) (12 * (this->vh / 512.0))); |
| if (this->noSwitch) |
| title_font->Render("[LOCKED] "); |
| title_font->FaceSize((unsigned) (20 * (this->vh / 512.0))); |
| |
| title_font->Render(this->presetName().c_str()); |
| |
| //glPopMatrix(); |
| // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); |
| #endif /** USE_FTGL */ |
| } |
| |
| void Renderer::draw_help() |
| { |
| |
| #ifdef USE_FTGL |
| //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); |
| |
| glColor4f(1.0, 1.0, 1.0, 1.0); |
| glPushMatrix(); |
| glTranslatef(0, 1, 0); |
| //glScalef(this->vw*.02,this->vh*.02 ,0); |
| |
| |
| title_font->FaceSize((unsigned) (18 * (this->vh / 512.0))); |
| |
| glRasterPos2f(0.01, -0.05); |
| title_font->Render("Help"); |
| |
| glRasterPos2f(0.01, -0.09); |
| title_font->Render("----------------------------"); |
| |
| glRasterPos2f(0.01, -0.13); |
| title_font->Render("F1: This help menu"); |
| |
| glRasterPos2f(0.01, -0.17); |
| title_font->Render("F2: Show song title"); |
| |
| glRasterPos2f(0.01, -0.21); |
| title_font->Render("F3: Show preset name"); |
| |
| glRasterPos2f(0.01, -0.25); |
| title_font->Render("F4: Show Rendering Settings"); |
| |
| glRasterPos2f(0.01, -0.29); |
| title_font->Render("F5: Show FPS"); |
| |
| glRasterPos2f(0.01, -0.35); |
| title_font->Render("F: Fullscreen"); |
| |
| glRasterPos2f(0.01, -0.39); |
| title_font->Render("L: Lock/Unlock Preset"); |
| |
| glRasterPos2f(0.01, -0.43); |
| title_font->Render("M: Show Menu"); |
| |
| glRasterPos2f(0.01, -0.49); |
| title_font->Render("R: Random preset"); |
| glRasterPos2f(0.01, -0.53); |
| title_font->Render("N: Next preset"); |
| |
| glRasterPos2f(0.01, -0.57); |
| title_font->Render("P: Previous preset"); |
| |
| glPopMatrix(); |
| // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); |
| |
| #endif /** USE_FTGL */ |
| } |
| |
| void Renderer::draw_stats() |
| { |
| |
| #ifdef USE_FTGL |
| char buffer[128]; |
| float offset = (this->showfps % 2 ? -0.05 : 0.0); |
| // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); |
| |
| glColor4f(1.0, 1.0, 1.0, 1.0); |
| glPushMatrix(); |
| glTranslatef(0.01, 1, 0); |
| glRasterPos2f(0, -.05 + offset); |
| other_font->Render(this->correction ? " aspect: corrected" : " aspect: stretched"); |
| sprintf(buffer, " (%f)", this->aspect); |
| other_font->Render(buffer); |
| |
| glRasterPos2f(0, -.09 + offset); |
| other_font->FaceSize((unsigned) (18 * (vh / 512.0))); |
| |
| sprintf(buffer, " texsize: %d", renderTarget->texsize); |
| other_font->Render(buffer); |
| |
| glRasterPos2f(0, -.13 + offset); |
| sprintf(buffer, " viewport: %d x %d", vw, vh); |
| |
| other_font->Render(buffer); |
| glRasterPos2f(0, -.17 + offset); |
| other_font->Render((renderTarget->useFBO ? " FBO: on" : " FBO: off")); |
| |
| glRasterPos2f(0, -.21 + offset); |
| sprintf(buffer, " mesh: %d x %d", mesh.width, mesh.height); |
| other_font->Render(buffer); |
| |
| glRasterPos2f(0, -.25 + offset); |
| sprintf(buffer, " textures: %.1fkB", textureManager->getTextureMemorySize() / 1000.0f); |
| other_font->Render(buffer); |
| #ifdef USE_CG |
| glRasterPos2f(0, -.29 + offset); |
| sprintf(buffer, "shader profile: %s", shaderEngine.profileName.c_str()); |
| other_font->Render(buffer); |
| |
| glRasterPos2f(0, -.33 + offset); |
| sprintf(buffer, " warp shader: %s", currentPipe->warpShader.enabled ? "on" : "off"); |
| other_font->Render(buffer); |
| |
| glRasterPos2f(0, -.37 + offset); |
| sprintf(buffer, " comp shader: %s", currentPipe->compositeShader.enabled ? "on" : "off"); |
| other_font->Render(buffer); |
| #endif |
| glPopMatrix(); |
| // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); |
| |
| |
| #endif /** USE_FTGL */ |
| } |
| void Renderer::draw_fps(float realfps) |
| { |
| #ifdef USE_FTGL |
| char bufferfps[20]; |
| sprintf(bufferfps, "%.1f fps", realfps); |
| // glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); |
| |
| glColor4f(1.0, 1.0, 1.0, 1.0); |
| glPushMatrix(); |
| glTranslatef(0.01, 1, 0); |
| glRasterPos2f(0, -0.05); |
| title_font->FaceSize((unsigned) (20 * (this->vh / 512.0))); |
| title_font->Render(bufferfps); |
| |
| glPopMatrix(); |
| // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); |
| |
| #endif /** USE_FTGL */ |
| } |
| |
| void Renderer::CompositeOutput(const Pipeline &pipeline, const PipelineContext &pipelineContext) |
| { |
| |
| glMatrixMode(GL_TEXTURE); |
| glLoadIdentity(); |
| |
| glMatrixMode(GL_MODELVIEW); |
| glLoadIdentity(); |
| |
| //Overwrite anything on the screen |
| glBlendFunc(GL_ONE, GL_ZERO); |
| glColor4f(1.0, 1.0, 1.0, 1.0f); |
| |
| glEnable(GL_TEXTURE_2D); |
| |
| #ifdef USE_CG |
| shaderEngine.enableShader(currentPipe->compositeShader, pipeline, pipelineContext); |
| #endif |
| |
| float tex[4][2] = |
| { |
| { 0, 1 }, |
| { 0, 0 }, |
| { 1, 0 }, |
| { 1, 1 } }; |
| |
| float points[4][2] = |
| { |
| { -0.5, -0.5 }, |
| { -0.5, 0.5 }, |
| { 0.5, 0.5 }, |
| { 0.5, -0.5 } }; |
| |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glDisableClientState(GL_COLOR_ARRAY); |
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
| |
| glVertexPointer(2, GL_FLOAT, 0, points); |
| glTexCoordPointer(2, GL_FLOAT, 0, tex); |
| |
| glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
| |
| glDisable(GL_TEXTURE_2D); |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| |
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
| |
| #ifdef USE_CG |
| shaderEngine.disableShader(); |
| #endif |
| |
| for (std::vector<RenderItem*>::const_iterator pos = pipeline.compositeDrawables.begin(); pos |
| != pipeline.compositeDrawables.end(); ++pos) |
| (*pos)->Draw(renderContext); |
| |
| } |