model *loadmodel(const char *name, int i) { if(!name) { if(!mapmodels.inrange(i)) return NULL; mapmodelinfo &mmi = mapmodels[i]; if(mmi.m) return mmi.m; name = mmi.name; }; model **mm = mdllookup.access(name); model *m; if(mm) m = *mm; else { m = new md2(name); loadingmodel = m; if(!m->load()) { delete m; m = new md3(name); loadingmodel = m; if(!m->load()) { delete m; loadingmodel = NULL; return NULL; }; }; loadingmodel = NULL; mdllookup.access(m->name(), &m); }; if(mapmodels.inrange(i) && !mapmodels[i].m) mapmodels[i].m = m; return m; };
void delmenu(const char *name) { if (!name) return; gmenu *m = menus.access(name); if (!m) return; else menureset(m); }
void newfont(char *name, char *tex, int *defaultw, int *defaulth, int *offsetx, int *offsety, int *offsetw, int *offseth) { if(*defaulth < 10) return; // (becomes FONTH) Texture *_tex = textureload(tex); if(_tex == notexture || !_tex->xs || !_tex->ys) return; font *f = fonts.access(name); if(!f) { name = newstring(name); f = &fonts[name]; f->name = name; } f->tex = _tex; f->chars.shrink(0); f->defaultw = *defaultw; f->defaulth = *defaulth; f->offsetx = *offsetx; f->offsety = *offsety; f->offsetw = *offsetw; f->offseth = *offseth; f->skip = 33; fontdef = f; }
void closemenu(const char *name) { gmenu *m; if(!name) { if(curmenu) curmenu->close(); while(!menustack.empty()) { m = menustack.pop(); if(m) m->close(); } curmenu = NULL; return; } m = menus.access(name); if(!m) return; if(curmenu==m) menuset(menustack.empty() ? NULL : menustack.pop(), false); else loopv(menustack) { if(menustack[i]==m) { menustack.remove(i); return; } } }
bool setfont(const char *name) { font *f = fonts.access(name); if(!f) return false; curfont = f; return true; }
void findnormal(const vec &key, const vec &surface, vec &v) { const nval *val = normalgroups.access(key); if(!val) { v = surface; return; } v = vec(0, 0, 0); int total = 0; if(surface.x >= lerpthreshold) { int n = (val->flat>>4)&0xF; v.x += n; total += n; }
void newgui(char *name, char *contents) { if(guis.access(name)) { delete[] guis[name]; guis[name] = newstring(contents); } else guis[newstring(name)] = newstring(contents); };
void chmenumdl(char *menu, char *mdl, char *anim, int *rotspeed, int *scale) { if(!menu || !menus.access(menu)) return; gmenu &m = menus[menu]; DELETEA(m.mdl); if(!mdl ||!*mdl) return; m.mdl = newstring(mdl); m.anim = findanim(anim)|ANIM_LOOP; m.rotspeed = clamp(*rotspeed, 0, 100); m.scale = clamp(*scale, 0, 100); }
void gui(g3d_gui &g, bool firstpass) { if(guistack.empty()) return; char *name = guistack.last(); char **contents = guis.access(name); if(!contents) return; cgui = &g; cgui->start(menustart, 0.03f, &menutab); guitab(name); execute(*contents); cgui->end(); cgui = NULL; };
void destroyvbo(GLuint vbo) { vboinfo *exists = vbos.access(vbo); if(!exists) return; vboinfo &vbi = *exists; if(vbi.uses <= 0) return; vbi.uses--; if(!vbi.uses) { glDeleteBuffers_(1, &vbo); if(vbi.data) delete[] vbi.data; vbos.remove(vbo); } }
bool setfont(const char *name) { font *f = fonts.access(name); if(!f) return false; int v = -1; if(strcmp(name, "default")==0) v = 0; else if(strcmp(name, "serif")==0) v = 1; else if(strcmp(name, "mono")==0) v = 2; if(v!=-1) __fontsetting = v; curfont = f; return true; }
void addauth(char *name, char *flags, char *pubkey, char *email) { string authname; if(filterstring(authname, name, true, true, true, true, 100)) name = authname; if(authusers.access(name)) { conoutf("auth handle '%s' already exists, skipping (%s)", name, email); return; } name = newstring(name); authuser &u = authusers[name]; u.name = name; u.flags = newstring(flags); u.pubkey = parsepubkey(pubkey); u.email = newstring(email); }
void showgui(char *name) { int pos = guistack.find(name); if(pos<0) { if(!guis.access(name)) return; if(guistack.empty()) menupos = menuinfrontofplayer(); guistack.add(newstring(name)); } else { pos = guistack.length()-pos-1; loopi(pos) delete[] guistack.pop(); }; menutab = 1; menustart = lastmillis; };
void showmenu(const char *name, bool top) { if(!name) { curmenu = NULL; return; } gmenu *m = menus.access(name); if(!m) return; if(!top && curmenu) { if(curmenu==m) return; loopv(menustack) if(menustack[i]==m) return; menustack.insert(0, m); return; } menuset(m); }
void newfont(char *name, char *tex, int *defaultw, int *defaulth, int *offsetx, int *offsety, int *offsetw, int *offseth) { font *f = fonts.access(name); if(!f) { name = newstring(name); f = &fonts[name]; f->name = name; } f->tex = textureload(tex); f->chars.setsize(0); f->defaultw = *defaultw; f->defaulth = *defaulth; f->offsetx = *offsetx; f->offsety = *offsety; f->offsetw = *offsetw; f->offseth = *offseth; fontdef = f; }
void menuselection(char *menu, int *line) { if(!menu || !menus.access(menu)) return; gmenu &m = menus[menu]; menuselect(&m, *line); }
void preloadmodel(const char *name) { if(mdllookup.access(name)) return; preloadmodels.add(newstring(name)); }
font *getfont(const char *name) { return fonts.access(name); }