bool InstrHSI::Redraw2D (SURFHANDLE surf) { const float horzx = (float)(texw-312), horzy = (float)(texh-252); DWORD tp; int i, j, vofs; double c, sinc, cosc, brg, slope; double yaw = vessel->GetYaw(); if (yaw < 0.0) yaw += PI2; double siny = sin(yaw), cosy = cos(yaw); dev = 0.0; NAVHANDLE nv = vessel->GetNavSource (0); if (nv) { tp = oapiGetNavType(nv); if (tp != TRANSMITTER_VOR && tp != TRANSMITTER_ILS) nv = NULL; } if (nv != nav) { if (nav = nv) { navRef = vessel->GetSurfaceRef(); navType = tp; if (navRef) { VECTOR3 npos; NAVDATA data; double rad; oapiGetNavPos (nav, &npos); oapiGlobalToEqu (navRef, npos, &navlng, &navlat, &rad); oapiGetNavData (nav, &data); if (navType == TRANSMITTER_ILS) crs = data.ils.appdir; } else nav = NULL; } else { navType = TRANSMITTER_NONE; } // transform glideslope background static float gs_tv[4] = {(horzy+171.5f)/(float)texh,(horzy+154.5f)/(float)texh,(horzy+171.5f)/(float)texh,(horzy+154.5f)/(float)texh}; vofs = vtxofs+4; for (i = 0; i < 4; i++) grp->Vtx[vofs+i].tv = (navType == TRANSMITTER_ILS ? gs_tv[i] : (horzy+154.5f)/(float)texh); // transform glideslope indicator if (navType != TRANSMITTER_ILS) { vofs = vtxofs+8; for (i = 0; i < 4; i++) grp->Vtx[vofs+i].y = ycnt-64; } } if (nav) { double vlng, vlat, vrad, adist; OBJHANDLE hRef = vessel->GetEquPos (vlng, vlat, vrad); if (hRef && hRef == navRef) { Orthodome (vlng, vlat, navlng, navlat, adist, brg); adist *= oapiGetSize (hRef); dev = brg-crs; if (dev < -PI) dev += PI2; else if (dev >= PI) dev -= PI2; if (dev < -PI05) dev = -PI-dev; else if (dev >= PI05) dev = PI-dev; // calculate slope if (navType == TRANSMITTER_ILS) { double s = adist * cos(crs-brg); double alt = vessel->GetAltitude(); slope = atan2 (alt, s) * DEG; // transform glideslope indicator const double tgtslope = 4.0; double dslope = slope - tgtslope; float yshift = (float)min(fabs(dslope)*20.0,45.0); if (dslope < 0.0) yshift = -yshift; static float gs_y[4] = {ycnt-4.0f, ycnt-4.0f, ycnt+4.0f, ycnt+4.0f}; vofs = vtxofs+8; for (i = 0; i < 4; i++) grp->Vtx[vofs+i].y = gs_y[i]+yshift; } } } static double xp[4] = {-60.5,60.5,-60.5,60.5}; static double yp[4] = {-60.5,-60.5,60.5,60.5}; // transform compass rose vofs = vtxofs; for (i = 0; i < 4; i++) { grp->Vtx[i+vofs].x = (float)(cosy*xp[i] + siny*yp[i] + xcnt); grp->Vtx[i+vofs].y = (float)(-siny*xp[i] + cosy*yp[i] + ycnt); } // transform source bearing indicator vofs = vtxofs+12; if (nav) { c = yaw-brg; sinc = sin(c), cosc = cos(c); static double xs[4] = {-6.2,6.2,-6.2,6.2}; static double ys[4] = {-61,-61,-45,-45}; for (i = 0; i < 4; i++) { grp->Vtx[i+vofs].x = (float)(cosc*xs[i] + sinc*ys[i] + xcnt); grp->Vtx[i+vofs].y = (float)(-sinc*xs[i] + cosc*ys[i] + ycnt); } } else { // hide indicator for (i = 0; i < 4; i++) { grp->Vtx[i+vofs].x = (float)(xcnt-65.0); grp->Vtx[i+vofs].y = (float)ycnt; } } // transform course indicator + scale c = yaw-crs; sinc = sin(c), cosc = cos(c); static double xc[8] = {-32.2,32.2,-32.2,32.2, -6.2, 6.2, -6.2, 6.2}; static double yc[8] = { -4.7, -4.7, 4.7, 4.7,-60.5,-60.5,60.5,60.5}; vofs = vtxofs+16; for (i = 0; i < 8; i++) { grp->Vtx[i+vofs].x = (float)(cosc*xc[i] + sinc*yc[i] + xcnt); grp->Vtx[i+vofs].y = (float)(-sinc*xc[i] + cosc*yc[i] + ycnt); } // transform deviation indicator static double xd[4] = {-3.65,3.65,-3.65,3.65}; static double yd[4] = {-26.82,-26.82,26.82,26.82}; double dx = min(8.0,fabs(dev)*DEG)*5.175; if (dev < 0.0) dx = -dx; vofs = vtxofs+24; for (i = 0; i < 4; i++) { grp->Vtx[i+vofs].x = (float)(cosc*(xd[i]+dx) + sinc*yd[i] + xcnt); grp->Vtx[i+vofs].y = (float)(-sinc*(xd[i]+dx) + cosc*yd[i] + ycnt); } // course readout int icrs = (int)(crs*DEG+0.5) % 360; char *cc, cbuf[16]; sprintf (cbuf, "%03d", icrs); vofs = vtxofs+32; static double numw = 10.0, num_ofs = horzx+1.0; static double tu_num[4] = {0,numw/texw,0,numw/texw}; for (cc = cbuf, i = 0; i < 3; cc++, i++) { double x = ((*cc-'0') * numw + num_ofs)/texw; for (j = 0; j < 4; j++) grp->Vtx[i*4+j+vofs].tu = (float)(tu_num[j]+x); } return false; }
void ADICtrl::UpdateDisplay (SURFHANDLE surf, bool force) { static const int frm_tx_y0 = 53; static const int frm_tx_dy = 7; static const int frm_tx_x0[6] = {0, 404, 44, 17, 75, 98}; static const int frm_tx_dx[6] = {16, 16, 30, 26, 22, 23}; static const int nav_tx_x0[6] = {381, 122, 335, 231, 163, 141}; static const int nav_tx_dx[6] = {22, 17, 21, 36, 36, 20}; static const int tgt_tx_y0 = 46; static const int tgt_tx_x0[4] = {293, 315, 338, 371}; static const int tgt_tx_dx[4] = {22, 22, 33, 31}; static const int frm_bb_x0 = dsp_x0+22; static const int frm_bb_y0 = dsp_y0+ 1; static const int tgt_bb_x0 = dsp_x0+22; static const int tgt_bb_y0 = dsp_y0+25; VECTOR3 ofs; OBJHANDLE hRef = 0; NAVHANDLE hNav = 0; int i, len, c, mode, tgtmode, x0, dx; mode = sh->GetAttref()->GetMode(); tgtmode = sh->GetAttref()->GetTgtmode(); if (mode == 4) { DWORD navid = sh->GetAttref()->GetNavid(); hNav = sh->GetNavSource (navid); if (navid) mode = 5; } else if (mode >= 1 && mode <= 3) { if (mode == 3) hRef = sh->GetSurfaceRef(); else hRef = sh->GetGravityRef(); } if (mode != dispprm.frmmode || hRef != dispprm.frmref || (mode >= 4 && hNav != dispprm.navref)) { dispprm.frmmode = mode; dispprm.frmref = hRef; dispprm.navref = hNav; x0 = frm_bb_x0; dx = frm_tx_dx[mode]; oapiColourFill (surf, 0, x0, frm_bb_y0, dsp_x0+148-x0, frm_tx_dy); oapiBlt (surf, surf, x0, frm_bb_y0, frm_tx_x0[mode], frm_tx_y0, dx, frm_tx_dy); x0 += dx; if ((mode >= 1 && mode <= 3) && hRef) { char cbuf[256]; oapiGetObjectName (hRef, cbuf, 256); len = strlen(cbuf); x0 += 4; for (i = 0; i < len; i++) { c = toupper (cbuf[i]); dx = small_font_width[c]; oapiBlt (surf, surf, x0, frm_bb_y0, small_font_xpos[c], small_font_ypos[0], dx, frm_tx_dy); x0 += dx; } } if (mode >= 4) { x0 += 4; if ((i = (hNav ? oapiGetNavType (hNav) : 0)) < 6) { dx = nav_tx_dx[i]; oapiBlt (surf, surf, x0, frm_bb_y0, nav_tx_x0[i], frm_tx_y0, dx, frm_tx_dy); x0 += dx; } } } ofs = sh->GetAttref()->GetEulerOffset(); DispAngle (surf, ofs.x, 30, 8, dispprm.frmofs[0]); DispAngle (surf, ofs.y, 58, 8, dispprm.frmofs[1]); DispAngle (surf, ofs.z, 86, 8, dispprm.frmofs[2]); ofs = sh->GetAttref()->GetTgtOffset(); DispAngle (surf, ofs.y, 58, 32, dispprm.tgtofs[0]); DispAngle (surf, ofs.z, 86, 32, dispprm.tgtofs[1]); ofs = sh->GetAttref()->GetEulerAngles (); DispAngle (surf, ofs.x, 30, 15, dispprm.frmdev[0]); DispAngle (surf, ofs.y, 58, 15, dispprm.frmdev[1]); DispAngle (surf, ofs.z, 86, 15, dispprm.frmdev[2]); if (!sh->GetAttref()->GetTgtEulerAngles (ofs)) { tgtmode = 0; ofs = _V(0,0,0); } DispAngle (surf, ofs.y, 58, 39, dispprm.tgtdev[0]); DispAngle (surf, ofs.z, 86, 39, dispprm.tgtdev[1]); if (tgtmode != dispprm.tgtmode) { dispprm.tgtmode = tgtmode; x0 = frm_bb_x0; oapiColourFill (surf, 0, x0, tgt_bb_y0, dsp_x0+148-x0, frm_tx_dy); if (tgtmode >= 0 && tgtmode < 4) { dx = tgt_tx_dx[tgtmode]; oapiBlt (surf, surf, x0, tgt_bb_y0, tgt_tx_x0[tgtmode], tgt_tx_y0, dx, frm_tx_dy); x0 += dx; } } }