8 extern float multiplier;
11 enum MenuItemType{NONE,LABEL,BUTTON,IMAGE,IMAGEBUTTON,MAPMARKER,MAPLINE,MAPLABEL} type;
23 void init(MenuItemType _type, int _id, const string& _label, int _texture, MBCallback _cb,
24 int _x, int _y, int _w, int _h, float _r, float _g, float _b,
25 float _linestartsize=1, float _lineendsize=1){
31 x=_x; y=_y; w=_w; h=_h;
34 linestartsize=_linestartsize;
35 lineendsize=_lineendsize;
36 if(type==MenuItem::BUTTON){
45 vector<MenuItem> items;
50 void Menu::GUITick(Game* game){
51 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++){
52 if(it->id==game->selected){
53 it->effectfade+=multiplier*5;
57 it->effectfade-=multiplier*5;
64 void Menu::clearMenu(){
68 void Menu::addLabel(int id,const string& label,int x,int y){
69 items.push_back(MenuItem());
70 items.back().init(MenuItem::LABEL,id,label,0,NULL,x,y,-1,-1,1,0,0);
72 void Menu::addButton(int id,const string& label,MBCallback cb,int x,int y,int w,int h,float r,float g,float b){
73 items.push_back(MenuItem());
74 items.back().init(MenuItem::BUTTON,id,label,0,cb,x,y,w,h,r,g,b);
76 void Menu::addImage(int id,int texture,int x,int y,int w,int h){
77 items.push_back(MenuItem());
78 items.back().init(MenuItem::IMAGE,id,"",texture,NULL,x,y,w,h,1,1,1);
80 void Menu::addImageButton(int id,int texture,MBCallback cb,int x,int y,int w,int h,float r,float g,float b){
81 items.push_back(MenuItem());
82 items.back().init(MenuItem::IMAGEBUTTON,id,"",texture,cb,x,y,w,h,r,g,b);
84 void Menu::addMapLine(int x, int y, int w, int h, float startsize, float endsize, float r,float g,float b){
85 items.push_back(MenuItem());
86 items.back().init(MenuItem::MAPLINE,-1,"",0,NULL,x,y,w,h,r,g,b,startsize,endsize);
88 void Menu::addMapMarker(int id,int texture,MBCallback cb,int x,int y,int w,int h,float r,float g,float b){
89 items.push_back(MenuItem());
90 items.back().init(MenuItem::MAPMARKER,id,"",texture,cb,x,y,w,h,r,g,b);
93 void Menu::setMapItem(int id){
94 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
96 if(it->type==MenuItem::LABEL)
97 it->type=MenuItem::MAPLABEL;
102 void Menu::setButtonText(int id,const string& label){
103 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
106 it->w=it->label.length()*10;
111 void Menu::setButtonText(int id,const string& label,int x,int y,int w,int h){
112 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
118 it->w=it->label.length()*10;
125 int Menu::getSelected(int mousex, int mousey){
126 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++)
127 if(it->type==MenuItem::BUTTON || it->type==MenuItem::IMAGEBUTTON || it->type==MenuItem::MAPMARKER){
130 if(it->type==MenuItem::MAPMARKER){
134 if(mx>=it->x && mx<it->x+it->w && my>=it->y && my<it->y+it->h)
140 void Menu::drawItems(Game* game){
141 glEnable(GL_TEXTURE_2D);
142 glEnable(GL_ALPHA_TEST);
144 for(vector<MenuItem>::iterator it=items.begin();it!=items.end();it++){
146 case MenuItem::IMAGE:
147 case MenuItem::IMAGEBUTTON:
148 case MenuItem::MAPMARKER:
149 glColor4f(it->r,it->g,it->b,1);
151 if(it->type==MenuItem::MAPMARKER){
152 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
153 glTranslatef(2,-5,0); //from old code
155 glBlendFunc(GL_SRC_ALPHA,GL_ONE);
157 glBindTexture(GL_TEXTURE_2D,it->texture);
158 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
159 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
162 glVertex3f(it->x,it->y,0);
164 glVertex3f(it->x+it->w,it->y,0);
166 glVertex3f(it->x+it->w,it->y+it->h,0);
168 glVertex3f(it->x,it->y+it->h,0);
170 if(it->type!=MenuItem::IMAGE){
171 //mouseover highlight
172 for(int i=0;i<10;i++){
173 if(1-((float)i)/10-(1-it->effectfade)>0){
174 glColor4f(it->r,it->g,it->b,(1-((float)i)/10-(1-it->effectfade))*.25);
177 glVertex3f(it->x-((float)i)*1/2, it->y-((float)i)*1/2, 0);
179 glVertex3f(it->x+it->w+((float)i)*1/2, it->y-((float)i)*1/2, 0);
181 glVertex3f(it->x+it->w+((float)i)*1/2, it->y+it->h+((float)i)*1/2, 0);
183 glVertex3f(it->x-((float)i)*1/2, it->y+it->h+((float)i)*1/2, 0);
190 case MenuItem::LABEL:
191 case MenuItem::BUTTON:
192 glColor4f(it->r,it->g,it->b,1);
193 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
194 game->text.glPrint(it->x,it->y,it->label.c_str(),0,1,640,480);
195 if(it->type!=MenuItem::LABEL){
196 //mouseover highlight
197 glBlendFunc(GL_SRC_ALPHA,GL_ONE);
198 for(int i=0;i<15;i++){
199 if(1-((float)i)/15-(1-it->effectfade)>0){
200 glColor4f(it->r,it->g,it->b,(1-((float)i)/10-(1-it->effectfade))*.25);
201 game->text.glPrint(it->x-((float)i),it->y,it->label.c_str(),0,1+((float)i)/70,640,480);
206 case MenuItem::MAPLABEL:
207 game->text.glPrintOutlined(0.9,0,0,it->x,it->y,it->label.c_str(),0,0.6,640,480);
209 case MenuItem::MAPLINE: {
215 lineend.x=it->x+it->w;
216 lineend.y=it->y+it->h;
218 XYZ offset=lineend-linestart;
221 offset=DoRotation(offset,0,0,90);
224 linestart+=fac*4*it->linestartsize;
225 lineend-=fac*4*it->lineendsize;
227 glDisable(GL_TEXTURE_2D);
228 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
229 glColor4f(it->r,it->g,it->b,1);
231 glTranslatef(2,-5,0); //from old code
233 glVertex3f(linestart.x-offset.x*it->linestartsize, linestart.y-offset.y*it->linestartsize, 0.0f);
234 glVertex3f(linestart.x+offset.x*it->linestartsize, linestart.y+offset.y*it->linestartsize, 0.0f);
235 glVertex3f(lineend.x+offset.x*it->lineendsize, lineend.y+offset.y*it->lineendsize, 0.0f);
236 glVertex3f(lineend.x-offset.x*it->lineendsize, lineend.y-offset.y*it->lineendsize, 0.0f);
239 glEnable(GL_TEXTURE_2D);