diff --git a/src/projectM-engine/PresetFrameIO.cpp b/src/projectM-engine/PresetFrameIO.cpp index 7ab064f2b..b9a109ab6 100644 --- a/src/projectM-engine/PresetFrameIO.cpp +++ b/src/projectM-engine/PresetFrameIO.cpp @@ -3,6 +3,10 @@ PresetInputs(int gx, int gy) { int x, y; + + this->gx =gx; + this->gy=gy; + this->x_mesh=(float **)wipemalloc(gx * sizeof(float *)); for(x = 0; x < gx; x++) { @@ -24,6 +28,38 @@ PresetInputs(int gx, int gy) { this->theta_mesh[x] = (float *)wipemalloc(gy * sizeof(float)); } + + this->origtheta=(float **)wipemalloc(gx * sizeof(float *)); + for(x = 0; x < gx; x++) + { + this->origtheta[x] = (float *)wipemalloc(gy * sizeof(float)); + } + this->origrad=(float **)wipemalloc(gx * sizeof(float *)); + for(x = 0; x < gx; x++) + { + this->origrad[x] = (float *)wipemalloc(gy * sizeof(float)); + } + this->origx=(float **)wipemalloc(gx * sizeof(float *)); + for(x = 0; x < gx; x++) + { + this->origx[x] = (float *)wipemalloc(gy * sizeof(float)); + } + this->origy=(float **)wipemalloc(gx * sizeof(float *)); + for(x = 0; x < gx; x++) + { + this->origy[x] = (float *)wipemalloc(gy * sizeof(float)); + } + +for (x=0;xorigx[x][y]=x/(float)(gx-1); + 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)); + } + } } @@ -75,3 +111,61 @@ PresetOutputs(int gx, int gy) this->rot_mesh[x] = (float *)wipemalloc(this->gy * sizeof(float)); } } + +~presetInputs() +{ + for(x = 0; x < this->gx; x++) + { + + + free(this->origtheta[x]); + free(this->origrad[x]); + free(this->origx[x]); + free(this->origy[x]); + + free(this->x_mesh[x]); + free(this->mesh[x]); + free(this->rad_mesh[x]); + free(this->theta_mesh[x]); + + } + + + free(this->origx); + free(this->origy); + free(this->origrad); + free(this->origtheta); + + free(this->x_mesh); + free(this->y_mesh); + free(this->rad_mesh); + free(this->theta_mesh); + + this->origx = NULL; + this->origy = NULL; + this->origtheta = NULL; + this->origrad = NULL; + + this->x_mesh = NULL; + this->y_mesh = NULL; + this->rad_mesh = NULL; + this->theta_mesh = NULL; +} + +PresetInputs::ResetMesh() +{ + int x,y; + + + for (x=0;xgx;x++) + { + for(y=0;ygy;y++) + { + x_mesh[x][y]=this->origx[x][y]; + y_mesh[x][y]=this->origy[x][y]; + rad_mesh[x][y]=this->origrad[x][y]; + theta_mesh[x][y]=this->origtheta[x][y]; + } + } + + } \ No newline at end of file diff --git a/src/projectM-engine/PresetFrameIO.hpp b/src/projectM-engine/PresetFrameIO.hpp index 2879384f2..a46b11fcb 100644 --- a/src/projectM-engine/PresetFrameIO.hpp +++ b/src/projectM-engine/PresetFrameIO.hpp @@ -166,6 +166,13 @@ public: float **y_mesh; float **rad_mesh; float **theta_mesh; + + float **origtheta; //grid containing interpolated mesh reference values + float **origrad; + float **origx; //original mesh + float **origy; + + void ResetMesh(); }; #endif diff --git a/src/projectM-engine/Renderer.cpp b/src/projectM-engine/Renderer.cpp index 0ba0fd99c..e6c741fca 100644 --- a/src/projectM-engine/Renderer.cpp +++ b/src/projectM-engine/Renderer.cpp @@ -2,20 +2,28 @@ #include "wipemalloc.h" #include "math.h" #include "common.h" +#include "console_interface.h" -Renderer::Renderer(int width, int height, int gx, int gy, RenderTarget *renderTarget) + + +Renderer::Renderer(int width, int height, int gx, int gy, RenderTarget *renderTarget, BeatDetect *beatDetect, char* fontURL) { int x; int y; this->gx=gx; this->gy=gy; + this->totalframes = 1; + this->noSwitch = 0; this->showfps = 0; this->showtitle = 0; this->showpreset = 0; this->showhelp = 0; this->showstats = 0; this->studio = 0; +this->realfps=0; + + this->title = NULL; /** Other stuff... */ this->correction = 1; @@ -31,26 +39,7 @@ Renderer::Renderer(int width, int height, int gx, int gy, RenderTarget *renderTa { this->gridy[x] = (float *)wipemalloc(gy * sizeof(float)); } - this->origtheta=(float **)wipemalloc(gx * sizeof(float *)); - for(x = 0; x < gx; x++) - { - this->origtheta[x] = (float *)wipemalloc(gy * sizeof(float)); - } - this->origrad=(float **)wipemalloc(gx * sizeof(float *)); - for(x = 0; x < gx; x++) - { - this->origrad[x] = (float *)wipemalloc(gy * sizeof(float)); - } - this->origx=(float **)wipemalloc(gx * sizeof(float *)); - for(x = 0; x < gx; x++) - { - this->origx[x] = (float *)wipemalloc(gy * sizeof(float)); - } - this->origy=(float **)wipemalloc(gx * sizeof(float *)); - for(x = 0; x < gx; x++) - { - this->origy[x] = (float *)wipemalloc(gy * sizeof(float)); - } + this->origx2=(float **)wipemalloc(gx * sizeof(float *)); for(x = 0; x < gx; x++) { @@ -67,23 +56,32 @@ this->origy2=(float **)wipemalloc(gx * sizeof(float *)); for (x=0;xorigx[x][y]=x/(float)(gx-1); - 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]*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; + { + + float origx=x/(float)(gx-1); + float origy=-((y/(float)(gy-1))-1); + this->gridx[x][y]=origx*renderTarget->texsize; + this->gridy[x][y]=origy*renderTarget->texsize; + this->origx2[x][y]=( origx-.5)*2; + this->origy2[x][y]=( origy-.5)*2; }} -this->renderTarget = renderTarget; +this->renderTarget = renderTarget; +this->beatDetect = beatDetect; +this->fontURL = fontURL; + +#ifdef USE_FTGL + /** Reset fonts */ + title_font = NULL; + other_font = NULL; + poly_font = NULL; +#endif /** USE_FTGL */ } void Renderer::RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInputs) { +totalframes++; reset_per_pixel_matrices(); DWRITE( "start Pass 1 \n" ); @@ -133,7 +131,7 @@ void Renderer::RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInp DWRITE( "renderFrame: renderTarget->texsize: %d x %d\n", this->renderTarget->texsize, this->renderTarget->texsize ); - PerPixelMath(presetOutputs); + PerPixelMath(presetOutputs, presetInputs); if(this->renderTarget->usePbuffers) { @@ -148,13 +146,13 @@ void Renderer::RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInp // if(!this->renderTarget->usePbuffers) { - draw_motion_vectors(); //draw motion vectors + draw_motion_vectors(presetOutputs); //draw motion vectors } - draw_shapes(); - draw_custom_waves(); - draw_waveform(); + draw_shapes(presetOutputs); + draw_custom_waves(presetOutputs); + draw_waveform(presetOutputs, presetInputs); if(presetOutputs->bDarkenCenter)darken_center(); - draw_borders(); //draw borders + draw_borders(presetOutputs); //draw borders /** Restore original view state */ glMatrixMode( GL_MODELVIEW ); @@ -202,8 +200,9 @@ void Renderer::RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInp glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLineWidth( this->renderTarget->texsize < 512 ? 1 : this->renderTarget->texsize/512.0); - if(this->studio%2)render_texture_to_studio(); - else render_texture_to_screen(); + //if(this->studio%2)render_texture_to_studio(); + //else + render_texture_to_screen(presetOutputs); // glClear(GL_COLOR_BUFFER_BIT); //render_Studio(); @@ -218,7 +217,7 @@ void Renderer::RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInp 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(); + if(this->showstats%2)draw_stats(presetInputs); glTranslatef(0.5 ,0.5,1); DWRITE( "end pass2\n" ); @@ -253,7 +252,7 @@ void Renderer::Interpolation(PresetOutputs *presetOutputs, PresetInputs *presetI glBegin(GL_TRIANGLE_STRIP); for(y=0;ygy;y++){ glTexCoord2f(presetInputs->x_mesh[x][y], presetInputs->y_mesh[x][y]); - glVertex2f(this->gridx[x][-], this->gridy[x][y]); + glVertex2f(this->gridx[x][y], 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]); } @@ -321,54 +320,37 @@ void Renderer::PerFrame(PresetOutputs *presetOutputs) } -~Renderer() { +Renderer::~Renderer() { int x; - for(x = 0; x < presetInputs.gx; x++) + for(x = 0; x < this->gx; x++) { free(this->gridx[x]); - free(this->gridy[x]); - free(this->origtheta[x]); - free(this->origrad[x]); - free(this->origx[x]); - free(this->origy[x]); + free(this->gridy[x]); free(this->origx2[x]); free(this->origy2[x]); - free(presetInputs.x_mesh[x]); - free(presetInputs.y_mesh[x]); - free(presetInputs.rad_mesh[x]); - free(presetInputs.theta_mesh[x]); + } - - free(this->origx); - free(this->origy); free(this->origx2); free(this->origy2); free(this->gridx); free(this->gridy); - free(presetInputs.x_mesh); - free(presetInputs.y_mesh); - free(presetInputs.rad_mesh); - free(presetInputs.theta_mesh); + - this->origx = NULL; - this->origy = NULL; + this->origx2 = NULL; this->origy2 = NULL; this->gridx = NULL; this->gridy = NULL; - presetInputs.x_mesh = NULL; - presetInputs.y_mesh = NULL; - presetInputs.rad_mesh = NULL; - presetInputs.theta_mesh = NULL; + } -void Renderer::PerPixelMath(PresetOutputs *presetOutputs) { +void Renderer::PerPixelMath(PresetOutputs *presetOutputs, PresetInputs *presetInputs) { int x,y; float fZoom2,fZoom2Inv; @@ -380,7 +362,7 @@ void Renderer::PerPixelMath(PresetOutputs *presetOutputs) { for (x=0;xgx;x++){ for(y=0;ygy;y++){ - presetOutputs->cx_mesh[x][y]=presetOutputss.cx; + presetOutputs->cx_mesh[x][y]=presetOutputs->cx; } } @@ -451,54 +433,54 @@ void Renderer::PerPixelMath(PresetOutputs *presetOutputs) { for (x=0;xgx;x++){ for(y=0;ygy;y++){ - fZoom2 = powf( presetOutputs->zoom_mesh[x][y], powf( presetOutputs->zoomexp_mesh[x][y], rad_mesh[x][y]*2.0f - 1.0f)); + fZoom2 = powf( presetOutputs->zoom_mesh[x][y], powf( presetOutputs->zoomexp_mesh[x][y], presetInputs->rad_mesh[x][y]*2.0f - 1.0f)); fZoom2Inv = 1.0f/fZoom2; - x_mesh[x][y]= this->origx2[x][y]*0.5f*fZoom2Inv + 0.5f; - y_mesh[x][y]= this->origy2[x][y]*0.5f*fZoom2Inv + 0.5f; + presetInputs->x_mesh[x][y]= this->origx2[x][y]*0.5f*fZoom2Inv + 0.5f; + presetInputs->y_mesh[x][y]= this->origy2[x][y]*0.5f*fZoom2Inv + 0.5f; } } for (x=0;xgx;x++){ for(y=0;ygy;y++){ - x_mesh[x][y] = ( x_mesh[x][y] - presetOutputs->cx_mesh[x][y])/presetOutputs->sx_mesh[x][y] + presetOutputs->cx_mesh[x][y]; + presetInputs->x_mesh[x][y] = ( presetInputs->x_mesh[x][y] - presetOutputs->cx_mesh[x][y])/presetOutputs->sx_mesh[x][y] + presetOutputs->cx_mesh[x][y]; } } for (x=0;xgx;x++){ for(y=0;ygy;y++){ - y_mesh[x][y] = ( y_mesh[x][y] - presetOutputs->cy_mesh[x][y])/presetOutputs->sy_mesh[x][y] + presetOutputs->cy_mesh[x][y]; + presetInputs->y_mesh[x][y] = ( presetInputs->y_mesh[x][y] - presetOutputs->cy_mesh[x][y])/presetOutputs->sy_mesh[x][y] + presetOutputs->cy_mesh[x][y]; } } for (x=0;xgx;x++){ for(y=0;ygy;y++){ - float u2 = x_mesh[x][y] - presetOutputs->cx_mesh[x][y]; - float v2 = y_mesh[x][y] - presetOutputs->cy_mesh[x][y]; + float u2 = presetInputs->x_mesh[x][y] - presetOutputs->cx_mesh[x][y]; + float v2 = presetInputs->y_mesh[x][y] - presetOutputs->cy_mesh[x][y]; float cos_rot = cosf(presetOutputs->rot_mesh[x][y]); float sin_rot = sinf(presetOutputs->rot_mesh[x][y]); - x_mesh[x][y] = u2*cos_rot - v2*sin_rot + presetOutputs->cx_mesh[x][y]; - y_mesh[x][y] = u2*sin_rot + v2*cos_rot + presetOutputs->cy_mesh[x][y]; + presetInputs->x_mesh[x][y] = u2*cos_rot - v2*sin_rot + presetOutputs->cx_mesh[x][y]; + presetInputs->y_mesh[x][y] = u2*sin_rot + v2*cos_rot + presetOutputs->cy_mesh[x][y]; } } - if(presetOutput->dx_is_mesh) + if(presetOutputs->dx_is_mesh) { for (x=0;xgx;x++){ for(y=0;ygy;y++){ - x_mesh[x][y] -= presetOutputs->dx_mesh[x][y]; + presetInputs->x_mesh[x][y] -= presetOutputs->dx_mesh[x][y]; } } } - if(presetOutput->dy_is_mesh) + if(presetOutputs->dy_is_mesh) { for (x=0;xgx;x++){ for(y=0;ygy;y++){ - y_mesh[x][y] -= presetOutputs->dy_mesh[x][y]; + presetInputs->y_mesh[x][y] -= presetOutputs->dy_mesh[x][y]; } } @@ -506,18 +488,7 @@ void Renderer::PerPixelMath(PresetOutputs *presetOutputs) { } -void Renderer::rescale_per_pixel_matrices() { - int x, y; - - for ( x = 0 ; x < this->gx ; x++ ) { - for ( y = 0 ; y < this->gy ; y++ ) { - this->gridx[x][y]=this->origx[x][y]; - this->gridy[x][y]=this->origy[x][y]; - - } - } - } void Renderer::reset(int w, int h) { @@ -525,15 +496,10 @@ void Renderer::reset(int w, int h) this -> vw = w; this -> vh = h; - if (!this->renderTarget->usePbuffers) { - createPBuffers(w,h,this->renderTarget); - } - - if ( this->fbuffer != NULL ) { - free( this->fbuffer ); - } - this->fbuffer = - (GLubyte *)malloc( sizeof( GLubyte ) * this->renderTarget->texsize * this->renderTarget->texsize * 3 ); +//FIXME maybe needs called elsewhere + //if (!this->renderTarget->usePbuffers) { + // renderTarge->createPBuffers(w,h,this->renderTarget); + // } /* Our shading model--Gouraud (smooth). */ glShadeModel( GL_SMOOTH); @@ -587,7 +553,7 @@ void Renderer::reset(int w, int h) #ifdef USE_FTGL /**f Load the standard fonts */ if ( title_font == NULL && other_font == NULL ) { - + char path[1024]; sprintf( path, "%s%cVera.ttf", this->fontURL, PATH_SEPARATOR ); title_font = new FTGLPixmapFont(path); @@ -599,27 +565,11 @@ void Renderer::reset(int w, int h) #endif /** USE_FTGL */ } -void Renderer::reset_per_pixel_matrices() { - - int x,y; - - - for (x=0;xgx;x++) - { - for(y=0;ygy;y++) - { - x_mesh[x][y]=this->origx[x][y]; - y_mesh[x][y]=this->origy[x][y]; - rad_mesh[x][y]=this->origrad[x][y]; - theta_mesh[x][y]=this->origtheta[x][y]; - } - } - - } -void Renderer::draw_custom_waves() { + +void Renderer::draw_custom_waves(PresetOutputs *presetOutputs) { int x; CustomWave *wavecode; @@ -684,7 +634,7 @@ void Renderer::draw_custom_waves() { } -void Renderer::draw_shapes() { +void Renderer::draw_shapes(PresetOutputs *presetOutputs) { int i; @@ -833,7 +783,7 @@ void Renderer::draw_shapes() { } -void Renderer::draw_waveform() { +void Renderer::draw_waveform(PresetOutputs *presetOutputs, PresetInputs *presetInputs) { int x; @@ -856,7 +806,7 @@ void Renderer::draw_waveform() { glMatrixMode( GL_MODELVIEW ); glPushMatrix(); - modulate_opacity_by_volume(); + modulate_opacity_by_volume(presetOutputs); maximize_colors(); if(presetOutputs->bWaveDots==1) glEnable(GL_LINE_STIPPLE); @@ -965,7 +915,7 @@ void Renderer::draw_waveform() { // ( co*beatDetect->pcm->pcmdataL[x]+ (1-co)*beatDetect->pcm->pcmdataL[-(x-(beatDetect->pcm->numsamples-1))]) // *25*presetOutputs->fWaveScale); r=(0.5 + 0.4f*.12*beatDetect->pcm->pcmdataR[x]*presetOutputs->fWaveScale + presetOutputs->wave_mystery)*.5; - theta=(x)*inv_nverts_minus_one*6.28f + this->Time*0.2f; + theta=(x)*inv_nverts_minus_one*6.28f + presetInputs->time*0.2f; /* if (x < 51) { @@ -1022,7 +972,7 @@ void Renderer::draw_waveform() { //theta=((this->frame%256)*(2*6.28/512.0))+beatDetect->pcm->pcmdataL[x]*.2*presetOutputs->fWaveScale; //r= ((1+2*presetOutputs->wave_mystery)*(this->renderTarget->texsize/5.0)+ // (beatDetect->pcm->pcmdataL[x]-beatDetect->pcm->pcmdataL[x-1])*80*presetOutputs->fWaveScale); - theta=beatDetect->pcm->pcmdataL[x+32]*0.06*presetOutputs->fWaveScale * 1.57 + this->Time*2.3; + theta=beatDetect->pcm->pcmdataL[x+32]*0.06*presetOutputs->fWaveScale * 1.57 + presetInputs->time*2.3; r=(0.53 + 0.43*beatDetect->pcm->pcmdataR[x]*0.12*presetOutputs->fWaveScale+ presetOutputs->wave_mystery)*.5; @@ -1139,8 +1089,8 @@ void Renderer::draw_waveform() { presetOutputs->wave_y=-1*(presetOutputs->wave_y-1.0); - cos_rot = cosf(this->Time*0.3f); - sin_rot = sinf(this->Time*0.3f); + cos_rot = cosf(presetInputs->time*0.3f); + sin_rot = sinf(presetInputs->time*0.3f); glBegin(GL_LINE_STRIP); @@ -1346,7 +1296,7 @@ void Renderer::darken_center() { } -void Renderer::modulate_opacity_by_volume() { +void Renderer::modulate_opacity_by_volume(PresetOutputs *presetOutputs) { //modulate volume by opacity // @@ -1362,7 +1312,7 @@ void Renderer::modulate_opacity_by_volume() { else presetOutputs->wave_o=presetOutputs->fWaveAlpha; } -void Renderer::draw_motion_vectors() { +void Renderer::draw_motion_vectors(PresetOutputs *presetOutputs) { int x,y; @@ -1396,7 +1346,7 @@ void Renderer::draw_motion_vectors() { } -void Renderer::draw_borders() { +void Renderer::draw_borders(PresetOutputs *presetOutputs) { //Draw Borders float of=presetOutputs->ob_size*.5; @@ -1603,7 +1553,7 @@ void Renderer::draw_help( ) { #endif /** USE_FTGL */ } -void Renderer::draw_stats() { +void Renderer::draw_stats(PresetInputs *presetInputs) { #ifdef USE_FTGL char buffer[128]; @@ -1623,7 +1573,7 @@ sprintf( buffer, " (%f)", this->aspect); glRasterPos2f(0, -.09+offset); other_font->FaceSize((unsigned)(18*(this->vh/512.0))); - sprintf( buffer, " texsize: %d", this->texsize); + sprintf( buffer, " texsize: %d", this->renderTarget->texsize); other_font->Render(buffer); glRasterPos2f(0, -.13+offset); @@ -1668,7 +1618,7 @@ void Renderer::draw_fps( float realfps ) { //Actually draws the texture to the screen // //The Video Echo effect is also applied here -void Renderer::render_texture_to_screen() { +void Renderer::render_texture_to_screen(PresetOutputs *presetOutputs) { int flipx=1,flipy=1; //glBindTexture( GL_TEXTURE_2D,this->renderTarget->textureID[0] ); @@ -1834,6 +1784,7 @@ void Renderer::render_texture_to_screen() { glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } } +/* void Renderer::render_texture_to_studio() { int x,y; @@ -1947,7 +1898,7 @@ void Renderer::render_texture_to_studio() { // 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); @@ -1978,19 +1929,10 @@ void Renderer::render_texture_to_studio() { 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 */ + // Waveform display -- bottom-left glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glMatrixMode(GL_MODELVIEW); glPushMatrix(); @@ -2040,3 +1982,6 @@ void Renderer::render_texture_to_studio() { glDisable(GL_TEXTURE_2D); } + +*/ + diff --git a/src/projectM-engine/Renderer.hpp b/src/projectM-engine/Renderer.hpp index c733ea757..064900ec4 100644 --- a/src/projectM-engine/Renderer.hpp +++ b/src/projectM-engine/Renderer.hpp @@ -3,17 +3,24 @@ #include "pbuffer.h" #include "PresetFrameIO.hpp" +#include "BeatDetect.h" + + + +#ifdef USE_FTGL +#include +#include +#include +#endif /** USE_FTGL */ + class Renderer { RenderTarget *renderTarget; + BeatDetect *beatDetect; //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 gx; @@ -24,6 +31,12 @@ class Renderer float aspect; +#ifdef USE_FTGL +FTGLPixmapFont *title_font; +FTGLPixmapFont *other_font; +FTGLPolygonFont *poly_font; +#endif /** USE_FTGL */ + public: int mesh_i, mesh_j; @@ -36,7 +49,17 @@ class Renderer int studio; int correction; - Renderer( int width, int height, int gx, int gy, RenderTarget *renderTarget); + char *presetName; + char *fontURL; + + int noSwitch; + + int totalframes; +float realfps; +char *title; + int drawtitle; + + Renderer( int width, int height, int gx, int gy, RenderTarget *renderTarget, BeatDetect *beatDetect, char *fontURL); ~Renderer(); void RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInputs); void reset(int w, int h); @@ -45,10 +68,26 @@ private: void PerFrame(PresetOutputs *presetOutputs); void Interpolation(PresetOutputs *presetOutputs, PresetInputs *presetInputs); - void PerPixelMath(PresetOutputs *presetOutputs); + void PerPixelMath(PresetOutputs *presetOutputs, PresetInputs *presetInputs); void reset_per_pixel_matrices(); void rescale_per_pixel_matrices(); void maximize_colors(PresetOutputs *presetOutputs); + void render_texture_to_screen(PresetOutputs *presetOutputs); + void draw_fps( float realfps ); + void draw_stats(PresetInputs *presetInputs); + void draw_help( ); + void draw_preset(); + void draw_title(); + void draw_title_to_screen(); + void maximize_colors(); + void draw_title_to_texture(); + void draw_motion_vectors(PresetOutputs *presetOutputs); + void draw_borders(PresetOutputs *presetOutputs); + void draw_shapes(PresetOutputs *presetOutputs); + void draw_custom_waves(PresetOutputs *presetOutputs); + void draw_waveform(PresetOutputs *presetOutputs, PresetInputs *presetInputs); + void modulate_opacity_by_volume(PresetOutputs *presetOutputs) ; + void darken_center(); }; #endif diff --git a/src/projectM-engine/console_interface.cpp b/src/projectM-engine/console_interface.cpp index 5287bbe7c..9f690c909 100755 --- a/src/projectM-engine/console_interface.cpp +++ b/src/projectM-engine/console_interface.cpp @@ -173,7 +173,7 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode } break; case PROJECTM_K_l: - if (noSwitch==0)noSwitch=1; else noSwitch=0; + if (renderer->noSwitch==0)renderer->noSwitch=1; else renderer->noSwitch=0; // current_interface = BROWSER_INTERFACE; // loadBrowser(); break; diff --git a/src/projectM-engine/projectM.cpp b/src/projectM-engine/projectM.cpp index eaf00bb32..b300889f2 100755 --- a/src/projectM-engine/projectM.cpp +++ b/src/projectM-engine/projectM.cpp @@ -20,11 +20,7 @@ */ #include "pbuffer.h" -#ifdef USE_FTGL -#include -#include -#include -#endif /** USE_FTGL */ + #include "wipemalloc.h" #include "BuiltinFuncs.hpp" @@ -49,7 +45,6 @@ #include "Parser.h" #include "Preset.hpp" #include "PerPixelEqn.h" -#include "console_interface.h" #include "menu.h" #include "PCM.h" //Sound data handler (buffering, FFT, etc.) #include "CustomWave.h" @@ -57,11 +52,6 @@ #include "SplayTree.hpp" #include "Renderer.hpp" -#ifdef USE_FTGL -FTGLPixmapFont *title_font; -FTGLPixmapFont *other_font; -FTGLPolygonFont *poly_font; -#endif /** USE_FTGL */ @@ -86,18 +76,18 @@ int x, y; // printf("Start of loop at %d\n",timestart); mspf=(int)(1000.0/(float)presetInputs.fps); //milliseconds per frame - totalframes++; //total amount of frames since startup + #ifndef WIN32 - Time = getTicks( &startTime ) * 0.001; + presetInputs.time = getTicks( &startTime ) * 0.001; #else - Time = getTicks( startTime ) * 0.001; + presetInputs.time = getTicks( startTime ) * 0.001; #endif /** !WIN32 */ presetInputs.frame++; //number of frames for current preset presetInputs.progress= presetInputs.frame/(float)avgtime; DWRITE( "frame: %d\ttime: %f\tprogress: %f\tavgtime: %d\tang: %f\trot: %f\n", - this->presetInputs.frame, Time, this->presetInputs.progress, this->avgtime, this->presetInputs.ang_per_pixel, + this->presetInputs.frame, presetInputs.time, this->presetInputs.progress, this->avgtime, this->presetInputs.ang_per_pixel, this->presetOutputs.rot ); if (presetInputs.progress>1.0) presetInputs.progress=1.0; @@ -117,7 +107,7 @@ int x, y; DWRITE( "=== bass_att: %f ===\n", beatDetect->bass_att ); - if (noSwitch==0) { + if (renderer->noSwitch==0) { nohard--; if((beatDetect->bass-beatDetect->bass_old>beatDetect->beat_sensitivity || avgtime ) && nohard<0) @@ -136,7 +126,7 @@ int x, y; /** Frame-rate limiter */ /** Compute once per preset */ if (this->count%100==0) { - this->realfps=100.0/((getTicks(&this->startTime)-this->fpsstart)/1000); + this->renderer->realfps=100.0/((getTicks(&this->startTime)-this->fpsstart)/1000); this->fpsstart=getTicks(&this->startTime); } @@ -170,10 +160,9 @@ DLLEXPORT void projectM::projectM_reset() { /** Default variable settings */ this->hasInit = 0; - this->noSwitch = 0; this->pcmframes = 1; this->freqframes = 0; - this->totalframes = 1; + this->fvw = 800; @@ -185,7 +174,7 @@ DLLEXPORT void projectM::projectM_reset() { /** Frames per preset */ this->avgtime = 500; - this->title = NULL; + /** More other stuff */ this->mspf = 0; @@ -193,7 +182,7 @@ DLLEXPORT void projectM::projectM_reset() { this->timestart = 0; this->nohard = 0; this->count = 0; - this->realfps = 0; + this->fpsstart = 0; projectM_resetengine(); @@ -201,12 +190,7 @@ DLLEXPORT void projectM::projectM_reset() { DLLEXPORT void projectM::projectM_init(int gx, int gy, int texsize, int width, int height) { -#ifdef USE_FTGL - /** Reset fonts */ - title_font = NULL; - other_font = NULL; - poly_font = NULL; -#endif /** USE_FTGL */ + /** Initialise engine variables */ projectM_initengine(); @@ -346,7 +330,7 @@ DWRITE( "post PCM init\n" ); this->presetInputs.gx = gx; this->presetInputs.gy = gy; - this->renderer = new Renderer(width, height, gx, gy, renderTarget); + this->renderer = new Renderer(width, height, gx, gy, renderTarget, beatDetect, fontURL); printf( "exiting projectM_init()\n" ); } @@ -408,7 +392,7 @@ DLLEXPORT void projectM::projectM_initengine() { //this->presetInputs.meshx = 0; //this->presetInputs.meshy = 0; - this->Time = 0; + this->presetInputs.progress = 0; this->presetInputs.frame = 0; @@ -542,7 +526,6 @@ DLLEXPORT void projectM::projectM_resetengine() { //this->meshx = 0; //this->meshy = 0; - this->Time = 0; if ( beatDetect != NULL ) { beatDetect->reset(); } @@ -614,7 +597,7 @@ DLLEXPORT void projectM::projectM_resetengine() { /** Resets OpenGL state */ DLLEXPORT void projectM::projectM_resetGL( int w, int h ) { - char path[1024]; + int mindim, origtexsize; DWRITE( "projectM_resetGL(): in: %d x %d\n", w, h ); diff --git a/src/projectM-engine/projectM.h b/src/projectM-engine/projectM.h index 7f75e2804..41303c3df 100755 --- a/src/projectM-engine/projectM.h +++ b/src/projectM-engine/projectM.h @@ -75,7 +75,7 @@ class BeatDetect; class Func; - +class Renderer; class Preset; #include "SplayTree.hpp" @@ -118,19 +118,18 @@ class projectM { public: static projectM *currentEngine; static Preset *activePreset; - static Renderer *renderer; + static Renderer *renderer; static RenderTarget *renderTarget; char *presetURL; - char *presetName; + char *fontURL; int hasInit; - int noSwitch; int pcmframes; int freqframes; - int totalframes; + GLubyte *fbuffer; @@ -145,8 +144,7 @@ public: #else long startTime; #endif /** !WIN32 */ - float Time; - + /** Render target texture ID */ @@ -164,8 +162,7 @@ public: int avgtime; //# frames per preset - char *title; - int drawtitle; + @@ -175,8 +172,7 @@ public: int timestart; int nohard; int count; - float realfps, - fpsstart; + float fpsstart; /** Various toggles */ /* PER_FRAME CONSTANTS END */