Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
		}
	}
}