C:/Documents and Settings/jegan/Desktop/projectX/colorScreen.cpp

Go to the documentation of this file.
00001 #include "Screen.h"
00002 #include "Object.h"
00003 #include "CommandManager.h"
00004 
00005 #include <iostream>
00006 
00007 using namespace std;
00008 
00009 int Screen::HEIGHT = 800;
00010 int Screen::WIDTH = 300;
00011 
00012 Screen* Screen::_instance = NULL;
00013 
00014 Screen::Screen()
00015 :_followMe(NULL)
00016 {
00017         _screen.h = HEIGHT;
00018         _screen.w = WIDTH;
00019         _screen.x = 0;
00020         _screen.y = 0;
00021 
00022         _center.h = HEIGHT/3.0;
00023         _center.w = WIDTH/3.0;
00024         _center.x = WIDTH/3.0;
00025         _center.y = HEIGHT/3.0;
00026 
00027         #if defined(_WIN32)
00028         char *gl_library = "OpenGL32.DLL";
00029 #elif defined(__QNXNTO__)
00030         char *gl_library = "libGL.so.3";
00031 #else
00032         char *gl_library = "libGL.so.1";
00033 #endif
00034         
00035         
00036         if (SDL_Init(SDL_INIT_VIDEO)<0)
00037         {
00038                 printf("Unable to init SDL : %s\n",SDL_GetError());
00039                 exit(1);
00040         }
00041 
00042         atexit(SDL_Quit);
00043         
00044         if (SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0)
00045         {
00046                 printf("Unable to set GL attribute : %s\n",SDL_GetError());
00047                 exit(1);
00048         }
00049         
00050         if (SDL_GL_LoadLibrary(gl_library)<0)
00051         {
00052                 printf("Unable to dynamically open GL lib : %s\n",SDL_GetError());
00053                 exit(1);
00054         }
00055 
00056         SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
00057         SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
00058         SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
00059         SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
00060         SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 32);
00061 
00062         if (SDL_SetVideoMode(_screen.w,_screen.h,32,SDL_OPENGL)==NULL)
00063         {
00064                 printf("Unable to open video mode : %s\n",SDL_GetError());
00065                 exit(1);
00066         }
00067 
00068         /* Set the window manager title bar */
00069         SDL_WM_SetCaption( "SDL Dynamic OpenGL Loading Test", "testdyngl" );
00070 
00071         glfuncs::instance()->glViewport(0,0,_screen.w,_screen.h);
00072         glfuncs::instance()->glMatrixMode(GL_PROJECTION);
00073         glfuncs::instance()->glLoadIdentity();
00074 
00075         glfuncs::instance()->glOrtho(0.0f, _screen.w, _screen.h, 0.0f, -1.0f, 1.0f);
00076                 
00077         glfuncs::instance()->glMatrixMode(GL_MODELVIEW);
00078         glfuncs::instance()->glLoadIdentity();
00079 
00080         glfuncs::instance()->glClearColor(0.0f,0.0f,0.0f,0.5f);
00081         glfuncs::instance()->glClearDepth(1.0f);
00082         glfuncs::instance()->glDepthFunc(GL_LEQUAL);    
00083         glfuncs::instance()->glEnable(GL_DEPTH_TEST);
00084         glfuncs::instance()->glShadeModel(GL_SMOOTH);
00085         glfuncs::instance()->glDisable(GL_CULL_FACE);
00086         glfuncs::instance()->glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
00087 
00088         glfuncs::instance()->glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
00089         glfuncs::instance()->glEnable( GL_BLEND );
00090 
00091         glfuncs::instance()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00092         glfuncs::instance()->glEnable(GL_TEXTURE_2D);
00093 }
00094 
00095 Screen* Screen::instance()
00096 {
00097         if(!_instance)
00098                 _instance = new Screen();
00099         return _instance;
00100 }
00101 
00102 void Screen::drawLevel(int texture, GLfloat texCoords[4], SDL_Rect quad)
00103 {
00104         if(glfuncs::intersect(quad,_screen)) {
00105                 int x1 = quad.x - _screen.x;
00106                 int x2 = x1 + quad.w;
00107                 int y1 = quad.y - _screen.y;
00108                 int y2 = y1 + quad.h;
00109 
00110                 glfuncs::instance()->glBindTexture(GL_TEXTURE_2D, texture);
00111                 glfuncs::instance()->glBegin(GL_QUADS);
00112                 glfuncs::instance()->glTexCoord2f(texCoords[0],texCoords[1]);   glfuncs::instance()->glVertex2f(x1,y1);
00113                 glfuncs::instance()->glTexCoord2f(texCoords[2],texCoords[1]);   glfuncs::instance()->glVertex2f(x2,y1);
00114                 glfuncs::instance()->glTexCoord2f(texCoords[2],texCoords[3]);   glfuncs::instance()->glVertex2f(x2,y2);
00115                 glfuncs::instance()->glTexCoord2f(texCoords[0],texCoords[3]);   glfuncs::instance()->glVertex2f(x1,y2);
00116                 glfuncs::instance()->glEnd();
00117         }
00118 }
00119 
00120 void Screen::drawScreen(int texture, GLfloat texCoords[4], SDL_Rect quad)
00121 {
00122         int x1 = quad.x;
00123         int x2 = x1 + quad.w;
00124         int y1 = quad.y;
00125         int y2 = y1 + quad.h;
00126 
00127         glfuncs::instance()->glBindTexture(GL_TEXTURE_2D, texture);
00128         glfuncs::instance()->glBegin(GL_QUADS);
00129         glfuncs::instance()->glTexCoord2f(texCoords[0],texCoords[1]);   glfuncs::instance()->glVertex2f(x1,y1);
00130         glfuncs::instance()->glTexCoord2f(texCoords[2],texCoords[1]);   glfuncs::instance()->glVertex2f(x2,y1);
00131         glfuncs::instance()->glTexCoord2f(texCoords[2],texCoords[3]);   glfuncs::instance()->glVertex2f(x2,y2);
00132         glfuncs::instance()->glTexCoord2f(texCoords[0],texCoords[3]);   glfuncs::instance()->glVertex2f(x1,y2);
00133         glfuncs::instance()->glEnd();
00134 }
00135 
00136 void Screen::drawCutScene(std::string cutSceneText)
00137 {
00138         //glfuncs::instance()->glDisable(GL_TEXTURE_2D);
00139 
00140 
00141         glfuncs::instance()->glColor4f(0,0,0,1);
00142         
00143         glfuncs::instance()->glBegin(GL_QUADS);
00144         glfuncs::instance()->glVertex2f(0,0);
00145         glfuncs::instance()->glVertex2f(_screen.w,0);
00146         glfuncs::instance()->glVertex2f(_screen.w,_screen.h/CSFRAC);
00147         glfuncs::instance()->glVertex2f(0,_screen.h/CSFRAC);
00148         glfuncs::instance()->glEnd();
00149 
00150         glfuncs::instance()->glBegin(GL_QUADS);
00151         glfuncs::instance()->glVertex2f(0,_screen.h-_screen.h/CSFRAC);
00152         glfuncs::instance()->glVertex2f(_screen.w,_screen.h-_screen.h/CSFRAC);
00153         glfuncs::instance()->glVertex2f(_screen.w,_screen.h);
00154         glfuncs::instance()->glVertex2f(0,_screen.h);
00155         glfuncs::instance()->glEnd();
00156 
00157         glfuncs::instance()->glColor4f(1,1,1,1);
00158 
00159         //glfuncs::instance()->glRasterPos2f(100,_screen.h-_screen.h/CSFRAC + 20);
00160         glfuncs::instance()->glPrint(100,_screen.h-_screen.h/CSFRAC + 6,cutSceneText);
00161 
00162         //glfuncs::instance()->glEnable(GL_TEXTURE_2D);
00163 }
00164 
00165 void Screen::drawText(std::string text, int x, int y)
00166 {
00167         y -= 14;
00168         //glfuncs::instance()->glEnable(GL_TEXTURE_2D);
00169         
00170 
00171         glfuncs::instance()->glColor4f(0,0,0,1);
00172 
00173         //glfuncs::instance()->glRasterPos2f(x,y);
00174         glfuncs::instance()->glPrint(x,y,text, true);
00175 
00176         glfuncs::instance()->glColor4f(1,1,1,1);
00177 
00178 }
00179 
00180 void Screen::registerFollowObj(Object * o)
00181 {
00182         _followMe = o;
00183 }
00184 
00185 void Screen::move(int x, int y)
00186 {
00187         _screen.y += y;
00188         _screen.x += x;
00189         _center.y += y;
00190         _center.x += x;
00191 }
00192 
00193 
00194 void Screen::update()
00195 {
00196         if( _followMe == NULL )
00197                 return;
00198 
00199         SDL_Rect follow = _followMe->getBox();
00200 
00201         int x,y;
00202         if(!glfuncs::intersectX(follow,_center,&x))
00203                 move(x,0);
00204         if(!glfuncs::intersectY(follow,_center,&y))
00205                 move(0,y);
00206 }
00207 

Generated on Fri May 5 00:20:18 2006 for ProjectX by  doxygen 1.4.6-NO