void renderclip(entity &e) { float xradius = max(float(e.attr2), 0.1f), yradius = max(float(e.attr3), 0.1f); vec bbmin(e.x - xradius, e.y - yradius, float(S(e.x, e.y)->floor+e.attr1)), bbmax(e.x + xradius, e.y + yradius, bbmin.z + max(float(e.attr4), 0.1f)); glDisable(GL_TEXTURE_2D); switch(e.type) { case CLIP: linestyle(1, 0xFF, 0xFF, 0); break; // yellow case MAPMODEL: linestyle(1, 0, 0xFF, 0); break; // green case PLCLIP: linestyle(1, 0xFF, 0, 0xFF); break; // magenta default: linestyle(1, 0xFF, 0, 0); break; // red } glBegin(GL_LINES); glVertex3f(bbmin.x, bbmin.y, bbmin.z); loopi(2) glVertex3f(bbmax.x, bbmin.y, bbmin.z); loopi(2) glVertex3f(bbmax.x, bbmax.y, bbmin.z); loopi(2) glVertex3f(bbmin.x, bbmax.y, bbmin.z); glVertex3f(bbmin.x, bbmin.y, bbmin.z); glVertex3f(bbmin.x, bbmin.y, bbmax.z); loopi(2) glVertex3f(bbmax.x, bbmin.y, bbmax.z); loopi(2) glVertex3f(bbmax.x, bbmax.y, bbmax.z); loopi(2) glVertex3f(bbmin.x, bbmax.y, bbmax.z); glVertex3f(bbmin.x, bbmin.y, bbmax.z); loopi(8) glVertex3f(i&2 ? bbmax.x : bbmin.x, i&4 ? bbmax.y : bbmin.y, i&1 ? bbmax.z : bbmin.z); glEnd(); glEnable(GL_TEXTURE_2D); }
void cursorupdate() // called every frame from hud { flrceil = ((int)(player1->pitch>=0))*2; volatile float x = worldpos.x; // volatile needed to prevent msvc7 optimizer bug? volatile float y = worldpos.y; volatile float z = worldpos.z; cx = (int)x; cy = (int)y; if(OUTBORD(cx, cy)) return; sqr *s = S(cx,cy); if(fabs(sheight(s,s,z)-z)>1) // selected wall { x += x>player1->o.x ? 0.5f : -0.5f; // find right wall cube y += y>player1->o.y ? 0.5f : -0.5f; cx = (int)x; cy = (int)y; if(OUTBORD(cx, cy)) return; }; if(dragging) makesel(); const int GRIDSIZE = 5; const float GRIDW = 0.5f; const float GRID8 = 2.0f; const float GRIDS = 2.0f; const int GRIDM = 0x7; // render editing grid /* for(int ix = cx-GRIDSIZE; ix<=cx+GRIDSIZE; ix++) for(int iy = cy-GRIDSIZE; iy<=cy+GRIDSIZE; iy++) { if(OUTBORD(ix, iy)) continue; sqr *s = S(ix,iy); if(SOLID(s)) continue; float h1 = sheight(s, s, z); float h2 = sheight(s, SWS(s,1,0,ssize), z); float h3 = sheight(s, SWS(s,1,1,ssize), z); float h4 = sheight(s, SWS(s,0,1,ssize), z); if(s->tag) linestyle(GRIDW, 0xFF, 0x40, 0x40); else if(s->type==FHF || s->type==CHF) linestyle(GRIDW, 0x80, 0xFF, 0x80); else linestyle(GRIDW, 0x80, 0x80, 0x80); block b = { ix, iy, 1, 1 }; box(b, h1, h2, h3, h4); linestyle(GRID8, 0x40, 0x40, 0xFF); if(!(ix&GRIDM)) line(ix, iy, h1, ix, iy+1, h4); if(!(ix+1&GRIDM)) line(ix+1, iy, h2, ix+1, iy+1, h3); if(!(iy&GRIDM)) line(ix, iy, h1, ix+1, iy, h2); if(!(iy+1&GRIDM)) line(ix, iy+1, h4, ix+1, iy+1, h3); }; */ if(!SOLID(s)) { float ih = sheight(s, s, z); linestyle(GRIDS, 0xFF, 0xFF, 0xFF); block b = { cx, cy, 1, 1 }; box(b, ih, sheight(s, SWS(s,1,0,ssize), z), sheight(s, SWS(s,1,1,ssize), z), sheight(s, SWS(s,0,1,ssize), z)); linestyle(GRIDS, 0xFF, 0x00, 0x00); dot(cx, cy, ih); ch = (int)ih; }; if(selset) { linestyle(GRIDS, 0xFF, 0x40, 0x40); box(sel, (float)selh, (float)selh, (float)selh, (float)selh); std::vector< std::pair<block, int> >::iterator sel_it = secondary_sel.begin(); std::vector< std::pair<block, int> >::iterator sel_end = secondary_sel.end(); for (; sel_it != sel_end; ++sel_it) box(sel_it->first, (float)sel_it->second, (float)sel_it->second, (float)sel_it->second, (float)sel_it->second); }; };