From f4025c8eaf7a77a440b87c0bc9c112695b9b2e1e Mon Sep 17 00:00:00 2001 From: psperl Date: Fri, 22 Jun 2007 02:31:41 +0000 Subject: [PATCH] PJS: maybe I made some mistakes... either way, progress is made git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/personal/carm/dev-1.0@206 6778bc44-b910-0410-a7a0-be141de4315d --- src/projectM-engine/CustomWave.cpp | 2 +- src/projectM-engine/Expr.cpp | 8 +- src/projectM-engine/PerPixelEqn.cpp | 6 +- src/projectM-engine/PerPointEqn.cpp | 4 +- src/projectM-engine/Renderer.cpp | 707 ++++++++++++++++++++-- src/projectM-engine/Renderer.hpp | 23 +- src/projectM-engine/console_interface.cpp | 34 +- src/projectM-engine/menu.cpp | 7 +- src/projectM-engine/pbuffer.cpp | 65 +- src/projectM-engine/pbuffer.h | 20 +- src/projectM-engine/projectM.cpp | 672 +------------------- src/projectM-engine/projectM.h | 33 +- 12 files changed, 774 insertions(+), 807 deletions(-) diff --git a/src/projectM-engine/CustomWave.cpp b/src/projectM-engine/CustomWave.cpp index 692280e79..4ac81858c 100755 --- a/src/projectM-engine/CustomWave.cpp +++ b/src/projectM-engine/CustomWave.cpp @@ -583,7 +583,7 @@ void CustomWave::evalPerPointEqns() { /* Reset index */ - projectM::currentEngine->mesh_i = -1; + projectM::currentEngine->renderer->mesh_i = -1; } void CustomWave::load_unspecified_init_conds_wave() { diff --git a/src/projectM-engine/Expr.cpp b/src/projectM-engine/Expr.cpp index c71ceba61..97a5e2752 100755 --- a/src/projectM-engine/Expr.cpp +++ b/src/projectM-engine/Expr.cpp @@ -123,11 +123,11 @@ float ValExpr::eval_val_expr() { /** Sanity check the matrix is there... */ assert(term.param->matrix != NULL ); - if (projectM::currentEngine->mesh_i >= 0) { - if (projectM::currentEngine->mesh_j >= 0) { - return (((float**)term.param->matrix)[projectM::currentEngine->mesh_i][projectM::currentEngine->mesh_j]); + if (projectM::currentEngine->renderer->mesh_i >= 0) { + if (projectM::currentEngine->renderer->mesh_j >= 0) { + return (((float**)term.param->matrix)[projectM::currentEngine->renderer->mesh_i][projectM::currentEngine->renderer->mesh_j]); } else { - return (((float*)term.param->matrix)[projectM::currentEngine->mesh_i]); + return (((float*)term.param->matrix)[projectM::currentEngine->renderer->mesh_i]); } } } diff --git a/src/projectM-engine/PerPixelEqn.cpp b/src/projectM-engine/PerPixelEqn.cpp index 51887ec87..6d3d4d113 100755 --- a/src/projectM-engine/PerPixelEqn.cpp +++ b/src/projectM-engine/PerPixelEqn.cpp @@ -70,9 +70,9 @@ void PerPixelEqn::evalPerPixelEqn() { printf("something is seriously wrong...\n"); // param->matrix_flag = 0; /** Force matrix ignore to update time */ - for (projectM::currentEngine->mesh_i = 0; projectM::currentEngine->mesh_i < param->gx; projectM::currentEngine->mesh_i++) { - for (projectM::currentEngine->mesh_j = 0; projectM::currentEngine->mesh_j < param->gy; projectM::currentEngine->mesh_j++) { - param_matrix[projectM::currentEngine->mesh_i][projectM::currentEngine->mesh_j] = eqn_ptr->eval_gen_expr(); + for (projectM::currentEngine->renderer->mesh_i = 0; projectM::currentEngine->renderer->mesh_i < param->gx; projectM::currentEngine->renderer->mesh_i++) { + for (projectM::currentEngine->renderer->mesh_j = 0; projectM::currentEngine->renderer->mesh_j < param->gy; projectM::currentEngine->renderer->mesh_j++) { + param_matrix[projectM::currentEngine->renderer->mesh_i][projectM::currentEngine->renderer->mesh_j] = eqn_ptr->eval_gen_expr(); } } diff --git a/src/projectM-engine/PerPointEqn.cpp b/src/projectM-engine/PerPointEqn.cpp index 3868a4212..7ef7cf433 100755 --- a/src/projectM-engine/PerPointEqn.cpp +++ b/src/projectM-engine/PerPointEqn.cpp @@ -56,8 +56,8 @@ abort(); else param_matrix = (float*)param->matrix; - for (projectM::currentEngine->mesh_i = 0; projectM::currentEngine->mesh_i < samples; projectM::currentEngine->mesh_i++) { - param_matrix[projectM::currentEngine->mesh_i] = eqn_ptr->eval_gen_expr(); + for (projectM::currentEngine->renderer->mesh_i = 0; projectM::currentEngine->renderer->mesh_i < samples; projectM::currentEngine->renderer->mesh_i++) { + param_matrix[projectM::currentEngine->renderer->mesh_i] = eqn_ptr->eval_gen_expr(); } /* Now that this parameter has been referenced with a per diff --git a/src/projectM-engine/Renderer.cpp b/src/projectM-engine/Renderer.cpp index 26e632bdf..0ba0fd99c 100644 --- a/src/projectM-engine/Renderer.cpp +++ b/src/projectM-engine/Renderer.cpp @@ -3,13 +3,24 @@ #include "math.h" #include "common.h" -Renderer::Renderer(int gx, int gy, int texsize) +Renderer::Renderer(int width, int height, int gx, int gy, RenderTarget *renderTarget) { int x; int y; this->gx=gx; this->gy=gy; + this->showfps = 0; + this->showtitle = 0; + this->showpreset = 0; + this->showhelp = 0; + this->showstats = 0; + this->studio = 0; + + /** Other stuff... */ + this->correction = 1; + this->aspect=1.33333333; + this->gridx=(float **)wipemalloc(gx * sizeof(float *)); for(x = 0; x < gx; x++) { @@ -51,14 +62,7 @@ this->origy2=(float **)wipemalloc(gx * sizeof(float *)); this->origy2[x] = (float *)wipemalloc(gy * sizeof(float)); } - this->renderTarget = (RenderTarget *)wipemalloc( sizeof( RenderTarget ) ); - this->renderTarget->usePbuffers = 1; - /** Configurable engine variables */ - this->renderTarget->texsize = 1024; - - createPBuffers( this->renderTarget->texsize, this->renderTarget->texsize , this->renderTarget ); - - + //initialize reference grid values for (x=0;xorigy2=(float **)wipemalloc(gx * sizeof(float *)); this->origy[x][y]=-((y/(float)(gy-1))-1); this->origrad[x][y]=hypot((this->origx[x][y]-.5)*2,(this->origy[x][y]-.5)*2) * .7071067; this->origtheta[x][y]=atan2(((this->origy[x][y]-.5)*2),((this->origx[x][y]-.5)*2)); - this->gridx[x][y]=this->origx[x][y]*texsize; - this->gridy[x][y]=this->origy[x][y]*texsize; + this->gridx[x][y]=this->origx[x][y]*renderTarget->texsize; + this->gridy[x][y]=this->origy[x][y]*renderTarget->texsize; this->origx2[x][y]=( this->origx[x][y]-.5)*2; this->origy2[x][y]=( this->origy[x][y]-.5)*2; }} + +this->renderTarget = renderTarget; + } -void Renderer:RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInputs) +void Renderer::RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInputs) { reset_per_pixel_matrices(); @@ -89,7 +96,7 @@ void Renderer:RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInpu //in pass 2 we will copy the texture into texture memory - lockPBuffer( renderTarget, PBUFFER_PASS1 ); + renderTarget->lock(); // glPushAttrib( GL_ALL_ATTRIB_BITS ); /* Overkill, but safe */ @@ -125,10 +132,8 @@ void Renderer:RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInpu DWRITE( "renderFrame: renderTarget->texsize: %d x %d\n", this->renderTarget->texsize, this->renderTarget->texsize ); - if ( doPerPixelEffects ) { - do_per_pixel_math(); - } - + + PerPixelMath(presetOutputs); if(this->renderTarget->usePbuffers) { @@ -136,8 +141,8 @@ void Renderer:RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInpu //unlockPBuffer( this->renderTarget); //lockPBuffer( this->renderTarget, PBUFFER_PASS1 ); } - Renderer::PerFrame(&presetOutputs); //apply per-frame effects - Renderer::Interpolation(&presetOutputs,&presetInputs); //apply per-pixel effects + PerFrame(presetOutputs); //apply per-frame effects + Interpolation(presetOutputs,presetInputs); //apply per-pixel effects draw_title_to_texture(); //draw title to texture @@ -162,7 +167,7 @@ void Renderer:RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInpu // glPopAttrib(); glFlush(); - unlockPBuffer( this->renderTarget ); + renderTarget->unlock(); #ifdef DEBUG @@ -244,12 +249,12 @@ void Renderer::Interpolation(PresetOutputs *presetOutputs, PresetInputs *presetI } #endif - for (x=0;xgx - 1;x++){ glBegin(GL_TRIANGLE_STRIP); - for(y=0;ygridx[x][y], this->gridy[x][y]); - glTexCoord2f(presetInputs.x_mesh[x+1][y], presetInputs.y_mesh[x+1][y]); + for(y=0;ygy;y++){ + glTexCoord2f(presetInputs->x_mesh[x][y], presetInputs->y_mesh[x][y]); + glVertex2f(this->gridx[x][-], this->gridy[x][y]); + glTexCoord2f(presetInputs->x_mesh[x+1][y], presetInputs->y_mesh[x+1][y]); glVertex2f(this->gridx[x+1][y], this->gridy[x+1][y]); } glEnd(); @@ -516,6 +521,10 @@ void Renderer::rescale_per_pixel_matrices() { void Renderer::reset(int w, int h) { + this->aspect=(float)h / (float)w; + this -> vw = w; + this -> vh = h; + if (!this->renderTarget->usePbuffers) { createPBuffers(w,h,this->renderTarget); } @@ -1346,33 +1355,33 @@ void Renderer::modulate_opacity_by_volume() { //based on current volume - if (this->presetOutputs.bModWaveAlphaByVolume==1) - {if (beatDetect->vol<=this->presetOutputs.fModWaveAlphaStart) this->presetOutputs.wave_o=0.0; - else if (beatDetect->vol>=this->presetOutputs.fModWaveAlphaEnd) this->presetOutputs.wave_o=this->presetOutputs.fWaveAlpha; - else this->presetOutputs.wave_o=this->presetOutputs.fWaveAlpha*((beatDetect->vol-this->presetOutputs.fModWaveAlphaStart)/(this->presetOutputs.fModWaveAlphaEnd-this->presetOutputs.fModWaveAlphaStart));} - else this->presetOutputs.wave_o=this->presetOutputs.fWaveAlpha; + if (presetOutputs->bModWaveAlphaByVolume==1) + {if (beatDetect->vol<=presetOutputs->fModWaveAlphaStart) presetOutputs->wave_o=0.0; + else if (beatDetect->vol>=presetOutputs->fModWaveAlphaEnd) presetOutputs->wave_o=presetOutputs->fWaveAlpha; + else presetOutputs->wave_o=presetOutputs->fWaveAlpha*((beatDetect->vol-presetOutputs->fModWaveAlphaStart)/(presetOutputs->fModWaveAlphaEnd-presetOutputs->fModWaveAlphaStart));} + else presetOutputs->wave_o=presetOutputs->fWaveAlpha; } void Renderer::draw_motion_vectors() { int x,y; - float offsetx=this->presetOutputs.mv_dx, intervalx=1.0/(float)this->presetOutputs.mv_x; - float offsety=this->presetOutputs.mv_dy, intervaly=1.0/(float)this->presetOutputs.mv_y; + float offsetx=presetOutputs->mv_dx, intervalx=1.0/(float)presetOutputs->mv_x; + float offsety=presetOutputs->mv_dy, intervaly=1.0/(float)presetOutputs->mv_y; glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glPointSize(this->presetOutputs.mv_l); - glColor4f(this->presetOutputs.mv_r, this->presetOutputs.mv_g, this->presetOutputs.mv_b, this->presetOutputs.mv_a); + glPointSize(presetOutputs->mv_l); + glColor4f(presetOutputs->mv_r, presetOutputs->mv_g, presetOutputs->mv_b, presetOutputs->mv_a); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef( 0, 0, -1 ); glBegin(GL_POINTS); - for (x=0;xpresetOutputs.mv_x;x++){ - for(y=0;ypresetOutputs.mv_y;y++){ + for (x=0;xmv_x;x++){ + for(y=0;ymv_y;y++){ float lx, ly, lz; lx = offsetx+x*intervalx; ly = offsety+y*intervaly; @@ -1387,17 +1396,17 @@ void Renderer::draw_motion_vectors() { } -void projectM::draw_borders() { +void Renderer::draw_borders() { //Draw Borders - float of=this->presetOutputs.ob_size*.5; - float iff=this->presetOutputs.ib_size*.5; + float of=presetOutputs->ob_size*.5; + float iff=presetOutputs->ib_size*.5; float texof=1.0-of; //no additive drawing for borders glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glColor4d(this->presetOutputs.ob_r,this->presetOutputs.ob_g,this->presetOutputs.ob_b,this->presetOutputs.ob_a); + glColor4d(presetOutputs->ob_r,presetOutputs->ob_g,presetOutputs->ob_b,presetOutputs->ob_a); glMatrixMode( GL_MODELVIEW ); glPushMatrix(); @@ -1407,7 +1416,7 @@ void projectM::draw_borders() { glRectd(of,0,texof,of); glRectd(texof,0,1,1); glRectd(of,1,texof,texof); - glColor4d(this->presetOutputs.ib_r,this->presetOutputs.ib_g,this->presetOutputs.ib_b,this->presetOutputs.ib_a); + glColor4d(presetOutputs->ib_r,presetOutputs->ib_g,presetOutputs->ib_b,presetOutputs->ib_a); glRectd(of,of,of+iff,texof); glRectd(of+iff,of,texof-iff,of+iff); glRectd(texof-iff,of,texof,texof); @@ -1415,3 +1424,619 @@ void projectM::draw_borders() { glPopMatrix(); } + + + +void Renderer::draw_title_to_texture() { + +#ifdef USE_FTGL + if (this->drawtitle>80) + // if(1) + { + glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + glColor4f(1.0,1.0,1.0,1.0); + glPushMatrix(); + + glTranslatef(0,0.5, -1); + + glScalef(0.0025,-0.0025,30*.0025); + //glTranslatef(0,0, 1.0); + poly_font->FaceSize( 22); + + glRasterPos2f(0.0, 0.0); + + if ( this->title != NULL ) { + poly_font->Render(this->title ); + } else { + poly_font->Render("Unknown" ); + } + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glPopMatrix(); + this->drawtitle=0; + } +#endif /** USE_FTGL */ +} + +void Renderer::draw_title_to_screen() { + +#ifdef USE_FTGL + if(this->drawtitle>0) + { + float easein = ((80-this->drawtitle)*.0125); + float easein2 = easein * easein; + float easein3 = .0025/((-easein2)+1.0); + + glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + glColor4f(1.0,1.0,1.0,1.0); + glPushMatrix(); + + + //glTranslatef(this->vw*.5,this->vh*.5 , -1.0); + glTranslatef(0,0.5 , -1.0); + + glScalef(easein3,easein3,30*.0025); + + glRotatef(easein2*360,1,0,0); + + + //glTranslatef(-.5*this->vw,0, 0.0); + + //poly_font->Depth(1.0); + poly_font->FaceSize(22); + + glRasterPos2f(0.0, 0.0); + if ( this->title != NULL ) { + poly_font->Render(this->title ); + } else { + poly_font->Render("Unknown" ); + } + // poly_font->Depth(0.0); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glPopMatrix(); + + this->drawtitle++; + + } +#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))); + + if ( this->title != NULL ) { + title_font->Render(this->title ); + } else { + title_font->Render("Unknown" ); + } + // 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 ); + + + + //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); + DWRITE("pre-help"); + 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); + DWRITE("post-help"); +#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*(this->vh/512.0))); + + sprintf( buffer, " texsize: %d", this->texsize); + other_font->Render(buffer); + + glRasterPos2f(0, -.13+offset); + sprintf( buffer, "viewport: %d x %d", this->vw, this->vh); + other_font->Render(buffer); + /* REME: FIX + glRasterPos2f(0, -.17+offset); + other_font->Render((this->renderer->renderTarget->usePbuffers ? " FBO: on" : " FBO: off")); + */ + glRasterPos2f(0, -.21+offset); + sprintf( buffer, " mesh: %d x %d", presetInputs->gx,presetInputs->gy); + other_font->Render(buffer); + + + 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 */ +} + + +//Actually draws the texture to the screen +// +//The Video Echo effect is also applied here +void Renderer::render_texture_to_screen() { + + int flipx=1,flipy=1; + //glBindTexture( GL_TEXTURE_2D,this->renderTarget->textureID[0] ); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + glClear( GL_DEPTH_BUFFER_BIT ); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -15); + + 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_DECAL); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); + + // glClear(GL_ACCUM_BUFFER_BIT); + glColor4d(0.0, 0.0, 0.0,1.0f); + + DWRITE( "rendering texture to screen\n" ); + + glBegin(GL_QUADS); + glVertex3d( 0, 0, -1 ); + glVertex4d(-0.5,-0.5,-1,1); + glVertex4d(-0.5, 0.5,-1,1); + glVertex4d(0.5, 0.5,-1,1); + glVertex4d(0.5, -0.5,-1,1); + glEnd(); + + + glEnable(GL_TEXTURE_2D); + //glBindTexture( GL_TEXTURE_2D, this->renderTarget->textureID[0] ); +// glBindTexture( GL_TEXTURE_2D, this->renderTarget->textureID ); + + // glAccum(GL_LOAD,0); + // if (bDarken==1) glBlendFunc(GL_SRC_COLOR,GL_ZERO); + + //Draw giant rectangle and texture it with our texture! + glBegin(GL_QUADS); + glTexCoord4d(0, 1,0,1); glVertex4d(-0.5,-0.5,-1,1); + glTexCoord4d(0, 0,0,1); glVertex4d(-0.5, 0.5,-1,1); + glTexCoord4d(1, 0,0,1); glVertex4d(0.5, 0.5,-1,1); + glTexCoord4d(1, 1,0,1); glVertex4d(0.5, -0.5,-1,1); + glEnd(); + + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + // if (bDarken==1) glBlendFunc(GL_SRC_COLOR,GL_ONE_MINUS_SRC_ALPHA); + + // if (bDarken==1) { glAccum(GL_ACCUM,1-fVideoEchoAlpha); glBlendFunc(GL_SRC_COLOR,GL_ZERO); } + + glMatrixMode(GL_TEXTURE); + + //draw video echo + glColor4f(0.0, 0.0, 0.0,presetOutputs->fVideoEchoAlpha); + glTranslatef(.5,.5,0); + glScalef(1.0/presetOutputs->fVideoEchoZoom,1.0/presetOutputs->fVideoEchoZoom,1); + glTranslatef(-.5,-.5,0); + + switch (((int)presetOutputs->nVideoEchoOrientation)) + { + case 0: flipx=1;flipy=1;break; + case 1: flipx=-1;flipy=1;break; + case 2: flipx=1;flipy=-1;break; + case 3: flipx=-1;flipy=-1;break; + default: flipx=1;flipy=1; break; + } + glBegin(GL_QUADS); + glTexCoord4d(0, 1,0,1); glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glTexCoord4d(0, 0,0,1); glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glTexCoord4d(1, 0,0,1); glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glTexCoord4d(1, 1,0,1); glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + + + glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + + if (presetOutputs->bBrighten==1) + { + glColor4f(1.0, 1.0, 1.0,1.0); + glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + glBegin(GL_QUADS); + glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + glBlendFunc(GL_ZERO, GL_DST_COLOR); + glBegin(GL_QUADS); + glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + glBegin(GL_QUADS); + glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + } + + if (presetOutputs->bDarken==1) + { + + glColor4f(1.0, 1.0, 1.0,1.0); + glBlendFunc(GL_ZERO,GL_DST_COLOR); + glBegin(GL_QUADS); + glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + + + + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + } + + + if (presetOutputs->bSolarize) + { + + glColor4f(1.0, 1.0, 1.0,1.0); + glBlendFunc(GL_ZERO,GL_ONE_MINUS_DST_COLOR); + glBegin(GL_QUADS); + glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + glBlendFunc(GL_DST_COLOR,GL_ONE); + glBegin(GL_QUADS); + glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + + + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + } + + if (presetOutputs->bInvert) + { + glColor4f(1.0, 1.0, 1.0,1.0); + glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + glBegin(GL_QUADS); + glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + } +} +void Renderer::render_texture_to_studio() { + + int x,y; + int flipx=1,flipy=1; + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + + glClear( GL_DEPTH_BUFFER_BIT ); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -15); + + 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_DECAL); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); + + // glClear(GL_ACCUM_BUFFER_BIT); + glColor4f(0.0, 0.0, 0.0,0.04); + + + glBegin(GL_QUADS); + glVertex4d(-0.5,-0.5,-1,1); + glVertex4d(-0.5, 0.5,-1,1); + glVertex4d(0.5, 0.5,-1,1); + glVertex4d(0.5, -0.5,-1,1); + glEnd(); + + + glColor4f(0.0, 0.0, 0.0,1.0); + + glBegin(GL_QUADS); + glVertex4d(-0.5,0,-1,1); + glVertex4d(-0.5, 0.5,-1,1); + glVertex4d(0.5, 0.5,-1,1); + glVertex4d(0.5, 0,-1,1); + glEnd(); + + glBegin(GL_QUADS); + glVertex4d(0,-0.5,-1,1); + glVertex4d(0, 0.5,-1,1); + glVertex4d(0.5, 0.5,-1,1); + glVertex4d(0.5, -0.5,-1,1); + glEnd(); + + glPushMatrix(); + glTranslatef(.25, .25, 0); + glScalef(.5,.5,1); + + glEnable(GL_TEXTURE_2D); + + + //Draw giant rectangle and texture it with our texture! + glBegin(GL_QUADS); + glTexCoord4d(0, 1,0,1); glVertex4d(-0.5,-0.5,-1,1); + glTexCoord4d(0, 0,0,1); glVertex4d(-0.5, 0.5,-1,1); + glTexCoord4d(1, 0,0,1); glVertex4d(0.5, 0.5,-1,1); + glTexCoord4d(1, 1,0,1); glVertex4d(0.5, -0.5,-1,1); + glEnd(); + + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + + glMatrixMode(GL_TEXTURE); + + //draw video echo + glColor4f(0.0, 0.0, 0.0,presetOutputs->fVideoEchoAlpha); + glTranslated(.5,.5,0); + glScaled(1/presetOutputs->fVideoEchoZoom,1/presetOutputs->fVideoEchoZoom,1); + glTranslated(-.5,-.5,0); + + switch (((int)presetOutputs->nVideoEchoOrientation)) + { + case 0: flipx=1;flipy=1;break; + case 1: flipx=-1;flipy=1;break; + case 2: flipx=1;flipy=-1;break; + case 3: flipx=-1;flipy=-1;break; + default: flipx=1;flipy=1; break; + } + glBegin(GL_QUADS); + glTexCoord4d(0, 1,0,1); glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glTexCoord4d(0, 0,0,1); glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glTexCoord4d(1, 0,0,1); glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glTexCoord4d(1, 1,0,1); glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + + + //glDisable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + // if (bDarken==1) { glAccum(GL_ACCUM,fVideoEchoAlpha); glAccum(GL_RETURN,1);} + + + if (presetOutputs->bInvert) + { + glColor4f(1.0, 1.0, 1.0,1.0); + glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + glBegin(GL_QUADS); + glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); + glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, 0.5*flipy,-1,1); + glVertex4f(0.5*flipx, -0.5*flipy,-1,1); + glEnd(); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + } + + // glTranslated(.5,.5,0); + // glScaled(1/fVideoEchoZoom,1/fVideoEchoZoom,1); + // glTranslated(-.5,-.5,0); + //glTranslatef(0,.5*vh,0); + + /** Per-pixel mesh display -- bottom-right corner */ + //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); + + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glPushMatrix(); + glTranslatef(.25, -.25, 0); + glScalef(.5,.5,1); + glColor4f(1.0,1.0,1.0,1.0); + + for (x=0;xgx;x++){ + glBegin(GL_LINE_STRIP); + for(y=0;ygy;y++){ + glVertex4f((presetInputs->x_mesh[x][y]-.5), (presetInputs->y_mesh[x][y]-.5),-1,1); + //glVertex4f((origx[x+1][y]-.5) * vw, (origy[x+1][y]-.5) *vh ,-1,1); + } + glEnd(); + } + + for (y=0;ygy;y++){ + glBegin(GL_LINE_STRIP); + for(x=0;xgx;x++){ + glVertex4f((presetInputs->x_mesh[x][y]-.5), (presetInputs->y_mesh[x][y]-.5),-1,1); + //glVertex4f((origx[x+1][y]-.5) * vw, (origy[x+1][y]-.5) *vh ,-1,1); + } + glEnd(); + } + + glEnable( GL_TEXTURE_2D ); + + /* + for (x=0;xgx-1;x++){ + glBegin(GL_POINTS); + for(y=0;ygy;y++){ + glVertex4f((this->origx[x][y]-.5)* this->vw, (this->origy[x][y]-.5)*this->vh,-1,1); + glVertex4f((this->origx[x+1][y]-.5) * this->vw, (this->origy[x+1][y]-.5) *this->vh ,-1,1); + } + glEnd(); + } + */ + // glTranslated(-.5,-.5,0); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + /** Waveform display -- bottom-left */ + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(-.5,0, 0); + + glTranslatef(0,-0.10, 0); + glBegin(GL_LINE_STRIP); + glColor4f(0,1.0,1.0,1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->treb_att*-7,-1); + glColor4f(1.0,1.0,1.0,1.0); + glVertex3f((((this->totalframes%256)/551.0)),0 ,-1); + glColor4f(.5,1.0,1.0,1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->treb*7,-1); + glEnd(); + + glTranslatef(0,-0.13, 0); + glBegin(GL_LINE_STRIP); + glColor4f(0,1.0,0.0,1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->mid_att*-7,-1); + glColor4f(1.0,1.0,1.0,1.0); + glVertex3f((((this->totalframes%256)/551.0)),0 ,-1); + glColor4f(.5,1.0,0.0,0.5); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->mid*7,-1); + glEnd(); + + + glTranslatef(0,-0.13, 0); + glBegin(GL_LINE_STRIP); + glColor4f(1.0,0.0,0.0,1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->bass_att*-7,-1); + glColor4f(1.0,1.0,1.0,1.0); + glVertex3f((((this->totalframes%256)/551.0)),0 ,-1); + glColor4f(.7,0.2,0.2,1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->bass*7,-1); + glEnd(); + + glTranslatef(0,-0.13, 0); + glBegin(GL_LINES); + + glColor4f(1.0,1.0,1.0,1.0); + glVertex3f((((this->totalframes%256)/551.0)),0 ,-1); + glColor4f(1.0,0.6,1.0,1.0); + glVertex3f((((this->totalframes%256)/551.0)), beatDetect->vol*7,-1); + glEnd(); + + glPopMatrix(); + + glDisable(GL_TEXTURE_2D); +} diff --git a/src/projectM-engine/Renderer.hpp b/src/projectM-engine/Renderer.hpp index 7b2b0aee5..c733ea757 100644 --- a/src/projectM-engine/Renderer.hpp +++ b/src/projectM-engine/Renderer.hpp @@ -18,19 +18,32 @@ class Renderer float **origy2; int gx; int gy; - - int mesh_i, mesh_j; + + int vw; + int vh; + + float aspect; + public: - - Renderer(int gx, int gy, int texsize); + int mesh_i, mesh_j; + int showfps; + int showtitle; + int showpreset; + int showhelp; + int showstats; + + int studio; + int correction; + + Renderer( int width, int height, int gx, int gy, RenderTarget *renderTarget); ~Renderer(); void RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInputs); void reset(int w, int h); private: - void PerFrame(PresetOutputs *presetOutputs, PresetInputs *presetInputs); + void PerFrame(PresetOutputs *presetOutputs); void Interpolation(PresetOutputs *presetOutputs, PresetInputs *presetInputs); void PerPixelMath(PresetOutputs *presetOutputs); void reset_per_pixel_matrices(); diff --git a/src/projectM-engine/console_interface.cpp b/src/projectM-engine/console_interface.cpp index a6e5e8210..5287bbe7c 100755 --- a/src/projectM-engine/console_interface.cpp +++ b/src/projectM-engine/console_interface.cpp @@ -112,30 +112,30 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode if (beatDetect->beat_sensitivity < 0) beatDetect->beat_sensitivity = 0; break; case PROJECTM_K_F1: - showhelp++; - showstats=0; - showfps=0; + renderer->showhelp++; + renderer->showstats=0; + renderer->showfps=0; break; case PROJECTM_K_F5: - if(showhelp%2==0) showfps++; + if(renderer->showhelp%2==0) renderer->showfps++; break; case PROJECTM_K_F4: - if(showhelp%2==0) showstats++; + if(renderer->showhelp%2==0) renderer->showstats++; break; case PROJECTM_K_F3: { - showpreset++; - printf( "F3 pressed: %d\n", showpreset ); + renderer->showpreset++; + printf( "F3 pressed: %d\n", renderer->showpreset ); break; } case PROJECTM_K_F2: - showtitle++; + renderer->showtitle++; break; #ifndef MACOS case PROJECTM_K_F9: #else case PROJECTM_K_F8: #endif - studio++; + renderer->studio++; break; case PROJECTM_K_ESCAPE: { @@ -146,10 +146,10 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode break; case PROJECTM_K_a: - if (correction) { - correction = 0; + if (renderer->correction) { + renderer->correction = 0; } else { - correction = 1; + renderer->correction = 1; } break; case PROJECTM_K_b: @@ -183,13 +183,13 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode // 80, 24, 140, 60, 0, 0); break; case PROJECTM_K_s: - studio++; + renderer->studio++; // current_interface = EDITOR_INTERFACE; // loadEditor("[FILE NAME HERE]", (void (*)())savePreset, // 50, 1, 100, 5, 0, .92); case PROJECTM_K_i: DWRITE( "PROJECTM_K_i\n" ); - doIterative = !doIterative; + break; case PROJECTM_K_z: break; @@ -203,9 +203,9 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode // nWaveMode=7; break; case PROJECTM_K_m: - showhelp=0; - showstats=0; - showfps=0; + renderer->showhelp=0; + renderer->showstats=0; + renderer->showfps=0; current_interface = MENU_INTERFACE; showMenu(); break; diff --git a/src/projectM-engine/menu.cpp b/src/projectM-engine/menu.cpp index 06e233d9a..5540677c3 100755 --- a/src/projectM-engine/menu.cpp +++ b/src/projectM-engine/menu.cpp @@ -963,8 +963,11 @@ void menu_key_handler( projectMEvent event, projectMKeycode key ) { case PROJECTM_K_f: if (projectM::currentEngine->fullscreen==1) - {projectM::currentEngine->vw=projectM::currentEngine->wvw;projectM::currentEngine->vh=projectM::currentEngine->wvh;projectM::currentEngine->fullscreen=0;} - else{projectM::currentEngine->vw=projectM::currentEngine->fvw; projectM::currentEngine->vh=projectM::currentEngine->fvh;projectM::currentEngine->fullscreen=1;} + {projectM::currentEngine->renderer->reset(projectM::currentEngine->wvw,projectM::currentEngine->wvh); +projectM::currentEngine->fullscreen=0;} + else{projectM::currentEngine->renderer->reset(projectM::currentEngine->fvw,projectM::currentEngine->fvh); +projectM::currentEngine->fullscreen=1; +} // init_display(projectM::currentEngine->vw,projectM::currentEngine->vh,projectM::currentEngine->fullscreen); diff --git a/src/projectM-engine/pbuffer.cpp b/src/projectM-engine/pbuffer.cpp index b43d178e0..3dff279fb 100755 --- a/src/projectM-engine/pbuffer.cpp +++ b/src/projectM-engine/pbuffer.cpp @@ -21,7 +21,7 @@ /** * $Id: pbuffer.c,v 1.1.1.1 2005/12/23 18:05:00 psperl Exp $ * - * Render target methods + * Render this methods */ #include @@ -35,14 +35,15 @@ #endif /** MACOS */ /** Creates new pbuffers */ -void createPBuffers( int width, int height, RenderTarget *target ) { +RenderTarget::RenderTarget(int texsize, int width, int height) { int mindim = 0; int origtexsize = 0; + int usePbuffers = 1; #ifdef USE_FBO - DWRITE( "FBO init: usePbuffers: %d\n", target->usePbuffers ); - if(target->usePbuffers) { + DWRITE( "FBO init: usePbuffers: %d\n", usePbuffers ); + if(usePbuffers) { glewInit(); GLuint fb, color_rb, depth_rb, rgba_tex, depth_tex, i, other_tex; @@ -51,13 +52,13 @@ void createPBuffers( int width, int height, RenderTarget *target ) { glGenRenderbuffersEXT(1, &depth_rb); glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb ); - glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, target->texsize,target->texsize ); + glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, this->texsize,this->texsize ); glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb ); - target->fbuffer[0] = depth_rb; + this->fbuffer[0] = depth_rb; glGenTextures(1, &other_tex); glBindTexture(GL_TEXTURE_2D,other_tex); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, target->texsize, target->texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glGenerateMipmapEXT(GL_TEXTURE_2D); @@ -69,7 +70,7 @@ void createPBuffers( int width, int height, RenderTarget *target ) { glGenTextures(1, &rgba_tex); glBindTexture(GL_TEXTURE_2D, rgba_tex); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, target->texsize, target->texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glGenerateMipmapEXT(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); @@ -78,8 +79,8 @@ void createPBuffers( int width, int height, RenderTarget *target ) { glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, rgba_tex, 0 ); - target->textureID[0] = rgba_tex; - target->textureID[1] = other_tex; + this->textureID[0] = rgba_tex; + this->textureID[1] = other_tex; GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); if (status == GL_FRAMEBUFFER_COMPLETE_EXT) { @@ -96,24 +97,24 @@ fallback: /** If the viewport is smaller, then we'll need to scale the texture size down */ /** If the viewport is larger, scale it up */ mindim = width < height ? width : height; - origtexsize = target->texsize; - target->texsize = nearestPower2( mindim, SCALE_MINIFY ); + origtexsize = this->texsize; + this->texsize = nearestPower2( mindim, SCALE_MINIFY ); - /* Create the texture that will be bound to the render target */ - if ( glIsTexture( target->textureID[0] ) ) { + /* Create the texture that will be bound to the render this */ + if ( glIsTexture( this->textureID[0] ) ) { DWRITE( "texture already exists\n" ); - if ( target->texsize != origtexsize ) { + if ( this->texsize != origtexsize ) { DWRITE( "deleting existing texture due to resize\n" ); - glDeleteTextures( 1, &target->textureID[0] ); + glDeleteTextures( 1, &this->textureID[0] ); } } - if ( !glIsTexture( target->textureID[0] ) ) { - glGenTextures(1, &target->textureID[0] ); + if ( !glIsTexture( this->textureID[0] ) ) { + glGenTextures(1, &this->textureID[0] ); DWRITE( "allocate texture: %d\ttexsize: %d x %d\n", - target->textureID[0], target->texsize, target->texsize ); - glBindTexture(GL_TEXTURE_2D, target->textureID[0] ); + this->textureID[0], this->texsize, this->texsize ); + glBindTexture(GL_TEXTURE_2D, this->textureID[0] ); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -123,14 +124,14 @@ fallback: glTexImage2D(GL_TEXTURE_2D, 0, 3, - target->texsize, target->texsize, + this->texsize, this->texsize, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); } - target->usePbuffers = 0; + this->usePbuffers = 0; return; } @@ -138,27 +139,27 @@ fallback: /** Destroys the pbuffer */ /** Locks the pbuffer */ -void lockPBuffer( RenderTarget *target, PBufferPass pass ) { +void RenderTarget::lock() { #ifdef USE_FBO - if(target->usePbuffers) + if(this->usePbuffers) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, target->fbuffer[0]); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->fbuffer[0]); } #endif } /** Unlocks the pbuffer */ -void unlockPBuffer( RenderTarget *target ) { +void RenderTarget::unlock() { #ifdef USE_FBO - if(target->usePbuffers) + if(this->usePbuffers) { - glBindTexture( GL_TEXTURE_2D, target->textureID[1] ); + glBindTexture( GL_TEXTURE_2D, this->textureID[1] ); glCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, - target->texsize, target->texsize ); + this->texsize, this->texsize ); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); return; } @@ -167,17 +168,17 @@ void unlockPBuffer( RenderTarget *target ) { /** Fallback texture path */ DWRITE( "copying framebuffer to texture\n" ); - glBindTexture( GL_TEXTURE_2D, target->textureID[0] ); + glBindTexture( GL_TEXTURE_2D, this->textureID[0] ); glCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, - target->texsize, target->texsize ); + this->texsize, this->texsize ); } /** * Calculates the nearest power of two to the given number using the * appropriate rule */ -int nearestPower2( int value, TextureScale scaleRule ) { +int RenderTarget::nearestPower2( int value, TextureScale scaleRule ) { int x = value; int power = 0; diff --git a/src/projectM-engine/pbuffer.h b/src/projectM-engine/pbuffer.h index 7c97ce4ac..177087d58 100755 --- a/src/projectM-engine/pbuffer.h +++ b/src/projectM-engine/pbuffer.h @@ -57,8 +57,10 @@ typedef enum { typedef enum { PBUFFER_PASS1, PBUFFER_PASS2 } PBufferPass; -typedef struct RENDERTARGET { +class RenderTarget { + +public: /** Texture size */ int texsize; @@ -67,22 +69,26 @@ typedef struct RENDERTARGET { int usePbuffers; + + RenderTarget( int texsize, int width, int height ); + void lock(); + void unlock(); + int nearestPower2( int value, TextureScale scaleRule ); + /** Opaque pbuffer context and pbuffer */ +/* #ifdef MACOS void *origContext; void *pbufferContext; void *pbuffer; #endif - +*/ /** Render target texture ID for non-pbuffer systems */ GLuint textureID[2]; GLuint fbuffer[1]; GLuint depthb[1]; - } RenderTarget; + }; + -extern void createPBuffers( int width, int height, RenderTarget *target ); -extern void lockPBuffer( RenderTarget *target, PBufferPass pass ); -extern void unlockPBuffer( RenderTarget *target ); -extern int nearestPower2( int value, TextureScale scaleRule ); #endif /** !_RENDERTARGET_H */ diff --git a/src/projectM-engine/projectM.cpp b/src/projectM-engine/projectM.cpp index 6855ab7e0..d9a478f91 100755 --- a/src/projectM-engine/projectM.cpp +++ b/src/projectM-engine/projectM.cpp @@ -175,12 +175,6 @@ DLLEXPORT void projectM::projectM_reset() { this->freqframes = 0; this->totalframes = 1; - this->showfps = 0; - this->showtitle = 0; - this->showpreset = 0; - this->showhelp = 0; - this->showstats = 0; - this->studio = 0; this->fvw = 800; this->fvh = 600; @@ -188,29 +182,11 @@ DLLEXPORT void projectM::projectM_reset() { this->wvh = 512; this->fullscreen = 0; - /** Configurable mesh size */ - this->gx = 48; - this->gy = 36; - this->texsize=512; - /** Frames per preset */ this->avgtime = 500; this->title = NULL; - /** Other stuff... */ - this->correction = 1; - this->aspect=1.33333333; - - - /** Per pixel equation variables */ - this->gridx = NULL; - this->gridy = NULL; - this->origtheta = NULL; - this->origrad = NULL; - this->origx = NULL; - this->origy = NULL; - /** More other stuff */ this->mspf = 0; this->timed = 0; @@ -223,7 +199,7 @@ DLLEXPORT void projectM::projectM_reset() { projectM_resetengine(); } -DLLEXPORT void projectM::projectM_init() { +DLLEXPORT void projectM::projectM_init(int gx, int gy, int texsize, int width, int height) { #ifdef USE_FTGL /** Reset fonts */ @@ -347,25 +323,14 @@ DLLEXPORT void projectM::projectM_init() { #endif -printf( "pre init_display()\n" ); - -printf( "post init_display()\n" ); mspf=(int)(1000.0/(float)presetInputs.fps); - - //create off-screen pbuffer (or not if unsupported) -// CreateRenderTarget(this->renderTarget->texsize, &this->textureID, &this->renderTarget); -printf( "post CreaterenderTarget\n" ); - - -//fps = 0; - initMenu(); //DWRITE( "post initMenu()\n" ); - printf("mesh: %d %d\n", this->presetInputs.gx,this->presetInputs.gy ); + printf("mesh: %d %d\n", gx,gy ); #ifdef PANTS printf( "maxsamples: %d\n", this->maxsamples ); @@ -377,8 +342,11 @@ DWRITE( "post PCM init\n" ); this->hasInit = 1; + this->renderTarget = new RenderTarget(texsize, width, height); +this->presetInputs.gx = gx; +this->presetInputs.gy = gy; - renderer = new Renderer(gx,gy,texsize); + this->renderer = new Renderer(width, height, gx, gy, renderTarget); printf( "exiting projectM_init()\n" ); } @@ -390,626 +358,6 @@ printf( "exiting projectM_init()\n" ); -void projectM::draw_title_to_texture() { - -#ifdef USE_FTGL - if (this->drawtitle>80) - // if(1) - { - glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); - glColor4f(1.0,1.0,1.0,1.0); - glPushMatrix(); - - glTranslatef(0,0.5, -1); - - glScalef(0.0025,-0.0025,30*.0025); - //glTranslatef(0,0, 1.0); - poly_font->FaceSize( 22); - - glRasterPos2f(0.0, 0.0); - - if ( this->title != NULL ) { - poly_font->Render(this->title ); - } else { - poly_font->Render("Unknown" ); - } - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glPopMatrix(); - this->drawtitle=0; - } -#endif /** USE_FTGL */ -} - -void projectM::draw_title_to_screen() { - -#ifdef USE_FTGL - if(this->drawtitle>0) - { - float easein = ((80-this->drawtitle)*.0125); - float easein2 = easein * easein; - float easein3 = .0025/((-easein2)+1.0); - - glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); - glColor4f(1.0,1.0,1.0,1.0); - glPushMatrix(); - - - //glTranslatef(this->vw*.5,this->vh*.5 , -1.0); - glTranslatef(0,0.5 , -1.0); - - glScalef(easein3,easein3,30*.0025); - - glRotatef(easein2*360,1,0,0); - - - //glTranslatef(-.5*this->vw,0, 0.0); - - //poly_font->Depth(1.0); - poly_font->FaceSize(22); - - glRasterPos2f(0.0, 0.0); - if ( this->title != NULL ) { - poly_font->Render(this->title ); - } else { - poly_font->Render("Unknown" ); - } - // poly_font->Depth(0.0); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glPopMatrix(); - - this->drawtitle++; - - } -#endif /** USE_FTGL */ -} - -void projectM::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))); - - if ( this->title != NULL ) { - title_font->Render(this->title ); - } else { - title_font->Render("Unknown" ); - } - // glPopMatrix(); - //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - -#endif /** USE_FTGL */ -} -void projectM::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 ); - - - - //glPopMatrix(); - // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); -#endif /** USE_FTGL */ -} - -void projectM::draw_help( ) { - -#ifdef USE_FTGL -//glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); - DWRITE("pre-help"); - 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); - DWRITE("post-help"); -#endif /** USE_FTGL */ -} - -void projectM::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*(this->vh/512.0))); - - sprintf( buffer, " texsize: %d", this->texsize); - other_font->Render(buffer); - - glRasterPos2f(0, -.13+offset); - sprintf( buffer, "viewport: %d x %d", this->vw, this->vh); - other_font->Render(buffer); - /* REME: FIX - glRasterPos2f(0, -.17+offset); - other_font->Render((this->renderer->renderTarget->usePbuffers ? " FBO: on" : " FBO: off")); - */ - glRasterPos2f(0, -.21+offset); - sprintf( buffer, " mesh: %d x %d", this->presetInputs.gx,this->presetInputs.gy); - other_font->Render(buffer); - - - glPopMatrix(); - // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - - -#endif /** USE_FTGL */ -} -void projectM::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 */ -} -//Here we render the interpolated mesh, and then apply the texture to it. -//Well, we actually do the inverse, but its all the same. -void projectM::render_interpolation() { - - - } - - -//Actually draws the texture to the screen -// -//The Video Echo effect is also applied here -void projectM::render_texture_to_screen() { - - int flipx=1,flipy=1; - //glBindTexture( GL_TEXTURE_2D,this->renderTarget->textureID[0] ); - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - - glClear( GL_DEPTH_BUFFER_BIT ); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0, 0, -15); - - 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_DECAL); - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); - - // glClear(GL_ACCUM_BUFFER_BIT); - glColor4d(0.0, 0.0, 0.0,1.0f); - - DWRITE( "rendering texture to screen\n" ); - - glBegin(GL_QUADS); - glVertex3d( 0, 0, -1 ); - glVertex4d(-0.5,-0.5,-1,1); - glVertex4d(-0.5, 0.5,-1,1); - glVertex4d(0.5, 0.5,-1,1); - glVertex4d(0.5, -0.5,-1,1); - glEnd(); - - - glEnable(GL_TEXTURE_2D); - //glBindTexture( GL_TEXTURE_2D, this->renderTarget->textureID[0] ); -// glBindTexture( GL_TEXTURE_2D, this->renderTarget->textureID ); - - // glAccum(GL_LOAD,0); - // if (bDarken==1) glBlendFunc(GL_SRC_COLOR,GL_ZERO); - - //Draw giant rectangle and texture it with our texture! - glBegin(GL_QUADS); - glTexCoord4d(0, 1,0,1); glVertex4d(-0.5,-0.5,-1,1); - glTexCoord4d(0, 0,0,1); glVertex4d(-0.5, 0.5,-1,1); - glTexCoord4d(1, 0,0,1); glVertex4d(0.5, 0.5,-1,1); - glTexCoord4d(1, 1,0,1); glVertex4d(0.5, -0.5,-1,1); - glEnd(); - - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - // if (bDarken==1) glBlendFunc(GL_SRC_COLOR,GL_ONE_MINUS_SRC_ALPHA); - - // if (bDarken==1) { glAccum(GL_ACCUM,1-fVideoEchoAlpha); glBlendFunc(GL_SRC_COLOR,GL_ZERO); } - - glMatrixMode(GL_TEXTURE); - - //draw video echo - glColor4f(0.0, 0.0, 0.0,this->presetOutputs.fVideoEchoAlpha); - glTranslatef(.5,.5,0); - glScalef(1.0/this->presetOutputs.fVideoEchoZoom,1.0/this->presetOutputs.fVideoEchoZoom,1); - glTranslatef(-.5,-.5,0); - - switch (((int)this->presetOutputs.nVideoEchoOrientation)) - { - case 0: flipx=1;flipy=1;break; - case 1: flipx=-1;flipy=1;break; - case 2: flipx=1;flipy=-1;break; - case 3: flipx=-1;flipy=-1;break; - default: flipx=1;flipy=1; break; - } - glBegin(GL_QUADS); - glTexCoord4d(0, 1,0,1); glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glTexCoord4d(0, 0,0,1); glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glTexCoord4d(1, 0,0,1); glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glTexCoord4d(1, 1,0,1); glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - - - glDisable(GL_TEXTURE_2D); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - - if (this->presetOutputs.bBrighten==1) - { - glColor4f(1.0, 1.0, 1.0,1.0); - glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); - glBegin(GL_QUADS); - glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - glBlendFunc(GL_ZERO, GL_DST_COLOR); - glBegin(GL_QUADS); - glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); - glBegin(GL_QUADS); - glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } - - if (this->presetOutputs.bDarken==1) - { - - glColor4f(1.0, 1.0, 1.0,1.0); - glBlendFunc(GL_ZERO,GL_DST_COLOR); - glBegin(GL_QUADS); - glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - - - - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } - - - if (this->presetOutputs.bSolarize) - { - - glColor4f(1.0, 1.0, 1.0,1.0); - glBlendFunc(GL_ZERO,GL_ONE_MINUS_DST_COLOR); - glBegin(GL_QUADS); - glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - glBlendFunc(GL_DST_COLOR,GL_ONE); - glBegin(GL_QUADS); - glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - - - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - } - - if (this->presetOutputs.bInvert) - { - glColor4f(1.0, 1.0, 1.0,1.0); - glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); - glBegin(GL_QUADS); - glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - } -} -void projectM::render_texture_to_studio() { - - int x,y; - int flipx=1,flipy=1; - - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - - glClear( GL_DEPTH_BUFFER_BIT ); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0, 0, -15); - - 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_DECAL); - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); - - // glClear(GL_ACCUM_BUFFER_BIT); - glColor4f(0.0, 0.0, 0.0,0.04); - - - glBegin(GL_QUADS); - glVertex4d(-0.5,-0.5,-1,1); - glVertex4d(-0.5, 0.5,-1,1); - glVertex4d(0.5, 0.5,-1,1); - glVertex4d(0.5, -0.5,-1,1); - glEnd(); - - - glColor4f(0.0, 0.0, 0.0,1.0); - - glBegin(GL_QUADS); - glVertex4d(-0.5,0,-1,1); - glVertex4d(-0.5, 0.5,-1,1); - glVertex4d(0.5, 0.5,-1,1); - glVertex4d(0.5, 0,-1,1); - glEnd(); - - glBegin(GL_QUADS); - glVertex4d(0,-0.5,-1,1); - glVertex4d(0, 0.5,-1,1); - glVertex4d(0.5, 0.5,-1,1); - glVertex4d(0.5, -0.5,-1,1); - glEnd(); - - glPushMatrix(); - glTranslatef(.25, .25, 0); - glScalef(.5,.5,1); - - glEnable(GL_TEXTURE_2D); - - - //Draw giant rectangle and texture it with our texture! - glBegin(GL_QUADS); - glTexCoord4d(0, 1,0,1); glVertex4d(-0.5,-0.5,-1,1); - glTexCoord4d(0, 0,0,1); glVertex4d(-0.5, 0.5,-1,1); - glTexCoord4d(1, 0,0,1); glVertex4d(0.5, 0.5,-1,1); - glTexCoord4d(1, 1,0,1); glVertex4d(0.5, -0.5,-1,1); - glEnd(); - - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - - glMatrixMode(GL_TEXTURE); - - //draw video echo - glColor4f(0.0, 0.0, 0.0,this->presetOutputs.fVideoEchoAlpha); - glTranslated(.5,.5,0); - glScaled(1/this->presetOutputs.fVideoEchoZoom,1/this->presetOutputs.fVideoEchoZoom,1); - glTranslated(-.5,-.5,0); - - switch (((int)this->presetOutputs.nVideoEchoOrientation)) - { - case 0: flipx=1;flipy=1;break; - case 1: flipx=-1;flipy=1;break; - case 2: flipx=1;flipy=-1;break; - case 3: flipx=-1;flipy=-1;break; - default: flipx=1;flipy=1; break; - } - glBegin(GL_QUADS); - glTexCoord4d(0, 1,0,1); glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glTexCoord4d(0, 0,0,1); glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glTexCoord4d(1, 0,0,1); glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glTexCoord4d(1, 1,0,1); glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - - - //glDisable(GL_TEXTURE_2D); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - // if (bDarken==1) { glAccum(GL_ACCUM,fVideoEchoAlpha); glAccum(GL_RETURN,1);} - - - if (this->presetOutputs.bInvert) - { - glColor4f(1.0, 1.0, 1.0,1.0); - glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); - glBegin(GL_QUADS); - glVertex4f(-0.5*flipx,-0.5*flipy,-1,1); - glVertex4f(-0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, 0.5*flipy,-1,1); - glVertex4f(0.5*flipx, -0.5*flipy,-1,1); - glEnd(); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - } - - // glTranslated(.5,.5,0); - // glScaled(1/fVideoEchoZoom,1/fVideoEchoZoom,1); - // glTranslated(-.5,-.5,0); - //glTranslatef(0,.5*vh,0); - - /** Per-pixel mesh display -- bottom-right corner */ - //glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); - - glDisable(GL_TEXTURE_2D); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glPushMatrix(); - glTranslatef(.25, -.25, 0); - glScalef(.5,.5,1); - glColor4f(1.0,1.0,1.0,1.0); - - for (x=0;xpresetInputs.gx;x++){ - glBegin(GL_LINE_STRIP); - for(y=0;ypresetInputs.gy;y++){ - glVertex4f((this->presetInputs.x_mesh[x][y]-.5), (this->presetInputs.y_mesh[x][y]-.5),-1,1); - //glVertex4f((origx[x+1][y]-.5) * vw, (origy[x+1][y]-.5) *vh ,-1,1); - } - glEnd(); - } - - for (y=0;ypresetInputs.gy;y++){ - glBegin(GL_LINE_STRIP); - for(x=0;xpresetInputs.gx;x++){ - glVertex4f((this->presetInputs.x_mesh[x][y]-.5), (this->presetInputs.y_mesh[x][y]-.5),-1,1); - //glVertex4f((origx[x+1][y]-.5) * vw, (origy[x+1][y]-.5) *vh ,-1,1); - } - glEnd(); - } - - glEnable( GL_TEXTURE_2D ); - - /* - for (x=0;xpresetInputs.gx-1;x++){ - glBegin(GL_POINTS); - for(y=0;ypresetInputs.gy;y++){ - glVertex4f((this->origx[x][y]-.5)* this->vw, (this->origy[x][y]-.5)*this->vh,-1,1); - glVertex4f((this->origx[x+1][y]-.5) * this->vw, (this->origy[x+1][y]-.5) *this->vh ,-1,1); - } - glEnd(); - } - */ - // glTranslated(-.5,-.5,0); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - - /** Waveform display -- bottom-left */ - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glTranslatef(-.5,0, 0); - - glTranslatef(0,-0.10, 0); - glBegin(GL_LINE_STRIP); - glColor4f(0,1.0,1.0,1.0); - glVertex3f((((this->totalframes%256)/551.0)), beatDetect->treb_att*-7,-1); - glColor4f(1.0,1.0,1.0,1.0); - glVertex3f((((this->totalframes%256)/551.0)),0 ,-1); - glColor4f(.5,1.0,1.0,1.0); - glVertex3f((((this->totalframes%256)/551.0)), beatDetect->treb*7,-1); - glEnd(); - - glTranslatef(0,-0.13, 0); - glBegin(GL_LINE_STRIP); - glColor4f(0,1.0,0.0,1.0); - glVertex3f((((this->totalframes%256)/551.0)), beatDetect->mid_att*-7,-1); - glColor4f(1.0,1.0,1.0,1.0); - glVertex3f((((this->totalframes%256)/551.0)),0 ,-1); - glColor4f(.5,1.0,0.0,0.5); - glVertex3f((((this->totalframes%256)/551.0)), beatDetect->mid*7,-1); - glEnd(); - - - glTranslatef(0,-0.13, 0); - glBegin(GL_LINE_STRIP); - glColor4f(1.0,0.0,0.0,1.0); - glVertex3f((((this->totalframes%256)/551.0)), beatDetect->bass_att*-7,-1); - glColor4f(1.0,1.0,1.0,1.0); - glVertex3f((((this->totalframes%256)/551.0)),0 ,-1); - glColor4f(.7,0.2,0.2,1.0); - glVertex3f((((this->totalframes%256)/551.0)), beatDetect->bass*7,-1); - glEnd(); - - glTranslatef(0,-0.13, 0); - glBegin(GL_LINES); - - glColor4f(1.0,1.0,1.0,1.0); - glVertex3f((((this->totalframes%256)/551.0)),0 ,-1); - glColor4f(1.0,0.6,1.0,1.0); - glVertex3f((((this->totalframes%256)/551.0)), beatDetect->vol*7,-1); - glEnd(); - - glPopMatrix(); - - glDisable(GL_TEXTURE_2D); -} - DLLEXPORT void projectM::projectM_initengine() { @@ -1147,9 +495,6 @@ this->presetOutputs.q8 = 0; /* Reinitializes the engine variables to a default (conservative and sane) value */ DLLEXPORT void projectM::projectM_resetengine() { - this->doPerPixelEffects = 1; - this->doIterative = 1; - this->presetOutputs.zoom=1.0; this->presetOutputs.zoomexp= 1.0; this->presetOutputs.rot= 0.0; @@ -1275,9 +620,8 @@ DLLEXPORT void projectM::projectM_resetGL( int w, int h ) { DWRITE( "projectM_resetGL(): in: %d x %d\n", w, h ); /** Stash the new dimensions */ - this->vw = w; - this->vh = h; - this->aspect=(float)h / (float)w; + + renderer->reset(w,h); } diff --git a/src/projectM-engine/projectM.h b/src/projectM-engine/projectM.h index b864160cb..a07bf6650 100755 --- a/src/projectM-engine/projectM.h +++ b/src/projectM-engine/projectM.h @@ -119,14 +119,12 @@ public: static projectM *currentEngine; static Preset *activePreset; static Renderer *renderer; + static RenderTarget *renderTarget; char *presetURL; char *presetName; char *fontURL; - int gx,gy; - int texsize; - int hasInit; int noSwitch; @@ -134,13 +132,6 @@ public: int freqframes; int totalframes; - int showfps; - int showtitle; - int showpreset; - int showhelp; - int showstats; - - int studio; GLubyte *fbuffer; @@ -168,8 +159,7 @@ public: int fvh; int wvw; //windowed dimensions int wvh; - int vw; //runtime dimensions - int vh; + int fullscreen; int avgtime; //# frames per preset @@ -177,20 +167,7 @@ public: char *title; int drawtitle; - int correction; - float aspect; - - //per pixel equation variables - float **gridx; //grid containing interpolated mesh - float **gridy; - float **origtheta; //grid containing interpolated mesh reference values - float **origrad; - float **origx; //original mesh - float **origy; - float **origx2; //original mesh - float **origy2; - - int mesh_i, mesh_j; + /** Timing information */ int mspf; @@ -202,8 +179,6 @@ public: fpsstart; /** Various toggles */ - int doPerPixelEffects; - int doIterative; /* PER_FRAME CONSTANTS END */ /** Beat detection engine */ @@ -221,7 +196,7 @@ public: /** Functions */ DLLEXPORT projectM(); - DLLEXPORT void projectM_init(); + DLLEXPORT void projectM_init(int gx, int gy, int texsize, int width, int height); DLLEXPORT void projectM_reset(); DLLEXPORT void projectM_resetGL( int width, int height ); DLLEXPORT void projectM_setTitle( char *title );