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; }
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; }
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; }
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; }
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); }
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; }
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; }
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; }