#include "console.h"
CConsole::CConsole(void)
{
filemap[0]='*';
}
CConsole::~CConsole(void)
{
}
void CConsole::ListSphere(string dirPath)
{
_finddata_t file;
string subPath =dirPath; //declare subpath variable. This is just a string
//Find the first position of a dot which means a fileName.extension. Pass a reference to your _finddata structure (file) to it.
long currentPosition = _findfirst("sphere*.jpg", &file);
numsphere=0;
if (currentPosition == -1L)
{
return ;
}
else // If a file is found
{
// The following do...while loop, loops through all the items found in the current directory. Each directory has a '.' and '..' item which is
// the root or parent of that directory. We want to ignore those. Unfortuntely this method can not be used for files residing on the
// root. There are way around it though.
do
{
//ignore . and ..
if(strcmp(file.name , ".") != 0 && strcmp(file.name , "..") !=0)
{
// A bitwise checking for the 'attrib' attribute of the _finddata structure. This means if the item is a subdirectory recursively
// call this method to find the files inside this subdirectory. ListDirect was the name of this current method in my code. Replace
// it with the name of your own method , i.e. call this method recursively for your subdirectories. Depending on what you are
// doing you can take this part out.
if (file.attrib & _A_SUBDIR)
{
//if the directory has subdirectories, recursing the subdirectories
subPath = dirPath;
subPath.append ("\\");
subPath.append (file.name );
ListSphere(subPath);
}
else // if the item is not a subdirectory, then you can use other attributes of the _finddata structure to extract the information you
// want (e.g. size), there are a bunch of other attributes of this structure like the time stamp etc. which you can find on MSDN.
{
fprintf(stdout," %s\n",file.name);
sphere[numsphere]=file.name;
if (numsphere==0) sphere[0].copy(filesphere,string::npos);
numsphere++;
//adding up the size of files
/* totalSize += file.size ;
if(file.size % 1024 == 0)
roundTotalSize += (file.size / 1024); //rounding up the size of files
else
roundTotalSize += ((file.size / 1024) + 1); */
}
}
}while(_findnext(currentPosition, &file) == 0);
}
_findclose(currentPosition); //close search
}
void CConsole::ListMap(string dirPath)
{
_finddata_t file;
string subPath =dirPath; //declare subpath variable. This is just a string
//Find the first position of a dot which means a fileName.extension. Pass a reference to your _finddata structure (file) to it.
long currentPosition = _findfirst("*.mnm", &file);
nummap=0;
if (currentPosition == -1L)
{
return ;
}
else // If a file is found
{
// The following do...while loop, loops through all the items found in the current directory. Each directory has a '.' and '..' item which is
// the root or parent of that directory. We want to ignore those. Unfortuntely this method can not be used for files residing on the
// root. There are way around it though.
do
{
//ignore . and ..
if(strcmp(file.name , ".") != 0 && strcmp(file.name , "..") !=0)
{
// A bitwise checking for the 'attrib' attribute of the _finddata structure. This means if the item is a subdirectory recursively
// call this method to find the files inside this subdirectory. ListDirect was the name of this current method in my code. Replace
// it with the name of your own method , i.e. call this method recursively for your subdirectories. Depending on what you are
// doing you can take this part out.
if (file.attrib & _A_SUBDIR)
{
//if the directory has subdirectories, recursing the subdirectories
subPath = dirPath;
subPath.append ("\\");
subPath.append (file.name );
ListMap(subPath);
}
else // if the item is not a subdirectory, then you can use other attributes of the _finddata structure to extract the information you
// want (e.g. size), there are a bunch of other attributes of this structure like the time stamp etc. which you can find on MSDN.
{
fprintf(stdout," %s\n",file.name);
map[nummap]=file.name;
if (nummap==0) map[0].copy(filemap,string::npos);
nummap++;
//adding up the size of files
/* totalSize += file.size ;
if(file.size % 1024 == 0)
roundTotalSize += (file.size / 1024); //rounding up the size of files
else
roundTotalSize += ((file.size / 1024) + 1); */
}
}
}while(_findnext(currentPosition, &file) == 0);
}
_findclose(currentPosition); //close search
}
void CConsole::item(int pos,char *str, bool sel)
{ // str[strlen(str)]='\0';
// if (sel) {strcpy(selitem,str); }
glPrintf(SizeX/2,SizeY-110-pos*20+5,1,12,sel,str,pos);
DrawBox(0,SizeY-110-pos*20,SizeX,20,sel);
}
void CConsole::menu(int type,int selpos)
{
int i;
bool a[100];
for (i=0; i<=99;i++) a[i]=false;
a[selpos]=true;
switch(type) {
case MENU_GAMEOVER:
title("GAME OVER");
item(ITEM_GAMEOVER,"Return Main Menu",a[ITEM_GAMEOVER]);
numitem=ITEM_GAMEOVER;
break;
case MENU_MAIN:
title("MARBLE GAME");
item(ITEM_MAIN_START,"Start",a[ITEM_MAIN_START]);
item(ITEM_MAIN_MAP,"Load Map",a[ITEM_MAIN_MAP]);
item(ITEM_MAIN_DISPLAY,"Display",a[ITEM_MAIN_DISPLAY]);
item(ITEM_MAIN_CAMERA,"Camera",a[ITEM_MAIN_CAMERA]);
item(ITEM_MAIN_GRAPHICS,"Graphics",a[ITEM_MAIN_GRAPHICS]);
item(ITEM_MAIN_BALL,"Ball",a[ITEM_MAIN_BALL]);
item(ITEM_MAIN_CONTROL,"Control",a[ITEM_MAIN_CONTROL]);
item(ITEM_MAIN_TIMER,"Timer",a[ITEM_MAIN_TIMER]);
item(ITEM_EXIT,"Exit",a[ITEM_EXIT]);
numitem=ITEM_EXIT;
break;
case MENU_DEAD:
title("OH NOOO");
item(ITEM_DEAD,"Continue Game", a[ITEM_DEAD]);
numitem=ITEM_DEAD;
break;
case MENU_TIMEOUT:
title("OH NOOO TIME OUT!");
item(ITEM_DEAD,"Continue Game", a[ITEM_DEAD]);
numitem=ITEM_DEAD;
break;
case MENU_GOAL:
title("GOAL!");
item(ITEM_GOAL,"Next Map", a[ITEM_GOAL]);
numitem=ITEM_GOAL;
break;
case MENU_PAUSE:
title("PAUSE");
item(ITEM_MAIN_START,"Continue Game",a[ITEM_MAIN_START]);
item(ITEM_MAIN_MAP,"Load Map",a[ITEM_MAIN_MAP]);
item(ITEM_MAIN_DISPLAY,"Display",a[ITEM_MAIN_DISPLAY]);
item(ITEM_MAIN_CAMERA,"Camera",a[ITEM_MAIN_CAMERA]);
item(ITEM_MAIN_GRAPHICS,"Graphics",a[ITEM_MAIN_GRAPHICS]);
item(ITEM_MAIN_BALL,"Ball",a[ITEM_MAIN_BALL]);
item(ITEM_MAIN_CONTROL,"Control",a[ITEM_MAIN_CONTROL]);
item(ITEM_MAIN_TIMER,"Timer",a[ITEM_MAIN_TIMER]);
item(ITEM_EXIT,"Exit",a[ITEM_EXIT]);
numitem=ITEM_EXIT;
break;
case MENU_MAP:
title ("MAPS");
for (i=0;i<nummap;i++) {
map[i].copy(filemap,string::npos);
char *s;
s=strstr(filemap,".mnm");
s[0]='\0';
//filename[strlen(filename)]='\0';
item(i+1,filemap,a[i+1]);
}
numitem=nummap;
break;
case MENU_GRAPHICS:
title("Graphics");
item(ITEM_GRAPHICS_TEXTURED,"Textured",a[ITEM_GRAPHICS_TEXTURED]);
item(ITEM_GRAPHICS_NORMAL,"Textured+Normal Light",a[ITEM_GRAPHICS_NORMAL]);
item(ITEM_GRAPHICS_WIREFRAME,"Wireframe",a[ITEM_GRAPHICS_WIREFRAME]);
item(ITEM_GRAPHICS_SOLID,"Solid",a[ITEM_GRAPHICS_SOLID]);
item(ITEM_GRAPHICS_ENV,"Enviroment",a[ITEM_GRAPHICS_ENV]);
item(ITEM_GRAPHICS_ROBOT,"Enemy Robot",a[ITEM_GRAPHICS_ROBOT]);
item(ITEM_GRAPHICS_NOROBOT,"Enemy NoRobot",a[ITEM_GRAPHICS_NOROBOT]);
item(ITEM_GRAPHICS_BACK,"Back",a[ITEM_GRAPHICS_BACK]);
numitem=ITEM_GRAPHICS_BACK;
break;
case MENU_DISPLAY:
title("Display");
item(ITEM_DISPLAY_W_640x480,"Window: 640x480",a[ITEM_DISPLAY_W_640x480]);
item(ITEM_DISPLAY_W_800x600,"Window: 800x600",a[ITEM_DISPLAY_W_800x600]);
item(ITEM_DISPLAY_W_1024x768,"Window:1024x768",a[ITEM_DISPLAY_W_1024x768]);
item(ITEM_DISPLAY_FULLSCREEN,"FullScreen",a[ITEM_DISPLAY_FULLSCREEN]);
item(ITEM_DISPLAY_BACK,"Back",a[ITEM_DISPLAY_BACK]);
numitem=ITEM_DISPLAY_BACK;
break;
case MENU_CAMERA:
title("Camera");
item(ITEM_CAMERA_FOLLOW ,"Follow Ball",a[ITEM_CAMERA_FOLLOW ]);
item(ITEM_CAMERA_NFOLLOW ,"Not Follow Ball",a[ITEM_CAMERA_NFOLLOW ]);
item(ITEM_CAMERA_BACK ,"Back",a[ITEM_CAMERA_BACK ]);
numitem=ITEM_CAMERA_BACK ;
break;
case MENU_CONTROL:
title("Control");
item(ITEM_CONTROL_ROLL,"Roll Control",a[ITEM_CONTROL_ROLL]);
item(ITEM_CONTROL_LUKE,"Luke Control",a[ITEM_CONTROL_LUKE]);
item(ITEM_CONTROL_SNS20,"Sensibility Mouse 20",a[ITEM_CONTROL_SNS20]);
item(ITEM_CONTROL_SNS40,"Sensibility Mouse 40",a[ITEM_CONTROL_SNS40]);
item(ITEM_CONTROL_SNS60,"Sensibility Mouse 60",a[ITEM_CONTROL_SNS60]);
item(ITEM_CONTROL_SNS80,"Sensibility Mouse 80",a[ITEM_CONTROL_SNS80]);
item(ITEM_CONTROL_BACK,"Back",a[ITEM_CONTROL_BACK]);
numitem=ITEM_CONTROL_BACK;
break;
case MENU_ENV:
title("Enviroment");
item(ITEM_ENV_DEFAULT,"Default",a[ITEM_ENV_DEFAULT]);
item(ITEM_ENV_METAL,"Metal",a[ITEM_ENV_METAL]);
item(ITEM_ENV_GLASS,"Glass",a[ITEM_ENV_GLASS]);
item(ITEM_ENV_PLASTIC,"Plastic",a[ITEM_ENV_PLASTIC]);
item(ITEM_ENV_SHINING,"Shining",a[ITEM_ENV_SHINING]);
item(ITEM_ENV_BACK,"Back",a[ITEM_ENV_BACK]);
numitem=ITEM_ENV_BACK;
break;
case MENU_BALL:
title ("Ball");
for (i=0;i<numsphere;i++) {
sphere[i].copy(filesphere,string::npos);
char *s;
s=strstr(filesphere,".jpg");
s[0]='\0';
//filename[strlen(filename)]='\0';
item(i+1,filesphere,a[i+1]);
}
numitem=numsphere;
break;
case MENU_TIMER:
title("Timer");
item(ITEM_TIMER_100,"100 sec",a[ITEM_TIMER_100]);
item(ITEM_TIMER_300,"300 sec",a[ITEM_TIMER_300]);
item(ITEM_TIMER_600,"600 sec",a[ITEM_TIMER_600]);
item(ITEM_TIMER_UNLIMITED,"unlimited",a[ITEM_TIMER_UNLIMITED]);
item(ITEM_TIMER_BACK,"Back",a[ITEM_TIMER_BACK]);
numitem=ITEM_TIMER_BACK;
break;
}
}
void CConsole::setSize(int X, int Y)
{
SizeX=X;
SizeY=Y;
}
void CConsole::title( char *t)
{
glPrintf(SizeX/2,SizeY-50,1,40,false,t);
DrawBox(0,SizeY-100,SizeX,100,false);
}
void CConsole::DrawBox(int x, int y , int sizex, int sizey, bool sel)
{
glPushAttrib(GL_ENABLE_BIT|GL_LIST_BIT|GL_CURRENT_BIT); // Pushes the display list bits
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_1D);
glDisable(GL_TEXTURE_2D);
glEnable(GL_LINE_SMOOTH);
if (!sel) {glColor3f(0.6,0.6,0.6);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
} else
{glColor3f(0,0,0);
glDisable(GL_BLEND);
}
int vp[4];
glGetIntegerv(GL_VIEWPORT,vp);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(vp[0], vp[0]+vp[2], vp[1], vp[1]+vp[3]);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
//glRasterPos2f(2,3);
glBegin(GL_POLYGON);
glVertex2i(x,y);
glVertex2i(x+sizex,y);
glVertex2i(x+sizex,y+sizey);
glVertex2i(x,y+sizey);
glEnd();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glPopAttrib();
}
void CConsole::printf(int x, int y, char* format)
{
glPushAttrib(GL_ENABLE_BIT|GL_LIST_BIT|GL_CURRENT_BIT); // Pushes the display list bits
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_1D);
glDisable(GL_TEXTURE_2D);
//glDisable(GL_TEXTURE_CUBE_MAP);
int vp[4];
glGetIntegerv(GL_VIEWPORT,vp);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
char strl[120];
char *c;
sprintf(strl,"marble test!");
glLoadIdentity();
gluOrtho2D(vp[0], vp[0]+vp[2], vp[1], vp[1]+vp[3]);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
//glRasterPos2f(2,3);
glRasterPos2f(x,y);
for (c=strl; *c != '\0'; c++)
{
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *c);
}
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glPopAttrib();
}
void CConsole::glPrintf(GLuint x, GLuint y, int align, GLfloat scale,bool sel, char* format, ...)
{
va_list args;
char buffer[255], *p;
int len;
float dx=0;
GLfloat font_scale = 119.05f;// + 33.33f;
va_start(args, format);
vsprintf(buffer, format, args);
va_end(args);
if(align)
{
len= (int) strlen(buffer);
dx=((scale*len)/2)*104.76/119.05;
}
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0, glutGet(GLUT_WINDOW_WIDTH), 0, glutGet(GLUT_WINDOW_HEIGHT));
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LINE_SMOOTH);
if (sel) {
glColor3f(1,1,1);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
}else
{
glColor3f(0,0,0);
glDisable(GL_BLEND);
}
glTranslatef(x-dx, y, 0.0);
glScalef(scale/font_scale, scale/font_scale, scale/font_scale);
for(p = buffer; *p; p++)
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN, *p);
glPopAttrib();
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}