void CG_DrawAutoMap(float x, float y, float w, float h) { //float x, y, w, h; mapScissor_t mapScissor; vec2_t automapTransformed; memset(&mapScissor, 0, sizeof(mapScissor)); if (cgs.ccLayers) { cgs.ccSelectedLayer = CG_CurLayerForZ((int)cg.predictedPlayerEntity.lerpOrigin[2]); } /* x = Ccg_WideX(640) - 100 - 20; y = 20; w = 100; h = 100; */ if (cgs.autoMapExpanded) { if (cg.time - cgs.autoMapExpandTime < 100.f) { //y -= ((cg.time - cgs.autoMapExpandTime) / 100.f) * 128.f; CG_DrawExpandedAutoMap(); } else { //y -= 128.f; CG_DrawExpandedAutoMap(); return; } } else { if (cg.time - cgs.autoMapExpandTime <= 150.f) { //y -= 128.f; CG_DrawExpandedAutoMap(); return; } else if ((cg.time - cgs.autoMapExpandTime > 150.f) && (cg.time - cgs.autoMapExpandTime < 250.f)) { //y = (y - 128.f) + ((cg.time - cgs.autoMapExpandTime - 150.f) / 100.f) * 128.f; CG_DrawExpandedAutoMap(); } } mapScissor.circular = qtrue; mapScissor.zoomFactor = automapZoom; mapScissor.tl[0] = mapScissor.tl[1] = 0; mapScissor.br[0] = mapScissor.br[1] = -1; automapTransformed[0] = ((cg.predictedPlayerEntity.lerpOrigin[0] - cg.mapcoordsMins[0]) * cg.mapcoordsScale[0]) * w * mapScissor.zoomFactor; automapTransformed[1] = ((cg.predictedPlayerEntity.lerpOrigin[1] - cg.mapcoordsMins[1]) * cg.mapcoordsScale[1]) * h * mapScissor.zoomFactor; // update clip region (for next drawing). clip region has a size kAutomap_width x kAutomap_height // and it is after zooming is accounted for. // first try to center the clip region around the player. then make sure the region // stays within the world map. mapScissor.tl[0] = automapTransformed[0] - w / 2; if (mapScissor.tl[0] < 0) { mapScissor.tl[0] = 0; } mapScissor.br[0] = mapScissor.tl[0] + w; if (mapScissor.br[0] > (w * mapScissor.zoomFactor)) { mapScissor.br[0] = w * mapScissor.zoomFactor; mapScissor.tl[0] = mapScissor.br[0] - w; } mapScissor.tl[1] = automapTransformed[1] - h / 2; if (mapScissor.tl[1] < 0) { mapScissor.tl[1] = 0; } mapScissor.br[1] = mapScissor.tl[1] + h; if (mapScissor.br[1] > (h * mapScissor.zoomFactor)) { mapScissor.br[1] = h * mapScissor.zoomFactor; mapScissor.tl[1] = mapScissor.br[1] - h; } CG_DrawMap(x, y, w, h, cgs.ccFilter, &mapScissor, qfalse, 1.f, qfalse); }
/* ================= CG_DrawNewCompass ================= */ static void CG_DrawNewCompass(rectDef_t location) { float basex = location.x, basey = location.y - 16, basew = location.w, baseh = location.h; snapshot_t *snap; float angle; int i; static float lastangle = 0; static float anglespeed = 0; float diff; if (cg.nextSnap && !cg.nextFrameTeleport && !cg.thisFrameTeleport) { snap = cg.nextSnap; } else { snap = cg.snap; } if (snap->ps.pm_flags & PMF_LIMBO /*|| snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR*/ #if FEATURE_MULTIVIEW || cg.mvTotalClients > 0 #endif ) { CG_DrawExpandedAutoMap(); return; } diff = basew * 0.25f; if (cgs.autoMapExpanded) { if (cg.time - cgs.autoMapExpandTime < 100.f) { CG_CompasMoveLocation(&basex, &basey, qtrue); } else { CG_DrawExpandedAutoMap(); return; } } else { if (cg.time - cgs.autoMapExpandTime <= 150.f) { CG_DrawExpandedAutoMap(); return; } else if ((cg.time - cgs.autoMapExpandTime > 150.f) && (cg.time - cgs.autoMapExpandTime < 250.f)) { CG_CompasMoveLocation(&basex, &basey, qfalse); } } if (snap->ps.persistant[PERS_TEAM] == TEAM_SPECTATOR) { return; } CG_DrawAutoMap(basex + (diff / 2), basey + (diff / 2), basew - diff, baseh - diff); CG_DrawPic(basex + 4, basey + 4, basew - 8, baseh - 8, cgs.media.compassShader); angle = (cg.predictedPlayerState.viewangles[YAW] + 180.f) / 360.f - (0.125f); diff = AngleSubtract(angle * 360, lastangle * 360) / 360.f; anglespeed /= 1.08f; anglespeed += diff * 0.01f; if (Q_fabs(anglespeed) < 0.00001f) { anglespeed = 0; } lastangle += anglespeed; CG_DrawRotatedPic(basex + 4, basey + 4, basew - 8, baseh - 8, cgs.media.compass2Shader, lastangle); //if( !(cgs.ccFilter & CC_FILTER_REQUESTS) ) { // draw voice chats { centity_t *cent; for (i = 0; i < MAX_CLIENTS; i++) { cent = &cg_entities[i]; if (cg.predictedPlayerState.clientNum == i || !cgs.clientinfo[i].infoValid || cg.predictedPlayerState.persistant[PERS_TEAM] != cgs.clientinfo[i].team) { continue; } // also draw revive icons if cent is dead and player is a medic if (cent->voiceChatSpriteTime < cg.time) { continue; } if (cgs.clientinfo[i].health <= 0) { // reset cent->voiceChatSpriteTime = cg.time; continue; } CG_DrawCompassIcon(basex, basey, basew, baseh, cg.predictedPlayerState.origin, cent->lerpOrigin, cent->voiceChatSprite); } } //} /*if( !(cgs.ccFilter & CC_FILTER_DESTRUCTIONS) ) { // draw explosives if an engineer if ( cg.predictedPlayerState.stats[ STAT_PLAYER_CLASS ] == PC_ENGINEER ) { for ( i = 0; i < snap->numEntities; i++ ) { centity_t *cent = &cg_entities[ snap->entities[ i ].number ]; if ( cent->currentState.eType != ET_EXPLOSIVE_INDICATOR ) { continue; } if ( cent->currentState.teamNum == 1 && cg.predictedPlayerState.persistant[PERS_TEAM] == TEAM_AXIS ) continue; else if ( cent->currentState.teamNum == 2 && cg.predictedPlayerState.persistant[PERS_TEAM] == TEAM_ALLIES ) continue; CG_DrawCompassIcon( basex, basey, basew, baseh, cg.predictedPlayerState.origin, cent->lerpOrigin, cgs.media.compassDestroyShader ); } } }*/ { entityState_t *ent; for (i = 0; i < snap->numEntities; i++) { ent = &snap->entities[i]; if (ent->eType != ET_PLAYER) { continue; } if (ent->eFlags & EF_DEAD) { if (cg.predictedPlayerState.stats[STAT_PLAYER_CLASS] == PC_MEDIC && ent->number == ent->clientNum) // && !(cgs.ccFilter & CC_FILTER_REQUESTS) { if (!cgs.clientinfo[ent->clientNum].infoValid || cg.predictedPlayerState.persistant[PERS_TEAM] != cgs.clientinfo[ent->clientNum].team) { continue; } CG_DrawCompassIcon(basex, basey, basew, baseh, cg.predictedPlayerState.origin, ent->pos.trBase, cgs.media.medicReviveShader); } continue; } if (!cgs.clientinfo[ent->clientNum].infoValid || cg.predictedPlayerState.persistant[PERS_TEAM] != cgs.clientinfo[ent->clientNum].team) { continue; } if (!CG_IsOnSameFireteam(cg.clientNum, ent->clientNum)) { continue; } CG_DrawCompassIcon(basex, basey, basew, baseh, cg.predictedPlayerState.origin, ent->pos.trBase, cgs.media.buddyShader); //if( !(cgs.ccFilter & CC_FILTER_BUDDIES) ) { } } }