/** Draws a Myth/FF7 style viewing window */ static void setViewingWindow() { float pixSizeH, pixSizeV; Vector3i v[4], tv[4], centre; int shortX, longX, yDrop, yDropVar; int dif = getDistanceAdjust(); int dif2 = getLengthAdjust(); PIELIGHT colour; CalcRadarPixelSize(&pixSizeH, &pixSizeV); int x = player.p.x * pixSizeH / TILE_UNITS; int y = player.p.z * pixSizeV / TILE_UNITS; shortX = ((visibleTiles.x / 4) - (dif / 6)) * pixSizeH; longX = ((visibleTiles.x / 2) - (dif / 4)) * pixSizeH; yDropVar = ((visibleTiles.y / 2) - (dif2 / 3)) * pixSizeV; yDrop = ((visibleTiles.y / 2) - dif2 / 3) * pixSizeV; v[0].x = longX; v[0].y = -yDropVar; v[1].x = -longX; v[1].y = -yDropVar; v[2].x = shortX; v[2].y = yDrop; v[3].x = -shortX; v[3].y = yDrop; centre.x = x - scrollMinX * pixSizeH; centre.y = y - scrollMinY * pixSizeV; RotateVector2D(v, tv, ¢re, player.r.y, 4); switch (getCampaignNumber()) { case 1: case 2: // white colour.byte.r = UBYTE_MAX; colour.byte.g = UBYTE_MAX; colour.byte.b = UBYTE_MAX; colour.byte.a = 0x3f; break; case 3: // greenish colour.byte.r = 0x3f; colour.byte.a = 0x3f; colour.byte.g = UBYTE_MAX; colour.byte.b = 0x3f; default: // black colour.rgba = 0; colour.byte.a = 0x3f; break; } /* Send the four points to the draw routine and the clip box params */ pie_SetViewingWindow(tv, colour); }
/** Given a position within the radar, return a world coordinate. */ void CalcRadarPosition(int mX, int mY, int *PosX, int *PosY) { int sPosX, sPosY; float pixSizeH, pixSizeV; Vector2f pos; pos.x = mX - radarCenterX; pos.y = mY - radarCenterY; if (rotateRadar) { pos = Vector2f_Rotate2f(pos, -player.r.y); } pos.x += radarWidth / 2.0; pos.y += radarHeight / 2.0; CalcRadarPixelSize(&pixSizeH, &pixSizeV); sPosX = pos.x / pixSizeH; // adjust for pixel size sPosY = pos.y / pixSizeV; sPosX += scrollMinX; // adjust for scroll limits sPosY += scrollMinY; #if REALLY_DEBUG_RADAR debug(LOG_ERROR, "m=(%d,%d) radar=(%d,%d) pos(%d,%d), scroll=(%u-%u,%u-%u) sPos=(%d,%d), pixSize=(%f,%f)", mX, mY, radarX, radarY, posX, posY, scrollMinX, scrollMaxX, scrollMinY, scrollMaxY, sPosX, sPosY, pixSizeH, pixSizeV); #endif // old safety code -- still necessary? sPosX = clip(sPosX, scrollMinX, scrollMaxX); sPosY = clip(sPosY, scrollMinY, scrollMaxY); *PosX = sPosX; *PosY = sPosY; }
void drawRadar(void) { float pixSizeH, pixSizeV; ASSERT(radarBuffer, "No radar buffer allocated"); if (!radarBuffer) { return; } CalcRadarPixelSize(&pixSizeH, &pixSizeV); if (frameSkip <= 0) { bool filter = true; if (!rotateRadar) { filter = RadarZoom % 16 != 0; } DrawRadarTiles(); DrawRadarObjects(); pie_DownLoadRadar(radarBuffer, radarTexWidth, radarTexHeight, filter); frameSkip = RADAR_FRAME_SKIP; } frameSkip--; pie_SetRendMode(REND_ALPHA); pie_MatBegin(); pie_TRANSLATE(radarCenterX, radarCenterY, 0); if (rotateRadar) { // rotate the map pie_MatRotZ(player.r.y); DrawNorth(); } // draw the box at the dimensions of the map iV_TransBoxFill(-radarWidth/2.0 - 1, -radarHeight/2.0 - 1, radarWidth/2.0, radarHeight/2.0); pie_RenderRadar(-radarWidth/2.0 - 1, -radarHeight/2.0 - 1, radarWidth, radarHeight); pie_MatBegin(); pie_TRANSLATE(-radarWidth/2 - 1, -radarHeight/2 - 1, 0); DrawRadarExtras(0, 0, pixSizeH, pixSizeV); pie_MatEnd(); drawRadarBlips(-radarWidth/2.0 - 1, -radarHeight/2.0 - 1, pixSizeH, pixSizeV); pie_MatEnd(); }
void drawRadar() { float pixSizeH, pixSizeV; CalcRadarPixelSize(&pixSizeH, &pixSizeV); ASSERT_OR_RETURN(, radarBuffer, "No radar buffer allocated"); // Do not recalculate frustum window coordinates if position or zoom does not change if (playerpos.x != player.p.x || playerpos.y != player.p.y || playerpos.z != player.p.z) { setViewingWindow(); } playerpos = player.p; // cache position if (frameSkip <= 0) { DrawRadarTiles(); DrawRadarObjects(); pie_DownLoadRadar(radarBuffer); frameSkip = RADAR_FRAME_SKIP; } frameSkip--; pie_SetRendMode(REND_ALPHA); pie_MatBegin(); pie_TRANSLATE(radarCenterX, radarCenterY, 0); if (rotateRadar) { // rotate the map pie_MatRotZ(player.r.y); DrawNorth(); } pie_RenderRadar(); pie_MatBegin(); pie_TRANSLATE(-radarWidth / 2 - 1, -radarHeight / 2 - 1, 0); DrawRadarExtras(); pie_MatEnd(); drawRadarBlips(-radarWidth / 2.0 - 1, -radarHeight / 2.0 - 1, pixSizeH, pixSizeV); pie_MatEnd(); }
void drawRadar() { float pixSizeH, pixSizeV; CalcRadarPixelSize(&pixSizeH, &pixSizeV); ASSERT_OR_RETURN(, radarBuffer, "No radar buffer allocated"); // Do not recalculate frustum window coordinates if position or zoom does not change if (playerpos.x != player.p.x || playerpos.y != player.p.y || playerpos.z != player.p.z) { setViewingWindow(); } playerpos = player.p; // cache position if (frameSkip <= 0) { DrawRadarTiles(); DrawRadarObjects(); pie_DownLoadRadar(radarBuffer); frameSkip = RADAR_FRAME_SKIP; } frameSkip--; pie_SetRendMode(REND_ALPHA); glm::mat4 radarMatrix = glm::translate(radarCenterX, radarCenterY, 0); glm::mat4 orthoMatrix = glm::ortho(0.f, static_cast<float>(pie_GetVideoBufferWidth()), static_cast<float>(pie_GetVideoBufferHeight()), 0.f); if (rotateRadar) { // rotate the map radarMatrix *= glm::rotate(UNDEG(player.r.y), glm::vec3(0.f, 0.f, 1.f)); DrawNorth(orthoMatrix * radarMatrix); } pie_RenderRadar(orthoMatrix * radarMatrix); DrawRadarExtras(orthoMatrix * radarMatrix * glm::translate(-radarWidth / 2.f - 1.f, -radarHeight / 2.f - 1.f, 0.f)); drawRadarBlips(-radarWidth / 2.0 - 1, -radarHeight / 2.0 - 1, pixSizeH, pixSizeV, orthoMatrix * radarMatrix); }