void Mission::drawMap(int scrollx, int scrolly) { fast_vehicle_cache_.clear(); for (unsigned int i = 0; i < vehicles_.size(); i++) fast_vehicle_cache_.insert(fastKey(vehicles_[i])); fast_ped_cache_.clear(); for (unsigned int i = 0; i < 4; i++) if (g_App.teamMember(i)->isActive()) fast_ped_cache_.insert(fastKey(peds_[i])); for (unsigned int i = 8; i < peds_.size(); i++) fast_ped_cache_.insert(fastKey(peds_[i])); fast_weapon_cache_.clear(); for (unsigned int i = 0; i < weapons_.size(); i++) if (weapons_[i]->map() != -1) fast_weapon_cache_.insert(fastKey(weapons_[i])); fast_statics_cache_.clear(); for (unsigned int i = 0; i < statics_.size(); i++) fast_statics_cache_.insert(fastKey(statics_[i])); g_App.maps().drawMap(map_, scrollx, scrolly, this); }
void Mission::drawAt(int tilex, int tiley, int tilez, int x, int y, int scrollX, int scrollY) { int key = fastKey(tilex, tiley, tilez); if (fast_vehicle_cache_.find(key) != fast_vehicle_cache_.end()) { // draw vehicles for (unsigned int i = 0; i < vehicles_.size(); i++) if (vehicles_[i]->tileX() == tilex && vehicles_[i]->tileY() == tiley && vehicles_[i]->tileZ() == tilez) vehicles_[i]->draw(x, y); } if (fast_ped_cache_.find(key) != fast_ped_cache_.end()) { // draw agents for (unsigned int i = 0; i < 4; i++) if (g_App.teamMember(i)->isActive()) if (peds_[i]->tileX() == tilex && peds_[i]->tileY() == tiley && peds_[i]->tileZ() == tilez) { peds_[i]->draw(x, y, scrollX, scrollY); #if 0 g_Screen.drawLine(x - TILE_WIDTH / 2, y, x + TILE_WIDTH / 2, y, 11); g_Screen.drawLine(x + TILE_WIDTH / 2, y, x + TILE_WIDTH / 2, y + TILE_HEIGHT, 11); g_Screen.drawLine(x + TILE_WIDTH / 2, y + TILE_HEIGHT, x - TILE_WIDTH / 2, y + TILE_HEIGHT, 11); g_Screen.drawLine(x - TILE_WIDTH / 2, y + TILE_HEIGHT, x - TILE_WIDTH / 2, y, 11); #endif } // draw peds for (unsigned int i = 8; i < peds_.size(); i++) if (peds_[i]->tileX() == tilex && peds_[i]->tileY() == tiley && peds_[i]->tileZ() == tilez) peds_[i]->draw(x, y, scrollX, scrollY); } if (fast_weapon_cache_.find(key) != fast_weapon_cache_.end()) { // draw weapons for (unsigned int i = 0; i < weapons_.size(); i++) if (weapons_[i]->map() != -1 && weapons_[i]->tileX() == tilex && weapons_[i]->tileY() == tiley && weapons_[i]->tileZ() == tilez) { weapons_[i]->draw(x, y); } } if (fast_statics_cache_.find(key) != fast_statics_cache_.end()) { // draw statics for (unsigned int i = 0; i < statics_.size(); i++) if (statics_[i]->tileX() == tilex && statics_[i]->tileY() == tiley && statics_[i]->tileZ() == tilez) { statics_[i]->draw(x, y); } } }
int fastKey(MapObject * m) { return fastKey(m->tileX(), m->tileY(), m->tileZ()); }
void MapRenderer::drawAt(int tilex, int tiley, int tilez, int x, int y) { int key = fastKey(tilex, tiley, tilez); if (fast_vehicle_cache_.find(key) != fast_vehicle_cache_.end()) { // draw vehicles for (unsigned int i = 0; i < cache_vehicles_.size(); i++) if (cache_vehicles_[i]->tileX() == tilex && cache_vehicles_[i]->tileY() == tiley // NOTE: a trick to make vehicles be drawn correctly z+1 && (cache_vehicles_[i]->tileZ() + 1) == tilez) cache_vehicles_[i]->draw(x, y); } if (fast_ped_cache_.find(key) != fast_ped_cache_.end()) { // draw peds for (unsigned int i = 0; i < cache_peds_.size(); i++) if (cache_peds_[i]->tileX() == tilex && cache_peds_[i]->tileY() == tiley && cache_peds_[i]->tileZ() == tilez) { cache_peds_[i]->draw(x, y); #if 0 g_Screen.drawLine(x - TILE_WIDTH / 2, y, x + TILE_WIDTH / 2, y, 11); g_Screen.drawLine(x + TILE_WIDTH / 2, y, x + TILE_WIDTH / 2, y + TILE_HEIGHT, 11); g_Screen.drawLine(x + TILE_WIDTH / 2, y + TILE_HEIGHT, x - TILE_WIDTH / 2, y + TILE_HEIGHT, 11); g_Screen.drawLine(x - TILE_WIDTH / 2, y + TILE_HEIGHT, x - TILE_WIDTH / 2, y, 11); #endif } } if (fast_weapon_cache_.find(key) != fast_weapon_cache_.end()) { // draw weapons for (unsigned int i = 0; i < cache_weapons_.size(); i++) if (cache_weapons_[i]->map() != -1 && cache_weapons_[i]->tileX() == tilex && cache_weapons_[i]->tileY() == tiley && cache_weapons_[i]->tileZ() == tilez) { cache_weapons_[i]->draw(x, y); } } if (fast_statics_cache_.find(key) != fast_statics_cache_.end()) { // draw statics for (unsigned int i = 0; i < cache_statics_.size(); i++) if (cache_statics_[i]->tileX() == tilex && cache_statics_[i]->tileY() == tiley && cache_statics_[i]->tileZ() == tilez) { cache_statics_[i]->draw(x, y); } } if (fast_sfx_objects_cache_.find(key) != fast_sfx_objects_cache_.end()) { // draw sfx objects for (unsigned int i = 0; i < cache_sfx_objects_.size(); i++) if (cache_sfx_objects_[i]->tileX() == tilex && cache_sfx_objects_[i]->tileY() == tiley && cache_sfx_objects_[i]->tileZ() == tilez) { cache_sfx_objects_[i]->draw(x, y); } } }
void MapRenderer::createFastKeys(int tilex, int tiley, int maxtilex, int maxtiley) { if (tilex < 0) tilex = 0; if (tiley < 0) tiley = 0; if (maxtilex >= pMap_->maxX()) maxtilex = pMap_->maxX(); if (maxtiley >= pMap_->maxY()) maxtiley = pMap_->maxY(); cache_vehicles_.clear(); cache_peds_.clear(); cache_weapons_.clear(); cache_statics_.clear(); cache_sfx_objects_.clear(); fast_vehicle_cache_.clear(); fast_ped_cache_.clear(); fast_weapon_cache_.clear(); fast_statics_cache_.clear(); fast_sfx_objects_cache_.clear(); // updating position for visual markers for (size_t i = 0; i < AgentManager::kMaxSlot; i++) { PedInstance *p = pMission_->getSquad()->member(i); if (p != NULL && p->isAlive()) { if (p->tileX() >= tilex && p->tileX() < maxtilex && p->tileY() >= tiley && p->tileY() < maxtiley) { // sfx_objects_[i]->setPosition(p->tileX(), p->tileY(), p->tileZ(), // p->offX(), p->offY(), p->offZ() + 320); pMission_->sfxObjects(i + 4)->setPosition(p->tileX(), p->tileY(), p->tileZ(), p->offX() - 16, p->offY(), p->offZ() + 256); } } else { // sfx_objects_[i]->setMap(-1); pMission_->sfxObjects(i + 4)->setMap(-1); } } // vehicles for (unsigned int i = 0; i < pMission_->numVehicles(); i++) { Vehicle *v = pMission_->vehicle(i); if (v->tileX() >= tilex && v->tileX() < maxtilex && v->tileY() >= tiley && v->tileY() < maxtiley) { // NOTE: a trick to make vehicles be drawn correctly z+1 fast_vehicle_cache_.insert(fastKey(v->tileX(), v->tileY(), v->tileZ() + 1)); cache_vehicles_.push_back(v); } } // peds for (size_t i = 0; i < AgentManager::kMaxSlot; i++) { PedInstance *p = pMission_->getSquad()->member(i); if (p != NULL && p->map() != -1) { if (p->tileX() >= tilex && p->tileX() < maxtilex && p->tileY() >= tiley && p->tileY() < maxtiley) { fast_ped_cache_.insert(fastKey(p)); cache_peds_.push_back(p); } } } for (size_t i = pMission_->getSquad()->size(); i < pMission_->numPeds(); i++) { PedInstance *p = pMission_->ped(i); if (p->map() != -1) { if (p->tileX() >= tilex && p->tileX() < maxtilex && p->tileY() >= tiley && p->tileY() < maxtiley) { fast_ped_cache_.insert(fastKey(p)); cache_peds_.push_back(p); } } } // weapons for (unsigned int i = 0; i < pMission_->numWeapons(); i++) { WeaponInstance *w = pMission_->weapon(i); if (w->map() != -1 && w->tileX() >= tilex && w->tileX() < maxtilex && w->tileY() >= tiley && w->tileY() < maxtiley) { fast_weapon_cache_.insert(fastKey(w)); cache_weapons_.push_back(w); } } // statics for (unsigned int i = 0; i < pMission_->numStatics(); i++) { Static *s = pMission_->statics(i); if (s->tileX() >= tilex && s->tileX() < maxtilex && s->tileY() >= tiley && s->tileY() < maxtiley) { fast_statics_cache_.insert(fastKey(s)); cache_statics_.push_back(s); } } // sfx objects for (unsigned int i = 0; i < pMission_->numSfxObjects(); i++) { SFXObject *so = pMission_->sfxObjects(i); if (so->map() != -1 && so->tileX() >= tilex && so->tileX() < maxtilex && so->tileY() >= tiley && so->tileY() < maxtiley) { fast_sfx_objects_cache_.insert(fastKey(so)); cache_sfx_objects_.push_back(so); } } }
int MapRenderer::fastKey(MapObject * m) { return fastKey(m->tileX(), m->tileY(), m->tileZ()); }