8 extern float multiplier;
11 enum MenuItemType{NONE,LABEL,BUTTON,IMAGE,IMAGEBUTTON,MAPMARKER,MAPLINE,MAPLABEL} type;
25 MenuItem(MenuItemType _type, int _id, const string& _label, int _texture, MBCallback _cb,
26 int _x, int _y, int _w, int _h, float _r, float _g, float _b):
27 type(_type),id(_id),label(_label),texture(_texture),cb(_cb),
28 x(_x),y(_y),w(_w),h(_h),r(_r),g(_g),b(_b),effectfade(0) {
29 if(type==MenuItem::BUTTON){
36 MenuItem(const XYZ& start, const XYZ& end, float startsize, float endsize, float _r, float _g, float _b):
37 type(MAPLINE),id(-1),label(""),r(_r),g(_g),b(_b),
38 linestart(start),lineend(end),linestartsize(startsize),lineendsize(endsize) { }
41 vector<MenuItem> items;
46 void Menu::GUITick(Game* game){
47 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++){
48 if(it->id==game->selected){
49 it->effectfade+=multiplier*5;
53 it->effectfade-=multiplier*5;
60 void Menu::clearMenu(){
64 void Menu::addLabel(int id,const string& label,int x,int y){
65 items.push_back(MenuItem(MenuItem::LABEL,id,label,0,NULL,x,y,-1,-1,1,0,0));
67 void Menu::addButton(int id,const string& label,MBCallback cb,int x,int y,int w,int h){
68 items.push_back(MenuItem(MenuItem::BUTTON,id,label,0,cb,x,y,w,h,1,0,0));
70 void Menu::addButton(int id,const string& label,MBCallback cb,int x,int y,int w,int h,float r,float g,float b){
71 items.push_back(MenuItem(MenuItem::BUTTON,id,label,0,cb,x,y,w,h,r,g,b));
73 void Menu::addImage(int id,int texture,int x,int y,int w,int h){
74 items.push_back(MenuItem(MenuItem::IMAGE,id,"",texture,NULL,x,y,w,h,1,1,1));
76 void Menu::addImageButton(int id,int texture,MBCallback cb,int x,int y,int w,int h){
77 items.push_back(MenuItem(MenuItem::IMAGEBUTTON,id,"",texture,cb,x,y,w,h,1,1,1));
79 void Menu::addImageButton(int id,int texture,MBCallback cb,int x,int y,int w,int h,float r,float g,float b){
80 items.push_back(MenuItem(MenuItem::IMAGEBUTTON,id,"",texture,cb,x,y,w,h,r,g,b));
82 void Menu::addMapLine(const XYZ& start, const XYZ& end, float startsize, float endsize, float r,float g,float b){
83 items.push_back(MenuItem(start,end,startsize,endsize,r,g,b));
85 void Menu::addMapMarker(int id,int texture,MBCallback cb,int x,int y,int w,int h,float r,float g,float b){
86 items.push_back(MenuItem(MenuItem::MAPMARKER,id,"",texture,cb,x,y,w,h,r,g,b));
89 void Menu::setMapItem(int id){
90 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
92 if(it->type==MenuItem::LABEL)
93 it->type=MenuItem::MAPLABEL;
98 void Menu::setButtonText(int id,const string& label){
99 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
102 it->w=it->label.length()*10;
107 void Menu::setButtonText(int id,const string& label,int x,int y,int w,int h){
108 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
114 it->w=it->label.length()*10;
121 int Menu::getSelected(int mousex, int mousey){
122 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
123 if(it->type==MenuItem::BUTTON || it->type==MenuItem::IMAGEBUTTON || it->type==MenuItem::MAPMARKER){
126 if(it->type==MenuItem::MAPMARKER){
130 if(mx>=it->x && mx<it->x+it->w && my>=it->y && my<it->y+it->h)
136 void Menu::drawItems(Game* game){
137 glEnable(GL_TEXTURE_2D);
138 glEnable(GL_ALPHA_TEST);
140 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++){
142 case MenuItem::IMAGE:
143 case MenuItem::IMAGEBUTTON:
144 case MenuItem::MAPMARKER:
145 glColor4f(it->r,it->g,it->b,1);
147 if(it->type==MenuItem::MAPMARKER){
148 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
149 glTranslatef(2,-5,0); //from old code
151 glBlendFunc(GL_SRC_ALPHA,GL_ONE);
153 glBindTexture(GL_TEXTURE_2D,it->texture);
154 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
155 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
158 glVertex3f(it->x,it->y,0);
160 glVertex3f(it->x+it->w,it->y,0);
162 glVertex3f(it->x+it->w,it->y+it->h,0);
164 glVertex3f(it->x,it->y+it->h,0);
166 if(it->type!=MenuItem::IMAGE){
167 //mouseover highlight
168 for(int i=0;i<10;i++){
169 if(1-((float)i)/10-(1-it->effectfade)>0){
170 glColor4f(it->r,it->g,it->b,(1-((float)i)/10-(1-it->effectfade))*.25);
173 glVertex3f(it->x-((float)i)*1/2, it->y-((float)i)*1/2, 0);
175 glVertex3f(it->x+it->w+((float)i)*1/2, it->y-((float)i)*1/2, 0);
177 glVertex3f(it->x+it->w+((float)i)*1/2, it->y+it->h+((float)i)*1/2, 0);
179 glVertex3f(it->x-((float)i)*1/2, it->y+it->h+((float)i)*1/2, 0);
186 case MenuItem::LABEL:
187 case MenuItem::BUTTON:
188 glColor4f(it->r,it->g,it->b,1);
189 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
190 game->text.glPrint(it->x,it->y,it->label.c_str(),0,1,640,480);
191 if(it->type!=MenuItem::LABEL){
192 //mouseover highlight
193 glBlendFunc(GL_SRC_ALPHA,GL_ONE);
194 for(int i=0;i<15;i++){
195 if(1-((float)i)/15-(1-it->effectfade)>0){
196 glColor4f(it->r,it->g,it->b,(1-((float)i)/10-(1-it->effectfade))*.25);
197 game->text.glPrint(it->x-((float)i),it->y,it->label.c_str(),0,1+((float)i)/70,640,480);
202 case MenuItem::MAPLABEL:
203 game->text.glPrintOutlined(0.9,0,0,it->x,it->y,it->label.c_str(),0,0.6,640,480);
205 case MenuItem::MAPLINE: {
206 XYZ linestart=it->linestart;
207 XYZ lineend=it->lineend;
208 XYZ offset=lineend-linestart;
211 offset=DoRotation(offset,0,0,90);
214 linestart+=fac*4*it->linestartsize;
215 lineend-=fac*4*it->lineendsize;
217 glDisable(GL_TEXTURE_2D);
218 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
219 glColor4f(it->r,it->g,it->b,1);
221 glTranslatef(2,-5,0); //from old code
223 glVertex3f(linestart.x-offset.x*it->linestartsize, linestart.y-offset.y*it->linestartsize, 0.0f);
224 glVertex3f(linestart.x+offset.x*it->linestartsize, linestart.y+offset.y*it->linestartsize, 0.0f);
225 glVertex3f(lineend.x+offset.x*it->lineendsize, lineend.y+offset.y*it->lineendsize, 0.0f);
226 glVertex3f(lineend.x-offset.x*it->lineendsize, lineend.y-offset.y*it->lineendsize, 0.0f);
229 glEnable(GL_TEXTURE_2D);