CItemSelector::CSymbolInterval CItemSelector::GetSelectionInfo() const { if( start->GetParent() == 0 ) { int startIdx = -1; while( &content[++startIdx] != start->CurrentLine ) { } int endIdx = -1; while ( &content[++endIdx] != end->CurrentLine ) { } CSymbolPosition tmpStart( *start ); CSymbolPosition tmpEnd( *end ); if( startIdx > endIdx || tmpStart.Index > tmpEnd.Index ) { std::swap( tmpStart, tmpEnd ); std::swap( startIdx, endIdx ); } if( tmpStart.CurrentLine == &content[content.size() - 1] && tmpStart.Index == tmpStart.CurrentLine->Length() ) { return std::make_pair( CSymbolPosition( -1, tmpStart ), CSymbolPosition( -1, tmpEnd ) ); } else { goToNextSymbol( startIdx, tmpStart ); goToPrevSymbol( endIdx, tmpEnd ); if( startIdx > endIdx ) { return std::make_pair( CSymbolPosition( -1, tmpStart ), CSymbolPosition( -1, tmpEnd ) ); } else { return std::make_pair( tmpStart, tmpEnd ); } } } else { if( start->Index > end->Index ) { return std::make_pair( *end, *start ); } else { return std::make_pair( *start, *end ); } } }
void CItemSelector::ResetSelection() { std::shared_ptr<CSymbolPosition> tmpStart( 0 ); start.swap( tmpStart ); std::shared_ptr<CSymbolPosition> tmpEnd( 0 ); end.swap( tmpEnd ); }
void StelMovementMgr::updateVisionVector(double deltaTime) { // Specialized setups cannot use this functionality! if (flagInhibitAllAutomoves) return; if (flagAutoMove) { if (!move.targetObject.isNull()) { // if zooming in, object may be moving so be sure to zoom to latest position // In case we have offset center, we want object still visible in center. // Note that if we do not center on an object, we set view direction of the potentially offset screen center! // This is by design, to allow accurate setting of display coordinates. Vec3d v; switch (mountMode) { case MountAltAzimuthal: v = move.targetObject->getAltAzPosAuto(core); break; case MountEquinoxEquatorial: v = move.targetObject->getEquinoxEquatorialPos(core); break; case MountGalactic: v = move.targetObject->getGalacticPos(core); break; default: qWarning() << "StelMovementMgr: unexpected mountMode" << mountMode; Q_ASSERT(0); v = move.targetObject->getAltAzPosAuto(core); // still do something useful } double lat, lon; StelUtils::rectToSphe(&lon, &lat, v); float altOffset=core->getCurrentStelProjectorParams().viewportCenterOffset[1]*currentFov*M_PI/180.0f; lat+=altOffset; StelUtils::spheToRect(lon, lat, v); move.aim=mountFrameToJ2000(v); move.aim.normalize(); move.aim*=2.; // For aiming at objects, we can assume simple up vector. move.startUp=getViewUpVectorJ2000(); move.aimUp=mountFrameToJ2000(Vec3d(0., 0., 1.)); } move.coef+=move.speed*deltaTime*1000; if (move.coef>=1.) { setViewUpVectorJ2000(move.aimUp); //qDebug() << "AutoMove finished. Setting Up vector (in mount frame) to " << upVectorMountFrame.v[0] << "/" << upVectorMountFrame.v[1] << "/" << upVectorMountFrame.v[2]; flagAutoMove=false; move.coef=1.; } else setViewUpVectorJ2000(move.startUp*(1.-move.coef) + move.aimUp*move.coef); // Use a smooth function float smooth = 4.f; double c; if (zoomingMode==ZoomIn) { if (move.coef>.9) { c = 1.; } else { c = 1. - pow(1.-1.11*move.coef,3.); } } else if (zoomingMode==ZoomOut) { if (move.coef<0.1) { // keep in view at first as zoom out c = 0; } else { c = pow(1.11*(move.coef-.1),3.); } } else c = std::atan(smooth * 2.*move.coef-smooth)/std::atan(smooth)/2+0.5; Vec3d tmpStart(j2000ToMountFrame(move.start)); Vec3d tmpAim(j2000ToMountFrame(move.aim)); double ra_aim, de_aim, ra_start, de_start; StelUtils::rectToSphe(&ra_start, &de_start, tmpStart); StelUtils::rectToSphe(&ra_aim, &de_aim, tmpAim); // Make sure the position of the object to be aimed at is defined... Q_ASSERT(move.aim[0]==move.aim[0] && move.aim[1]==move.aim[1] && move.aim[2]==move.aim[2]); // Trick to choose the good moving direction and never travel on a distance > PI if (ra_aim-ra_start > M_PI) { ra_aim -= 2.*M_PI; } else if (ra_aim-ra_start < -M_PI) { ra_aim += 2.*M_PI; } const double de_now = de_aim*c + de_start*(1.-c); const double ra_now = ra_aim*c + ra_start*(1.-c); Vec3d tmp; StelUtils::spheToRect(ra_now, de_now, tmp); setViewDirectionJ2000(mountFrameToJ2000(tmp)); // qDebug() << "setting view direction to " << tmp.v[0] << "/" << tmp.v[1] << "/" << tmp.v[2]; } else { if (flagTracking && objectMgr->getWasSelected()) // Equatorial vision vector locked on selected object { Vec3d v; switch (mountMode) { case MountAltAzimuthal: v = objectMgr->getSelectedObject()[0]->getAltAzPosAuto(core); break; case MountEquinoxEquatorial: v = objectMgr->getSelectedObject()[0]->getEquinoxEquatorialPos(core); break; case MountGalactic: v = objectMgr->getSelectedObject()[0]->getGalacticPos(core); break; default: qWarning() << "StelMovementMgr: unexpected mountMode" << mountMode; Q_ASSERT(0); v = move.targetObject->getAltAzPosAuto(core); // still do something useful in release build } double lat, lon; // general: longitudinal, latitudinal StelUtils::rectToSphe(&lon, &lat, v); float latOffset=core->getCurrentStelProjectorParams().viewportCenterOffset[1]*currentFov*M_PI/180.0f; lat+=latOffset; StelUtils::spheToRect(lon, lat, v); setViewDirectionJ2000(mountFrameToJ2000(v)); setViewUpVectorJ2000(mountFrameToJ2000(Vec3d(0., 0., 1.))); // Does not disturb to reassure this former default. } else { if (flagLockEquPos) // Equatorial vision vector locked { // Recalc local vision vector setViewDirectionJ2000(viewDirectionJ2000); } else { // Vision vector locked to its position in the mountFrame setViewDirectionJ2000(mountFrameToJ2000(viewDirectionMountFrame)); } } } }