Пример #1
0
bool DGButton3::RedrawVC (DEVMESHHANDLE hMesh, SURFHANDLE surf)
{
	static const double zpos[4] = {0, 0.005, 0.0065, 0.0065};
	if (state != vstate) {
		int i;
		double dz = zpos[state]-zpos[vstate];
		VECTOR3 shift = ax*dz;
		float dsx = (float)shift.x, dsy = (float)shift.y, dsz = (float)shift.z;

		// animate button
		NTVERTEX vtx[nvtx];
		WORD vperm[nvtx];
		for (i = 0; i < nvtx; i++) vperm[i] = vtxofs+i;
		GROUPREQUESTSPEC grs = {vtx, nvtx, vperm, 0, 0, 0, 0, 0};
		oapiGetMeshGroup (hMesh, mgrp, &grs);
		for (i = 0; i < nvtx; i++) {
			vtx[i].x += dsx;
			vtx[i].y += dsy;
			vtx[i].z += dsz;
		}
		GROUPEDITSPEC ges = {GRPEDIT_VTXCRD, 0, vtx, nvtx, vperm};
		oapiEditMeshGroup (hMesh, mgrp, &ges);

		// animate label
		NTVERTEX vtx_lbl[nvtx_lbl];
		WORD vperm_lbl[nvtx_lbl];
		for (i = 0; i < nvtx_lbl; i++) vperm_lbl[i] = vtxofs_lbl+i;
		GROUPREQUESTSPEC grs_lbl = {vtx_lbl, nvtx_lbl, vperm_lbl, 0, 0, 0, 0, 0};
		oapiGetMeshGroup (hMesh, mgrp_lbl, &grs_lbl);
		for (i = 0; i < nvtx_lbl; i++) {
			vtx_lbl[i].x += dsx;
			vtx_lbl[i].y += dsy;
			vtx_lbl[i].z += dsz;
		}

		// show/hide indicator
		DWORD ges_flag = GRPEDIT_VTXCRD;
		bool have_ind = (vstate != OFF);
		bool need_ind = (state != OFF);
		if (have_ind != need_ind) {
			vtx_lbl[6].tv = vtx_lbl[7].tv = (float)((need_ind ? 1.5:10.5)/1024.0);
			ges_flag |= GRPEDIT_VTXTEXV;
		}
		GROUPEDITSPEC ges_lbl = {ges_flag, 0, vtx_lbl, nvtx_lbl, vperm_lbl};
		oapiEditMeshGroup (hMesh, mgrp_lbl, &ges_lbl);

		vstate = state;
	}
	return false;
}
Пример #2
0
bool GearIndicator::RedrawVC (DEVMESHHANDLE hMesh, SURFHANDLE surf)
{
	if (!hMesh) return false;

	double d;
	bool showlights = (component->GearState().IsClosed() ? false :
		               component->GearState().IsOpen() ? true :
					   (modf (oapiGetSimTime()+tofs, &d) < 0.5));
	if (showlights != light) {
		GROUPEDITSPEC ges;
		static WORD vtxofs = VC_GEAR_INDICATOR_vofs;
		static const DWORD nvtx = 2;
		static WORD vidx[nvtx] = {vtxofs,vtxofs+1};
		static float v[2] = {0.2427f,0.3042f};
		NTVERTEX vtx[nvtx];
		for (DWORD i = 0; i < nvtx; i++)
			vtx[i].tv = v[(showlights ? 1:0)];
		ges.flags = GRPEDIT_VTXTEXV;
		ges.Vtx = vtx;
		ges.vIdx = vidx;
		ges.nVtx = nvtx;
		oapiEditMeshGroup (hMesh, GRP_VC4_LIT_VC, &ges);
		light = showlights;
	}
	return false;
}
Пример #3
0
bool DGButton2::RedrawVC (DEVMESHHANDLE hMesh, SURFHANDLE surf)
{
	static const double zpos[2] = {0, 0.004};
	if (state != vstate) {
		int i;
		double dz = zpos[state]-zpos[vstate];
		VECTOR3 shift = ax*dz;
		float dsx = (float)shift.x, dsy = (float)shift.y, dsz = (float)shift.z;

		// animate button
		NTVERTEX vtx[nvtx];
		WORD vperm[nvtx];
		for (i = 0; i < nvtx; i++) vperm[i] = vtxofs+i;
		GROUPREQUESTSPEC grs = {vtx, nvtx, vperm, 0, 0, 0, 0, 0};
		oapiGetMeshGroup (hMesh, mgrp, &grs);
		for (i = 0; i < nvtx; i++) {
			vtx[i].x += dsx;
			vtx[i].y += dsy;
			vtx[i].z += dsz;
		}
		GROUPEDITSPEC ges = {GRPEDIT_VTXCRD, 0, vtx, nvtx, vperm};
		oapiEditMeshGroup (hMesh, mgrp, &ges);

		vstate = state;
	}
	return false;
}
Пример #4
0
bool HUDButton::RedrawVC (DEVMESHHANDLE hMesh, SURFHANDLE surf)
{
	if (!hMesh) return false;
	NTVERTEX vtx[12];
	GROUPEDITSPEC ges;
	ges.flags = GRPEDIT_VTXTEXU;
	ges.Vtx = vtx;
	ges.nVtx = 12;
	ges.vIdx = NULL;

	for (int i = 0; i < 3; i++) {
		bool hilight = (oapiGetHUDMode() == 3-i);
		vtx[i*4  ].tu = vtx[i*4+1].tu = (hilight ? 0.1543f : 0.0762f);
		vtx[i*4+2].tu = vtx[i*4+3].tu = (hilight ? 0.0801f : 0.0020f);
	}
	oapiEditMeshGroup (hMesh, MESHGRP_VC_HUDMODE, &ges);

	//for (int i = 0; i < 3; i++) {
	//	bool hilight = (oapiGetHUDMode() == 3-i);
	//	_grp->Vtx[i*4  ].tu = _grp->Vtx[i*4+1].tu = (hilight ? 0.1543f : 0.0762f);
	//	_grp->Vtx[i*4+2].tu = _grp->Vtx[i*4+3].tu = (hilight ? 0.0801f : 0.0020f);
	//}
	//vessel->MeshModified (mesh, gidx, 0);
	return false;
}
Пример #5
0
void MfdButtonGrp::PushButtonVC (DEVMESHHANDLE hMesh, int meshgrp, int btn, bool down)
{
	if (down == ispushed[btn]) return; // nothing to do
	ispushed[btn] = down;

	static const int nvtx_per_button = 12;
	static const double depth = 0.004;   // button travel
	static const double tilt = 20.0*RAD; // inclination of MFD panel
	static const float dz_down = (float)( depth*cos(tilt));
	static const float dy_down = (float)(-depth*sin(tilt));
	NTVERTEX dvtx[nvtx_per_button];
	WORD vofs[nvtx_per_button];
	float dz = (down ? dz_down : -dz_down);
	float dy = (down ? dy_down : -dy_down);
	for (int i = 0; i < nvtx_per_button; i++) {
		dvtx[i].y = dy;
		dvtx[i].z = dz;
		vofs[i] = btn*nvtx_per_button + i;
	}
	GROUPEDITSPEC ges = {GRPEDIT_VTXCRDADDY|GRPEDIT_VTXCRDADDZ, 0, dvtx, nvtx_per_button, vofs};
	oapiEditMeshGroup (hMesh, meshgrp, &ges);
}
Пример #6
0
bool DGSwitch1::RedrawVC (DEVMESHHANDLE hMesh, SURFHANDLE surf)
{
	static double phi[3] = {0.0, travel, -travel};
	if (state != vstate) {
		int i;
		double phi0 = phi[vstate];
		double phi1 = phi[state];
		double dphi = phi1-phi0;
		VECTOR3 p, pt;
		MATRIX3 R = rotm(ax,dphi); // rotation matrix from current to new state

		NTVERTEX vtx[nvtx];
		WORD vperm[nvtx];
		for (i = 0; i < nvtx; i++) vperm[i] = vofs + i;
		GROUPREQUESTSPEC grs = {vtx, nvtx, vperm, 0, 0, 0, 0, 0};
		oapiGetMeshGroup (hMesh, mgrp, &grs);
		for (i = 0; i < nvtx; i++) {
			p.x = vtx[i].x - rf.x;
			p.y = vtx[i].y - rf.y;
			p.z = vtx[i].z - rf.z;
			pt = mul(R,p);
			vtx[i].x = (float)(pt.x + rf.x);
			vtx[i].y = (float)(pt.y + rf.y);
			vtx[i].z = (float)(pt.z + rf.z);
			p.x = vtx[i].nx;
			p.y = vtx[i].ny;
			p.z = vtx[i].nz;
			pt = mul(R,p);
			vtx[i].nx = (float)pt.x;
			vtx[i].ny = (float)pt.y;
			vtx[i].nz = (float)pt.z;
		}
		GROUPEDITSPEC ges = {GRPEDIT_VTXCRD|GRPEDIT_VTXNML, 0, vtx, nvtx, vperm};
		oapiEditMeshGroup (hMesh, mgrp, &ges);
		vstate = state;
	}
	return false;
}
Пример #7
0
bool DGDial1::RedrawVC (DEVMESHHANDLE hMesh, SURFHANDLE surf)
{
	if (pos != vpos) {
		int i;
		double phi0 = (vpos >= 0 ? p0 + vpos*dp : 0.0);
		double phi1 = p0 + pos*dp;
		double dphi = phi0-phi1;
		VECTOR3 p, pt;
		MATRIX3 R = rotm(ax,dphi);

		NTVERTEX vtx[nvtx];
		WORD vperm[nvtx];
		for (i = 0; i < nvtx; i++) vperm[i] = vofs + i;
		GROUPREQUESTSPEC grs = {vtx, nvtx, vperm, 0, 0, 0, 0, 0};
		oapiGetMeshGroup (hMesh, mgrp, &grs);
		for (i = 0; i < nvtx; i++) {
			p.x = vtx[i].x - rf.x;
			p.y = vtx[i].y - rf.y;
			p.z = vtx[i].z - rf.z;
			pt = mul(R,p);
			vtx[i].x = (float)(pt.x + rf.x);
			vtx[i].y = (float)(pt.y + rf.y);
			vtx[i].z = (float)(pt.z + rf.z);
			p.x = vtx[i].nx;
			p.y = vtx[i].ny;
			p.z = vtx[i].nz;
			pt = mul(R,p);
			vtx[i].nx = (float)pt.x;
			vtx[i].ny = (float)pt.y;
			vtx[i].nz = (float)pt.z;
		}
		GROUPEDITSPEC ges = {GRPEDIT_VTXCRD|GRPEDIT_VTXNML, 0, vtx, nvtx, vperm};
		oapiEditMeshGroup (hMesh, mgrp, &ges);

		vpos = pos;
	}
	return false;
}
Пример #8
0
bool MWSButton::RedrawVC (DEVMESHHANDLE hMesh, SURFHANDLE surf)
{
	bool light;
	if (dg->MWSActive()) {
		double di, simt = oapiGetSimTime();
		light = (modf (simt, &di) < 0.5);
	} else light = false;

	if (light != islit) {
		NTVERTEX vtx[4];
		static WORD vidx[4] = {32,33,34,35};
		GROUPEDITSPEC ges;
		ges.flags = GRPEDIT_VTXTEXU;
		ges.nVtx = 4;
		ges.vIdx = vidx;
		ges.Vtx = vtx;
		float xofs = 0.2246f + (light ? 0.12891f : 0.0f);
		vtx[0].tu = vtx[1].tu = xofs;
		vtx[2].tu = vtx[3].tu = xofs + 0.125f;
		oapiEditMeshGroup (hMesh, MESHGRP_VC_STATUSIND, &ges);
		islit = light;
	}
	return false;
}