/** ** Draw all units on visible map. ** FIXME: Must use the redraw tile flags in this function */ global void DrawUnits(void) { Unit* unit; Unit* table[MAX_UNITS]; int n; int i; // // Select all units touching the viewpoint. // n=SelectUnits(MapX,MapY,MapX+MapWidth,MapY+MapHeight,table); // // 2a) corpse aren't in the cache. // for( i=0; i<NumUnits; ++i ) { unit=Units[i]; if( unit->Type->Vanishes || unit->Command.Action==UnitActionDie ) { DrawUnit(unit); } } // // 2b) buildings // for( i=0; i<n; ++i ) { unit=table[i]; if( !unit->Removed && UnitVisible(unit) ) { if( unit->Type->Building ) { DrawBuilding(unit); table[i]=NoUnitP; } } else { table[i]=NoUnitP; } } // // 3) land/sea units // for( i=0; i<n; ++i ) { if( !(unit=table[i]) ) { continue; } if( unit->Type->UnitType!=UnitTypeFly ) { DrawUnit(unit); table[i]=NoUnitP; } } // // 5) flying units // for( i=0; i<n; ++i ) { if( !(unit=table[i]) ) { continue; } DrawUnit(unit); } }
void GCDCGraphs::OnPaint(wxPaintEvent& e) { if (m_draws_wdg->GetSelectedDraw() == NULL) return; wxBufferedPaintDC pdc(this); wxGraphicsContext* dc = wxGraphicsContext::Create(pdc); dc->SetFont(GetFont(), *wxWHITE); RecalculateMargins(*dc); DrawBackground(*dc); dc->SetBrush(*wxWHITE_BRUSH); dc->SetPen(wxPen(wxColour(255, 255, 255, 255), 1, wxSOLID)); DrawXAxis(*dc); DrawXAxisVals(*dc); DrawYAxis(*dc); DrawYAxisVals(*dc); DrawUnit(*dc); DrawWindowInfo(*dc); DrawSeasonsLimitsInfo(*dc); if (m_draws_wdg->GetNoData() == true) DrawNoData(*dc); else DrawGraphs(*dc); DrawRemarksBitmaps(*dc); if (m_draw_param_name) DrawParamName(*dc); delete dc; }
//! 描画. void UnitBase::Draw() { if( this->IsDead() ){ return; } if( this->IsDamaged() ){ if( mDamageFrame % 5 == 0 ){ return; } } DrawUnit(); }
void CMiniMap::DrawUnitHighlight(CUnit* unit) { glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.1f); glEnable(GL_COLOR_LOGIC_OP); glLogicOp(GL_COPY_INVERTED); const float origX = unitSizeX; const float origY = unitSizeY; unitSizeX *= 2.0f; unitSizeY *= 2.0f; DrawUnit(unit); glDisable(GL_ALPHA_TEST); glDisable(GL_COLOR_LOGIC_OP); unitSizeX = origX; unitSizeY = origY; DrawUnit(unit); return; }
void BackgroundView::DoDraw(wxDC *dc) { dc->Clear(); DrawBackground(dc); DrawSeasonLimits(dc); DrawTimeAxis(dc, 8, 4, 6); DrawYAxis(dc, 7, 5); DrawUnit(dc, 6, 8); DrawYAxisVals(dc, 4); DrawRemarksFlags(dc); }
/* Renders all players positions every frame */ void clash::Render() { sf::RectangleShape temp; sf::Text _number; _number.setFont(_font); _number.setCharacterSize(20); _number.setColor(sf::Color::Black); for (int i = 0; i < CHECKBOARD; i++) { for (int j = 0; j < CHECKBOARD; j++) { DrawUnit(_checkBoard[i][j], sf::Vector2i(i, j)); if (_checkBoard[i][j]._field == FACTORY) DrawMarker(sf::Vector2i(i, j), sf::Color::Black); if (_checkBoard[i][j]._entity != NONE) { if (_checkBoard[i][j]._field == FACTORY) _number.setString("F: " + toString(_checkBoard[i][j].CountUnits())); else if (_checkBoard[i][j]._field == CORE) _number.setString("CORE: " + toString(_checkBoard[i][j].CountUnits())); else _number.setString(toString(_checkBoard[i][j].CountUnits())); _number.setPosition(sf::Vector2f(_checkBoard[i][j]._pos.x + 5, _checkBoard[i][j]._pos.y + 5)); Window.draw(_number); } } } DrawMarker(_currentMouseOver, sf::Color(49, 49, 76)); if (_currentChoosen.x >= 0) DrawMarker(_currentChoosen, sf::Color(0xb3, 0x68, 0xb3)); if (sf::Mouse::isButtonPressed(sf::Mouse::Right) && _currentChoosen != _currentMouseOver) DrawMarker(_currentMouseOver, sf::Color(120, 0, 0)); }
void CMiniMap::DrawForReal() { SCOPED_TIMER("Draw minimap"); setSurfaceCircleFunc(DrawSurfaceCircle); setSurfaceSquareFunc(DrawSurfaceSquare); cursorIcons.Enable(false); //glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthFunc(GL_LEQUAL); if (minimized) { if (!slaveDrawMode) { DrawMinimizedButton(); } cursorIcons.Enable(true); setSurfaceCircleFunc(NULL); setSurfaceSquareFunc(NULL); return; } glViewport(xpos, ypos, width, height); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0e6, +1.0e6); glMatrixMode(GL_MODELVIEW); glColor4f(0.6f, 0.6f, 0.6f, 1.0f); // draw the map glDisable(GL_BLEND); readmap->DrawMinimap(); glEnable(GL_BLEND); // move some of the transform to the GPU glTranslatef(0.0f, +1.0f, 0.0f); glScalef(+1.0f / (gs->mapx * SQUARE_SIZE), -1.0f / (gs->mapy * SQUARE_SIZE), 1.0); glEnable(GL_TEXTURE_2D); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.0f); // draw the units std::list<CUnit*>::iterator ui; for (ui = uh->activeUnits.begin(); ui != uh->activeUnits.end(); ui++) { DrawUnit(*ui); } // highlight the selected unit CUnit* unit = GetSelectUnit(GetMapPosition(mouse->lastx, mouse->lasty)); if (unit != NULL) { DrawUnitHighlight(unit); } glDisable(GL_ALPHA_TEST); glDisable(GL_TEXTURE_2D); left.clear(); // add restraints for camera sides GetFrustumSide(cam2->bottom); GetFrustumSide(cam2->top); GetFrustumSide(cam2->rightside); GetFrustumSide(cam2->leftside); if (!minimap->maximized) { // draw the camera lines std::vector<fline>::iterator fli,fli2; for(fli=left.begin();fli!=left.end();fli++){ for(fli2=left.begin();fli2!=left.end();fli2++){ if(fli==fli2) continue; float colz=0; if(fli->dir-fli2->dir==0) continue; colz=-(fli->base-fli2->base)/(fli->dir-fli2->dir); if(fli2->left*(fli->dir-fli2->dir)>0){ if(colz>fli->minz && colz<400096) fli->minz=colz; } else { if(colz<fli->maxz && colz>-10000) fli->maxz=colz; } } } glColor4f(1,1,1,0.5f); glBegin(GL_LINES); for(fli = left.begin(); fli != left.end(); fli++) { if(fli->minz < fli->maxz) { DrawInMap2D(fli->base + (fli->dir * fli->minz), fli->minz); DrawInMap2D(fli->base + (fli->dir * fli->maxz), fli->maxz); } } glEnd(); } glRotatef(-90.0f, +1.0f, 0.0f, 0.0f); // real 'world' coordinates // draw the projectiles if (drawProjectiles && ph->ps.size()>0) { CVertexArray* lines=GetVertexArray(); CVertexArray* points=GetVertexArray(); lines->Initialize(); lines->EnlargeArrays(ph->ps.size()*2,0,VA_SIZE_C); points->Initialize(); points->EnlargeArrays(ph->ps.size(),0,VA_SIZE_C); static unsigned char red[4] = {255,0,0,255}; static unsigned char redA[4] = {255,0,0,128}; static unsigned char yellow[4] = {255,255,0,255}; static unsigned char green[4] = {0,255,0,25}; static unsigned char white[4] = {255,255,255,25}; Projectile_List::iterator psi; for(psi = ph->ps.begin(); psi != ph->ps.end(); ++psi) { CProjectile* p = *psi; if ((p->owner && (p->owner->allyteam == gu->myAllyTeam)) || gu->spectatingFullView || loshandler->InLos(p, gu->myAllyTeam)) { if (dynamic_cast<CGeoThermSmokeProjectile*>(p)) { } else if (dynamic_cast<CGfxProjectile*>(p)) {//Nano-piece points->AddVertexQC(p->pos,green); } else if (dynamic_cast<CBeamLaserProjectile*>(p)) { CBeamLaserProjectile& beam = *(CBeamLaserProjectile*)p; unsigned char color[4] = {beam.kocolstart[0],beam.kocolstart[1],beam.kocolstart[2],255}; lines->AddVertexQC(beam.startPos,color); lines->AddVertexQC(beam.endPos,color); } else if (dynamic_cast<CLargeBeamLaserProjectile*>(p)) { CLargeBeamLaserProjectile& beam = *(CLargeBeamLaserProjectile*)p; unsigned char color[4] = {beam.kocolstart[0],beam.kocolstart[1],beam.kocolstart[2],255}; lines->AddVertexQC(beam.startPos,color); lines->AddVertexQC(beam.endPos,color); } else if (dynamic_cast<CLightingProjectile*>(p)) { CLightingProjectile& beam = *(CLightingProjectile*)p; unsigned char color[4] = {(unsigned char)beam.color[0]*255,(unsigned char)beam.color[1]*255,(unsigned char)beam.color[2]*255,255}; lines->AddVertexQC(beam.pos,color); lines->AddVertexQC(beam.endPos,color); } else if (dynamic_cast<CPieceProjectile*>(p)) { points->AddVertexQC(p->pos,red); } else if (dynamic_cast<CWreckProjectile*>(p)) { points->AddVertexQC(p->pos,redA); } else if (dynamic_cast<CWeaponProjectile*>(p)) { points->AddVertexQC(p->pos,yellow); } else { points->AddVertexQC(p->pos,white); } } } lines->DrawArrayC(GL_LINES); points->DrawArrayC(GL_POINTS); } // draw the queued commands // // NOTE: this needlessly adds to the CursorIcons list, but at least // they are not drawn (because the input receivers are drawn // after the command queues) LuaUnsyncedCtrl::DrawUnitCommandQueues(); if ((drawCommands > 0) && guihandler->GetQueueKeystate()) { selectedUnits.DrawCommands(); } glDisable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // draw the selection shape, and some ranges if (drawCommands > 0) { guihandler->DrawMapStuff(!!drawCommands); } // draw unit ranges const float radarSquare = (SQUARE_SIZE * RADAR_SIZE); CUnitSet& selUnits = selectedUnits.selectedUnits; for(CUnitSet::iterator si = selUnits.begin(); si != selUnits.end(); ++si) { CUnit* unit = *si; if (unit->radarRadius && !unit->beingBuilt && unit->activated) { glColor3fv(cmdColors.rangeRadar); DrawCircle(unit->pos, (unit->radarRadius * radarSquare)); } if (unit->sonarRadius && !unit->beingBuilt && unit->activated) { glColor3fv(cmdColors.rangeSonar); DrawCircle(unit->pos, (unit->sonarRadius * radarSquare)); } if (unit->jammerRadius && !unit->beingBuilt && unit->activated) { glColor3fv(cmdColors.rangeJammer); DrawCircle(unit->pos, (unit->jammerRadius * radarSquare)); } // change if someone someday create a non stockpiled interceptor const CWeapon* w = unit->stockpileWeapon; if((w != NULL) && w->weaponDef->interceptor) { if (w->numStockpiled) { glColor3fv(cmdColors.rangeInterceptorOn); } else { glColor3fv(cmdColors.rangeInterceptorOff); } DrawCircle(unit->pos, w->weaponDef->coverageRange); } } glRotatef(+90.0f, +1.0f, 0.0f, 0.0f); // revert to the 2d xform // selection box glColor4f(1.0f, 1.0f, 1.0f, 1.0f); CMouseHandler::ButtonPress& bp = mouse->buttons[SDL_BUTTON_LEFT]; if (selecting && fullProxy && (bp.movement > 4)) { const float3 oldPos = GetMapPosition(bp.x, bp.y); const float3 newPos = GetMapPosition(mouse->lastx, mouse->lasty); glColor4fv(cmdColors.mouseBox); glBlendFunc((GLenum)cmdColors.MouseBoxBlendSrc(), (GLenum)cmdColors.MouseBoxBlendDst()); glLineWidth(cmdColors.MouseBoxLineWidth()); glBegin(GL_LINE_LOOP); DrawInMap2D(oldPos.x, oldPos.z); DrawInMap2D(newPos.x, oldPos.z); DrawInMap2D(newPos.x, newPos.z); DrawInMap2D(oldPos.x, newPos.z); glEnd(); glLineWidth(1.0f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } DrawNotes(); // allow the LUA scripts to draw into the minimap eventHandler.DrawInMiniMap(); // reset the modelview glLoadIdentity(); if (!slaveDrawMode) { DrawButtons(); // outline glLineWidth(1.51f); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glViewport(xpos - 1, ypos - 1, width + 2, height + 2); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glRectf(0.0f, 0.0f, 1.0f, 1.0f); glViewport(xpos - 2, ypos - 2, width + 4, height + 4); glColor4f(0.0f, 0.0f, 0.0f, 1.0f); glRectf(0.0f, 0.0f, 1.0f, 1.0f); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glLineWidth(1.0f); } glViewport(gu->viewPosX, 0, gu->viewSizeX, gu->viewSizeY); cursorIcons.Enable(true); setSurfaceCircleFunc(NULL); setSurfaceSquareFunc(NULL); }
void CMiniMap::DrawForReal(bool use_geo) { SCOPED_TIMER("MiniMap::DrawForReal"); //glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPushAttrib(GL_DEPTH_BUFFER_BIT); glDisable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glDepthMask(GL_FALSE); glDisable(GL_TEXTURE_2D); glMatrixMode(GL_MODELVIEW); if (minimized) { if (!slaveDrawMode) { DrawMinimizedButton(); } glPopAttrib(); glEnable(GL_TEXTURE_2D); return; } // draw the frameborder if (!slaveDrawMode && !globalRendering->dualScreenMode && !maximized) { glEnable(GL_BLEND); DrawFrame(); glDisable(GL_BLEND); } bool resetTextureMatrix = false; if (use_geo) { glPushMatrix(); // switch to normalized minimap coords if (globalRendering->dualScreenMode) { glViewport(xpos, ypos, width, height); glScalef(width * globalRendering->pixelX, height * globalRendering->pixelY, 1.0f); } else { glTranslatef(xpos * globalRendering->pixelX, ypos * globalRendering->pixelY, 0.0f); glScalef(width * globalRendering->pixelX, height * globalRendering->pixelY, 1.0f); } /* FIXME: fix mouse handling too and make it fully customizable, so Lua can rotate the minimap to any angle CCameraController* camController = &camHandler->GetCurrentController(); COverheadController* taCam = dynamic_cast<COverheadController*>(camController); SmoothController* smCam = dynamic_cast<SmoothController*>(camController); if ((taCam && taCam->flipped) || (smCam && smCam->flipped)) { glTranslatef(1.0f, 1.0f, 0.0f); glScalef(-1.0f, -1.0f, 1.0f); glMatrixMode(GL_TEXTURE); glPushMatrix(); glTranslatef(1.0f, 1.0f, 0.0f); glScalef(-1.0f, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); resetTextureMatrix = true; }*/ } setSurfaceCircleFunc(DrawSurfaceCircle); setSurfaceSquareFunc(DrawSurfaceSquare); cursorIcons.Enable(false); glColor4f(0.6f, 0.6f, 0.6f, 1.0f); // don't mirror the map texture with flipped cameras glMatrixMode(GL_TEXTURE); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); // draw the map glDisable(GL_BLEND); readmap->DrawMinimap(); glEnable(GL_BLEND); glMatrixMode(GL_TEXTURE); glPopMatrix(); glMatrixMode(GL_MODELVIEW); // clip everything outside of the minimap box { const double plane0[4] = {0,-1,0,1}; const double plane1[4] = {0,1,0,0}; const double plane2[4] = {-1,0,0,1}; const double plane3[4] = {1,0,0,0}; glClipPlane(GL_CLIP_PLANE0, plane0); // clip bottom glClipPlane(GL_CLIP_PLANE1, plane1); // clip top glClipPlane(GL_CLIP_PLANE2, plane2); // clip right glClipPlane(GL_CLIP_PLANE3, plane3); // clip left glEnable(GL_CLIP_PLANE0); glEnable(GL_CLIP_PLANE1); glEnable(GL_CLIP_PLANE2); glEnable(GL_CLIP_PLANE3); } // switch to top-down map/world coords (z is twisted with y compared to the real map/world coords) glPushMatrix(); glTranslatef(0.0f, +1.0f, 0.0f); glScalef(+1.0f / (gs->mapx * SQUARE_SIZE), -1.0f / (gs->mapy * SQUARE_SIZE), 1.0f); glEnable(GL_TEXTURE_2D); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.0f); { GML_RECMUTEX_LOCK(unit); // DrawForReal const std::set<CUnit*>& units = unitDrawer->GetUnsortedUnits(); for (std::set<CUnit*>::const_iterator it = units.begin(); it != units.end(); ++it) { DrawUnit(*it); } // highlight the selected unit CUnit* unit = GetSelectUnit(GetMapPosition(mouse->lastx, mouse->lasty)); if (unit != NULL) { DrawUnitHighlight(unit); } } glDisable(GL_ALPHA_TEST); glDisable(GL_TEXTURE_2D); glPushMatrix(); glRotatef(-90.0f, +1.0f, 0.0f, 0.0f); // real 'world' coordinates glScalef(1.0f, 0.0f, 1.0f); // skip the y-coord (Lua's DrawScreen is perspective and so any z-coord in it influence the x&y, too) // draw the projectiles if (drawProjectiles) { projectileDrawer->DrawProjectilesMiniMap(); } // draw the queued commands // // NOTE: this needlessly adds to the CursorIcons list, but at least // they are not drawn (because the input receivers are drawn // after the command queues) LuaUnsyncedCtrl::DrawUnitCommandQueues(); if ((drawCommands > 0) && guihandler->GetQueueKeystate()) { selectedUnits.DrawCommands(); } lineDrawer.DrawAll(); // draw the selection shape, and some ranges if (drawCommands > 0) { guihandler->DrawMapStuff(!!drawCommands); } { GML_RECMUTEX_LOCK(sel); // DrawForReal // draw unit ranges const float radarSquare = radarhandler->radarDiv; CUnitSet& selUnits = selectedUnits.selectedUnits; for(CUnitSet::iterator si = selUnits.begin(); si != selUnits.end(); ++si) { CUnit* unit = *si; if (unit->radarRadius && !unit->beingBuilt && unit->activated) { glColor3fv(cmdColors.rangeRadar); DrawCircle(unit->pos, (unit->radarRadius * radarSquare)); } if (unit->sonarRadius && !unit->beingBuilt && unit->activated) { glColor3fv(cmdColors.rangeSonar); DrawCircle(unit->pos, (unit->sonarRadius * radarSquare)); } if (unit->jammerRadius && !unit->beingBuilt && unit->activated) { glColor3fv(cmdColors.rangeJammer); DrawCircle(unit->pos, (unit->jammerRadius * radarSquare)); } // change if someone someday create a non stockpiled interceptor const CWeapon* w = unit->stockpileWeapon; if((w != NULL) && w->weaponDef->interceptor) { if (w->numStockpiled) { glColor3fv(cmdColors.rangeInterceptorOn); } else { glColor3fv(cmdColors.rangeInterceptorOff); } DrawCircle(unit->pos, w->weaponDef->coverageRange); } } } glPopMatrix(); // revert to the 2d xform if (!minimap->maximized) { // draw the camera frustum lines cam2->GetFrustumSides(0.0f, 0.0f, 1.0f, true); cam2->ClipFrustumLines(true, -10000.0f, 400096.0f); const std::vector<CCamera::FrustumLine>& negSides = cam2->negFrustumSides; const std::vector<CCamera::FrustumLine>& posSides = cam2->posFrustumSides; std::vector<CCamera::FrustumLine>::const_iterator fli; CVertexArray* va = GetVertexArray(); va->Initialize(); va->EnlargeArrays(negSides.size() * 2, 0, VA_SIZE_2D0); for (fli = negSides.begin(); fli != negSides.end(); ++fli) { if (fli->minz < fli->maxz) { va->AddVertex2dQ0(fli->base + (fli->dir * fli->minz), fli->minz); va->AddVertex2dQ0(fli->base + (fli->dir * fli->maxz), fli->maxz); } } glLineWidth(2.5f); glColor4f(0, 0, 0, 0.5f); va->DrawArray2d0(GL_LINES); glLineWidth(1.5f); glColor4f(1, 1, 1, 0.75f); va->DrawArray2d0(GL_LINES); glLineWidth(1.0f); } // selection box glColor4f(1.0f, 1.0f, 1.0f, 1.0f); CMouseHandler::ButtonPressEvt& bp = mouse->buttons[SDL_BUTTON_LEFT]; if (selecting && fullProxy && (bp.movement > 4)) { const float3 oldPos = GetMapPosition(bp.x, bp.y); const float3 newPos = GetMapPosition(mouse->lastx, mouse->lasty); glColor4fv(cmdColors.mouseBox); glBlendFunc((GLenum)cmdColors.MouseBoxBlendSrc(), (GLenum)cmdColors.MouseBoxBlendDst()); glLineWidth(cmdColors.MouseBoxLineWidth()); float verts[] = { oldPos.x, oldPos.z, newPos.x, oldPos.z, newPos.x, newPos.z, oldPos.x, newPos.z, }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_FLOAT, 0, verts); glDrawArrays(GL_LINE_LOOP, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); glLineWidth(1.0f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } DrawNotes(); // reset 1 if (resetTextureMatrix) { glMatrixMode(GL_TEXTURE_MATRIX); glPopMatrix(); } glMatrixMode(GL_MODELVIEW); if (use_geo) { glPopMatrix(); } // reset 2 glPopMatrix(); glPopAttrib(); glEnable(GL_TEXTURE_2D); { //! prepare ClipPlanes for Lua's DrawInMinimap Modelview matrix //! quote from glClipPlane spec: //! "When glClipPlane is called, equation is transformed by the inverse of the modelview matrix and stored in the resulting eye coordinates. //! Subsequent changes to the modelview matrix have no effect on the stored plane-equation components." //! -> we have to use the same modelview matrix when calling glClipPlane and later draw calls //! set the modelview matrix to the same as used in Lua's DrawInMinimap glPushMatrix(); glLoadIdentity(); glScalef(1.0f / width, 1.0f / height, 1.0f); const double plane0[4] = {0,-1,0,height}; const double plane1[4] = {0,1,0,0}; const double plane2[4] = {-1,0,0,width}; const double plane3[4] = {1,0,0,0}; glClipPlane(GL_CLIP_PLANE0, plane0); // clip bottom glClipPlane(GL_CLIP_PLANE1, plane1); // clip top glClipPlane(GL_CLIP_PLANE2, plane2); // clip right glClipPlane(GL_CLIP_PLANE3, plane3); // clip left glPopMatrix(); } //! allow the LUA scripts to draw into the minimap eventHandler.DrawInMiniMap(); if (use_geo && globalRendering->dualScreenMode) glViewport(globalRendering->viewPosX,0,globalRendering->viewSizeX,globalRendering->viewSizeY); //FIXME: Lua modifies the matrices w/o reseting it! (quite complexe to fix because ClearMatrixStack() makes it impossible to use glPushMatrix) glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,1,0,1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // disable ClipPlanes glDisable(GL_CLIP_PLANE0); glDisable(GL_CLIP_PLANE1); glDisable(GL_CLIP_PLANE2); glDisable(GL_CLIP_PLANE3); cursorIcons.Enable(true); setSurfaceCircleFunc(NULL); setSurfaceSquareFunc(NULL); }
void CMiniMap::Draw() { glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); if(minimized){ glColor4f(1,1,1,0.5); glDisable(GL_TEXTURE_2D); glViewport(0,gu->screeny-10,10,10); glBegin(GL_QUADS); glVertex2f(0,0); glVertex2f(1,0); glVertex2f(1,1); glVertex2f(0,1); glEnd(); glViewport(0,0,gu->screenx,gu->screeny); return; } glViewport(xpos,ypos,width,height); glLoadIdentity(); // Reset The Current Modelview Matrix glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix gluOrtho2D(0,1,0,1); glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glColor4f(0.6,0.6,0.6,1); readmap->DrawMinimap (); glEnable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, unitBlip); glBegin(GL_QUADS); float size=0.2f/sqrt((float)width+height); list<CUnit*>::iterator ui; for(ui=uh->activeUnits.begin();ui!=uh->activeUnits.end();ui++){ DrawUnit(*ui,size); } glEnd(); glDisable(GL_TEXTURE_2D); left.clear(); //Add restraints for camera sides GetFrustumSide(cam2->bottom); GetFrustumSide(cam2->top); GetFrustumSide(cam2->rightside); GetFrustumSide(cam2->leftside); std::vector<fline>::iterator fli,fli2; for(fli=left.begin();fli!=left.end();fli++){ for(fli2=left.begin();fli2!=left.end();fli2++){ if(fli==fli2) continue; float colz=0; if(fli->dir-fli2->dir==0) continue; colz=-(fli->base-fli2->base)/(fli->dir-fli2->dir); if(fli2->left*(fli->dir-fli2->dir)>0){ if(colz>fli->minz && colz<400096) fli->minz=colz; } else { if(colz<fli->maxz && colz>-10000) fli->maxz=colz; } } } glColor4f(1,1,1,0.5); glBegin(GL_LINES); for(fli=left.begin();fli!=left.end();fli++){ if(fli->minz<fli->maxz){ DrawInMap(float3(fli->base+fli->dir*fli->minz,0,fli->minz)); DrawInMap(float3(fli->base+fli->dir*fli->maxz,0,fli->maxz)); } } glEnd(); glColor4f(1,1,1,0.0002f*(width+height)); glBegin(GL_POINTS); Projectile_List::iterator psi; for(psi=ph->ps.begin();psi != ph->ps.end();++psi){ CProjectile* p=*psi; if((p->owner && p->owner->allyteam==gu->myAllyTeam) || loshandler->InLos(p,gu->myAllyTeam)){ DrawInMap((*psi)->pos); } } glEnd(); for(set<CUnit*>::iterator si=selectedUnits.selectedUnits.begin();si!=selectedUnits.selectedUnits.end();++si){ if((*si)->radarRadius && !(*si)->beingBuilt && (*si)->activated){ glColor3f(0.3f,1,0.3f); glBegin(GL_LINE_STRIP); int numSegments=(int)(sqrtf(height)*(*si)->radarRadius*(SQUARE_SIZE*RADAR_SIZE)/2000)+8; for(int a=0;a<=numSegments;++a){ DrawInMap((*si)->pos+float3(sin(a*2*PI/numSegments),0,cos(a*2*PI/numSegments))*(*si)->radarRadius*(SQUARE_SIZE*RADAR_SIZE)); } glEnd(); } if((*si)->sonarRadius && !(*si)->beingBuilt && (*si)->activated){ glColor3f(0.3f,1,0.3f); glBegin(GL_LINE_STRIP); int numSegments=(int)(sqrtf(height)*(*si)->sonarRadius*(SQUARE_SIZE*RADAR_SIZE)/2000)+8; for(int a=0;a<=numSegments;++a){ DrawInMap((*si)->pos+float3(sin(a*2*PI/numSegments),0,cos(a*2*PI/numSegments))*(*si)->sonarRadius*(SQUARE_SIZE*RADAR_SIZE)); } glEnd(); } if((*si)->jammerRadius && !(*si)->beingBuilt && (*si)->activated){ glColor3f(1.0f,0.2f,0.2f); glBegin(GL_LINE_STRIP); int numSegments=(int)(sqrtf(height)*(*si)->jammerRadius*(SQUARE_SIZE*RADAR_SIZE)/2000)+8; for(int a=0;a<=numSegments;++a){ DrawInMap((*si)->pos+float3(sin(a*2*PI/numSegments),0,cos(a*2*PI/numSegments))*(*si)->jammerRadius*(SQUARE_SIZE*RADAR_SIZE)); } glEnd(); } if((*si)->stockpileWeapon && (*si)->stockpileWeapon->weaponDef->interceptor){ //change if someone someday create a non stockpiled interceptor CWeapon* w=(*si)->stockpileWeapon; if(w->numStockpiled) glColor4f(1.0f,1.0f,1.0f,1.0f); else glColor4f(0.0f,0.0f,0.0f,0.6f); glBegin(GL_LINE_STRIP); int numSegments=(int)(sqrtf(height)*w->weaponDef->coverageRange/2000)+8; for(int a=0;a<=numSegments;++a){ DrawInMap((*si)->pos+float3(sin(a*2*PI/numSegments),0,cos(a*2*PI/numSegments))*w->weaponDef->coverageRange); } glEnd(); } } DrawNotes(); glColor4f(1,1,1,0.5); glViewport(xpos,ypos,10,10); glBegin(GL_QUADS); glVertex2f(0,0); glVertex2f(1,0); glVertex2f(1,1); glVertex2f(0,1); glEnd(); glViewport(xpos+width-10,ypos,10,10); glBegin(GL_QUADS); glVertex2f(0,0); glVertex2f(1,0); glVertex2f(1,1); glVertex2f(0,1); glEnd(); glViewport(xpos+width-10,ypos+height-10,10,10); glBegin(GL_QUADS); glVertex2f(0,0); glVertex2f(1,0); glVertex2f(1,1); glVertex2f(0,1); glEnd(); glViewport(xpos,ypos+height-10,10,10); glBegin(GL_QUADS); glVertex2f(0,0); glVertex2f(1,0); glVertex2f(1,1); glVertex2f(0,1); glEnd(); glViewport(0,0,gu->screenx,gu->screeny); }
void GUIminimap::PrivateDraw() { if(parent) { w=parent->w; h=parent->h; } int xpos=x; int ypos=y; int width=w; int height=h; GUIframe *p=parent; while(p) { xpos+=p->x; ypos+=p->y; p=p->parent; } ypos=gu->screeny-ypos-height; glPushAttrib(GL_ALL_ATTRIB_BITS|GL_VIEWPORT_BIT); glMatrixMode(GL_PROJECTION); glPushMatrix(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glViewport(xpos,ypos,width,height); glLoadIdentity(); // Reset The Current Modelview Matrix glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix gluOrtho2D(0,1,0,1); glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glColor4f(0.6,0.6,0.6,1); glEnable(GL_TEXTURE_2D); glDisable(GL_BLEND); glDisable(GL_ALPHA_TEST); glBindTexture(GL_TEXTURE_2D, ((CSmfReadMap*)readmap)->shadowTex); glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE0_RGB_ARB,GL_PREVIOUS_ARB); glTexEnvi(GL_TEXTURE_ENV,GL_SOURCE1_RGB_ARB,GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB,GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV,GL_RGB_SCALE_ARB,2); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_ARB); glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, readmap->minimapTex); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glActiveTextureARB(GL_TEXTURE0_ARB); if((groundDrawer->drawExtraTex)){ glActiveTextureARB(GL_TEXTURE2_ARB); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB,GL_ADD_SIGNED_ARB); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_ARB); glBindTexture(GL_TEXTURE_2D, groundDrawer->infoTex); glActiveTextureARB(GL_TEXTURE0_ARB); } float isx=2*gs->hmapx/float(gs->pwr2mapx); float isy=2*gs->hmapy/float(gs->pwr2mapy); glBegin(GL_QUADS); glTexCoord2f(0,isy); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0,1); glMultiTexCoord2fARB(GL_TEXTURE2_ARB,0,isy); glVertex2f(0,0); glTexCoord2f(0,0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0,0); glMultiTexCoord2fARB(GL_TEXTURE2_ARB,0,0); glVertex2f(0,1); glTexCoord2f(isx,0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1,0); glMultiTexCoord2fARB(GL_TEXTURE2_ARB,isx,0); glVertex2f(1,1); glTexCoord2f(isx,isy); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1,1); glMultiTexCoord2fARB(GL_TEXTURE2_ARB,isx,isy); glVertex2f(1,0); glEnd(); glTexEnvi(GL_TEXTURE_ENV,GL_RGB_SCALE_ARB,1); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE2_ARB); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glDisable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, unitBlip); glBegin(GL_QUADS); float size=0.2f/sqrt((float)width+height); list<CUnit*>::iterator ui; for(ui=uh->activeUnits.begin();ui!=uh->activeUnits.end();ui++){ DrawUnit(*ui,size); } glEnd(); glDisable(GL_TEXTURE_2D); left.clear(); //Add restraints for camera sides GetFrustumSide(cam2->bottom); GetFrustumSide(cam2->top); GetFrustumSide(cam2->rightside); GetFrustumSide(cam2->leftside); std::vector<fline>::iterator fli,fli2; for(fli=left.begin();fli!=left.end();fli++){ for(fli2=left.begin();fli2!=left.end();fli2++){ if(fli==fli2) continue; float colz=0; if(fli->dir-fli2->dir==0) continue; colz=-(fli->base-fli2->base)/(fli->dir-fli2->dir); if(fli2->left*(fli->dir-fli2->dir)>0){ if(colz>fli->minz && colz<400096) fli->minz=colz; } else { if(colz<fli->maxz && colz>-10000) fli->maxz=colz; } } } glColor4f(1,1,1,0.5); glBegin(GL_LINES); for(fli=left.begin();fli!=left.end();fli++){ if(fli->minz<fli->maxz){ DrawInMap(float3(fli->base+fli->dir*fli->minz,0,fli->minz)); DrawInMap(float3(fli->base+fli->dir*fli->maxz,0,fli->maxz)); } } glEnd(); glColor4f(1,1,1,0.0002f*(width+height)); glBegin(GL_POINTS); Projectile_List::iterator psi; for(psi=ph->ps.begin();psi != ph->ps.end();++psi){ DrawInMap((*psi)->pos); } glEnd(); for(set<CUnit*>::iterator si=selectedUnits.selectedUnits.begin();si!=selectedUnits.selectedUnits.end();++si){ if((*si)->radarRadius){ glColor3f(0.3f,1,0.3f); glBegin(GL_LINE_STRIP); int numSegments=(int)(sqrtf(height)*(*si)->radarRadius*(SQUARE_SIZE*RADAR_SIZE)/2000)+8; for(int a=0;a<=numSegments;++a){ DrawInMap((*si)->pos+float3(sin(a*2*PI/numSegments),0,cos(a*2*PI/numSegments))*(*si)->radarRadius*(SQUARE_SIZE*RADAR_SIZE)); } glEnd(); } if((*si)->sonarRadius){ glColor3f(0.3f,1,0.3f); glBegin(GL_LINE_STRIP); int numSegments=(int)(sqrtf(height)*(*si)->sonarRadius*(SQUARE_SIZE*RADAR_SIZE)/2000)+8; for(int a=0;a<=numSegments;++a){ DrawInMap((*si)->pos+float3(sin(a*2*PI/numSegments),0,cos(a*2*PI/numSegments))*(*si)->sonarRadius*(SQUARE_SIZE*RADAR_SIZE)); } glEnd(); } if((*si)->jammerRadius){ glColor3f(1.0f,0.2f,0.2f); glBegin(GL_LINE_STRIP); int numSegments=(int)(sqrtf(height)*(*si)->jammerRadius*(SQUARE_SIZE*RADAR_SIZE)/2000)+8; for(int a=0;a<=numSegments;++a){ DrawInMap((*si)->pos+float3(sin(a*2*PI/numSegments),0,cos(a*2*PI/numSegments))*(*si)->jammerRadius*(SQUARE_SIZE*RADAR_SIZE)); } glEnd(); } if((*si)->stockpileWeapon && (*si)->stockpileWeapon->weaponDef->interceptor){ //change if someone someday create a non stockpiled interceptor CWeapon* w=(*si)->stockpileWeapon; if(w->numStockpiled) glColor4f(1.0f,1.0f,1.0f,1.0f); else glColor4f(0.0f,0.0f,0.0f,0.6f); glBegin(GL_LINE_STRIP); int numSegments=(int)(sqrtf(height)*w->weaponDef->coverageRange/2000)+8; for(int a=0;a<=numSegments;++a){ DrawInMap((*si)->pos+float3(sin(a*2*PI/numSegments),0,cos(a*2*PI/numSegments))*w->weaponDef->coverageRange); } glEnd(); } } DrawNotes(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glPopAttrib(); }