| #include "Common.hpp" |
| |
| #ifdef USE_GLES1 |
| #include <GLES/gl.h> |
| #else |
| #ifdef __APPLE__ |
| #include <OpenGL/gl.h> |
| #include <OpenGL/glu.h> |
| #else |
| #include <GL/gl.h> |
| #include <GL/glu.h> |
| #endif |
| #endif |
| |
| #include "Renderable.hpp" |
| #include <math.h> |
| |
| |
| typedef float floatPair[2]; |
| typedef float floatTriple[3]; |
| typedef float floatQuad[4]; |
| |
| |
| #ifdef USE_GLES1 |
| static void |
| glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) |
| { |
| GLfloat verts[] = { |
| x1, y1, |
| x1, y2, |
| x2, y1, |
| x2, y2 |
| }; |
| GLboolean prev; |
| |
| prev = glIsEnabled (GL_VERTEX_ARRAY); |
| |
| glEnableClientState (GL_VERTEX_ARRAY); |
| glVertexPointer (2, GL_FLOAT, 0, verts); |
| glDrawArrays (GL_TRIANGLE_STRIP, 0, 4); |
| |
| if (!prev) |
| glDisableClientState (GL_VERTEX_ARRAY); |
| } |
| #endif |
| |
| RenderContext::RenderContext() |
| : time(0), |
| texsize(512), |
| aspectRatio(1), |
| aspectCorrect(false) |
| {}; |
| |
| RenderItem::RenderItem() : masterAlpha(1) {} |
| |
| DarkenCenter::DarkenCenter() : RenderItem() {} |
| MotionVectors::MotionVectors() : RenderItem() {} |
| Border::Border() : RenderItem() {} |
| |
| void |
| DarkenCenter::Draw(RenderContext &context) |
| { |
| //float unit=0.05f; |
| |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| |
| float colors[6][4] = {{0, 0, 0, (3.0f/32.0f) * masterAlpha}, |
| {0, 0, 0, 0}, |
| {0, 0, 0, 0}, |
| {0, 0, 0, 0}, |
| {0, 0, 0, 0}, |
| {0, 0, 0, 0}}; |
| |
| float points[6][2] = {{ 0.5, 0.5}, |
| { 0.45, 0.5}, |
| { 0.5, 0.45}, |
| { 0.55, 0.5}, |
| { 0.5, 0.55}, |
| { 0.45, 0.5}}; |
| |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glEnableClientState(GL_COLOR_ARRAY); |
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
| |
| glVertexPointer(2,GL_FLOAT,0,points); |
| glColorPointer(4,GL_FLOAT,0,colors); |
| |
| glDrawArrays(GL_TRIANGLE_FAN,0,6); |
| } |
| |
| Shape::Shape():RenderItem() |
| { |
| std::string imageUrl = ""; |
| |
| sides = 4; |
| thickOutline = false; |
| enabled = true; |
| additive = false; |
| textured = false; |
| |
| tex_zoom = 1.0; |
| tex_ang = 0.0; |
| |
| x = 0.5; |
| y = 0.5; |
| radius = 1.0; |
| ang = 0.0; |
| |
| r = 0.0; /* red color value */ |
| g = 0.0; /* green color value */ |
| b = 0.0; /* blue color value */ |
| a = 0.0; /* alpha color value */ |
| |
| r2 = 0.0; /* red color value */ |
| g2 = 0.0; /* green color value */ |
| b2 = 0.0; /* blue color value */ |
| a2 = 0.0; /* alpha color value */ |
| |
| border_r = 0.0; /* red color value */ |
| border_g = 0.0; /* green color value */ |
| border_b = 0.0; /* blue color value */ |
| border_a = 0.0; /* alpha color value */ |
| } |
| |
| void |
| Shape::Draw(RenderContext &context) |
| { |
| float xval, yval; |
| float t; |
| |
| // printf("drawing shape %f\n", ang); |
| |
| float temp_radius= radius*(.707*.707*.707*1.04); |
| |
| //Additive Drawing or Overwrite |
| if (additive == 0) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| else glBlendFunc(GL_SRC_ALPHA, GL_ONE); |
| |
| xval= x; |
| yval= -(y-1); |
| |
| if ( textured) |
| { |
| if (imageUrl !="") |
| { |
| GLuint tex= context.textureManager->getTexture(imageUrl); |
| if (tex != 0) |
| { |
| glBindTexture(GL_TEXTURE_2D, tex); |
| context.aspectRatio=1.0; |
| } |
| } |
| |
| glMatrixMode(GL_TEXTURE); |
| glPushMatrix(); |
| glLoadIdentity(); |
| |
| glEnable(GL_TEXTURE_2D); |
| |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glEnableClientState(GL_COLOR_ARRAY); |
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
| |
| floatQuad *colors = new float[sides+2][4]; |
| floatPair *tex = new float[sides+2][2]; |
| floatPair *points = new float[sides+2][2]; |
| |
| //Define the center point of the shape |
| colors[0][0] = r; |
| colors[0][1] = g; |
| colors[0][2] = b; |
| colors[0][3] = a * masterAlpha; |
| tex[0][0] = 0.5; |
| tex[0][1] = 0.5; |
| points[0][0] = xval; |
| points[0][1] = yval; |
| |
| for ( int i=1;i< sides+2;i++) |
| { |
| colors[i][0] = r2; |
| colors[i][1] = g2; |
| colors[i][2] = b2; |
| colors[i][3] = a2 * masterAlpha; |
| |
| t = (i-1)/(float) sides; |
| tex[i][0] = 0.5f + 0.5f*cosf(t*3.1415927f*2 + tex_ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)/ tex_zoom; |
| tex[i][1] = 0.5f + 0.5f*sinf(t*3.1415927f*2 + tex_ang + 3.1415927f*0.25f)/ tex_zoom; |
| points[i][0]=temp_radius*cosf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval; |
| points[i][1]=temp_radius*sinf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)+yval; |
| } |
| |
| glVertexPointer(2,GL_FLOAT,0,points); |
| glColorPointer(4,GL_FLOAT,0,colors); |
| glTexCoordPointer(2,GL_FLOAT,0,tex); |
| |
| glDrawArrays(GL_TRIANGLE_FAN,0,sides+2); |
| |
| glDisable(GL_TEXTURE_2D); |
| glPopMatrix(); |
| glMatrixMode(GL_MODELVIEW); |
| |
| //Reset Texture state since we might have changed it |
| /* |
| if(this->renderTarget->useFBO) |
| { |
| glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[1] ); |
| } |
| else |
| { |
| glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[0] ); |
| } |
| */ |
| |
| delete[] colors; |
| delete[] tex; |
| delete[] points; |
| } |
| else |
| { |
| //Untextured (use color values) |
| |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glEnableClientState(GL_COLOR_ARRAY); |
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
| |
| floatQuad *colors = new float[sides+2][4]; |
| floatPair *points = new float[sides+2][2]; |
| |
| //Define the center point of the shape |
| colors[0][0]=r; |
| colors[0][1]=g; |
| colors[0][2]=b; |
| colors[0][3]=a * masterAlpha; |
| points[0][0]=xval; |
| points[0][1]=yval; |
| |
| |
| |
| for ( int i=1;i< sides+2;i++) |
| { |
| colors[i][0]=r2; |
| colors[i][1]=g2; |
| colors[i][2]=b2; |
| colors[i][3]=a2 * masterAlpha; |
| t = (i-1)/(float) sides; |
| points[i][0]=temp_radius*cosf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval; |
| points[i][1]=temp_radius*sinf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)+yval; |
| |
| } |
| |
| glVertexPointer(2,GL_FLOAT,0,points); |
| glColorPointer(4,GL_FLOAT,0,colors); |
| |
| |
| glDrawArrays(GL_TRIANGLE_FAN,0,sides+2); |
| //draw first n-1 triangular pieces |
| |
| delete[] colors; |
| delete[] points; |
| } |
| if (thickOutline==1) glLineWidth(context.texsize < 512 ? 1 : 2*context.texsize/512); |
| |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glDisableClientState(GL_COLOR_ARRAY); |
| |
| floatPair *points = new float[sides+1][2]; |
| |
| glColor4f( border_r, border_g, border_b, border_a * masterAlpha); |
| |
| for ( int i=0;i< sides;i++) |
| { |
| t = (i-1)/(float) sides; |
| points[i][0] = temp_radius*cosf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval; |
| points[i][1] = temp_radius*sinf(t*3.1415927f*2 + ang + 3.1415927f*0.25f)+yval; |
| } |
| |
| glVertexPointer(2,GL_FLOAT,0,points); |
| glDrawArrays(GL_LINE_LOOP,0,sides); |
| |
| if (thickOutline==1) glLineWidth(context.texsize < 512 ? 1 : context.texsize/512); |
| |
| delete[] points; |
| } |
| |
| void |
| MotionVectors::Draw(RenderContext &context) |
| { |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
| glDisableClientState(GL_COLOR_ARRAY); |
| |
| float intervalx=1.0/x_num; |
| float intervaly=1.0/y_num; |
| |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| |
| glPointSize(length); |
| glColor4f(r, g, b, a * masterAlpha); |
| |
| if (x_num + y_num < 600) |
| { |
| int size = x_num * y_num ; |
| |
| if (size) { |
| floatPair *points = new float[size][2]; |
| |
| for (int x=0;x<(int)x_num;x++) |
| { |
| for(int y=0;y<(int)y_num;y++) |
| { |
| float lx, ly, lz; |
| lx = x_offset+x*intervalx; |
| ly = y_offset+y*intervaly; |
| |
| points[(x * (int)y_num) + y][0] = lx; |
| points[(x * (int)y_num) + y][1] = ly; |
| } |
| } |
| |
| glVertexPointer(2,GL_FLOAT,0,points); |
| glDrawArrays(GL_POINTS,0,size); |
| |
| delete[] points; |
| } |
| } |
| } |
| |
| void |
| Border::Draw(RenderContext &context) |
| { |
| glEnableClientState(GL_VERTEX_ARRAY); |
| glDisableClientState(GL_COLOR_ARRAY); |
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
| //Draw Borders |
| float of=outer_size*.5; |
| float iff=inner_size*.5; |
| float texof=1.0-of; |
| |
| //no additive drawing for borders |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| glColor4f(outer_r, outer_g, outer_b, outer_a * masterAlpha); |
| |
| float pointsA[4][2] = {{0,0},{0,1},{of,0},{of,1}}; |
| glVertexPointer(2,GL_FLOAT,0,pointsA); |
| glDrawArrays(GL_TRIANGLE_STRIP,0,4); |
| |
| float pointsB[4][2] = {{of,0},{of,of},{texof,0},{texof,of}}; |
| glVertexPointer(2,GL_FLOAT,0,pointsB); |
| glDrawArrays(GL_TRIANGLE_STRIP,0,4); |
| |
| float pointsC[4][2] = {{texof,0},{texof,1},{1,0},{1,1}}; |
| glVertexPointer(2,GL_FLOAT,0,pointsC); |
| glDrawArrays(GL_TRIANGLE_STRIP,0,4); |
| |
| float pointsD[4][2] = {{of,1},{of,texof},{texof,1},{texof,texof}}; |
| glVertexPointer(2,GL_FLOAT,0,pointsD); |
| glDrawArrays(GL_TRIANGLE_STRIP,0,4); |
| |
| glColor4f(inner_r, inner_g, inner_b, inner_a * masterAlpha); |
| |
| glRectf(of, of, of+iff, texof); |
| glRectf(of+iff, of, texof-iff, of+iff); |
| glRectf(texof-iff, of, texof, texof); |
| glRectf(of+iff, texof, texof-iff, texof-iff); |
| |
| float pointsE[4][2] = {{of,of},{of,texof},{of+iff,of},{of+iff,texof}}; |
| glVertexPointer(2,GL_FLOAT,0,pointsE); |
| glDrawArrays(GL_TRIANGLE_STRIP,0,4); |
| |
| float pointsF[4][2] = {{of+iff,of},{of+iff,of+iff},{texof-iff,of},{texof-iff,of+iff}}; |
| glVertexPointer(2,GL_FLOAT,0,pointsF); |
| glDrawArrays(GL_TRIANGLE_STRIP,0,4); |
| |
| float pointsG[4][2] = {{texof-iff,of},{texof-iff,texof},{texof,of},{texof,texof}}; |
| glVertexPointer(2,GL_FLOAT,0,pointsG); |
| glDrawArrays(GL_TRIANGLE_STRIP,0,4); |
| |
| float pointsH[4][2] = {{of+iff,texof},{of+iff,texof-iff},{texof-iff,texof},{texof-iff,texof-iff}}; |
| glVertexPointer(2,GL_FLOAT,0,pointsH); |
| glDrawArrays(GL_TRIANGLE_STRIP,0,4); |
| |
| } |