// Draw constellations lines void ConstellationMgr::drawLines(StelPainter& sPainter, const StelCore* core) const { sPainter.enableTexture2d(false); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (constellationLineThickness>1.f) glLineWidth(constellationLineThickness); // set line thickness // OpenGL ES 2.0 doesn't have GL_LINE_SMOOTH. But it looks much better. #ifdef GL_LINE_SMOOTH if (QOpenGLContext::currentContext()->format().renderableType()==QSurfaceFormat::OpenGL) glEnable(GL_LINE_SMOOTH); #endif const SphericalCap& viewportHalfspace = sPainter.getProjector()->getBoundingCap(); vector < Constellation * >::const_iterator iter; for (iter = asterisms.begin(); iter != asterisms.end(); ++iter) { (*iter)->drawOptim(sPainter, core, viewportHalfspace); } if (constellationLineThickness>1.f) glLineWidth(1.f); // restore line thickness // OpenGL ES 2.0 doesn't have GL_LINE_SMOOTH. But it looks much better. #ifdef GL_LINE_SMOOTH if (QOpenGLContext::currentContext()->format().renderableType()==QSurfaceFormat::OpenGL) glDisable(GL_LINE_SMOOTH); #endif }
void NebulaMgr::drawPointer(const StelCore* core, StelPainter& sPainter) { const StelProjectorP prj = core->getProjection(StelCore::FrameJ2000); const QList<StelObjectP> newSelected = GETSTELMODULE(StelObjectMgr)->getSelectedObject("Nebula"); if (!newSelected.empty()) { const StelObjectP obj = newSelected[0]; Vec3d pos=obj->getJ2000EquatorialPos(core); // Compute 2D pos and return if outside screen if (!prj->projectInPlace(pos)) return; if (StelApp::getInstance().getVisionModeNight()) sPainter.setColor(0.8f,0.0f,0.0f); else sPainter.setColor(0.4f,0.5f,0.8f); texPointer->bind(); sPainter.enableTexture2d(true); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Normal transparency mode // Size on screen float size = obj->getAngularSize(core)*M_PI/180.*prj->getPixelPerRadAtCenter(); size+=20.f + 10.f*std::sin(2.f * StelApp::getInstance().getTotalRunTime()); sPainter.drawSprite2dMode(pos[0]-size/2, pos[1]-size/2, 10, 90); sPainter.drawSprite2dMode(pos[0]-size/2, pos[1]+size/2, 10, 0); sPainter.drawSprite2dMode(pos[0]+size/2, pos[1]+size/2, 10, -90); sPainter.drawSprite2dMode(pos[0]+size/2, pos[1]-size/2, 10, -180); } }
void StarMgr::drawPointer(StelPainter& sPainter, const StelCore* core) { const QList<StelObjectP> newSelected = objectMgr->getSelectedObject("Star"); if (!newSelected.empty()) { const StelObjectP obj = newSelected[0]; Vec3d pos=obj->getJ2000EquatorialPos(core); Vec3d screenpos; // Compute 2D pos and return if outside screen if (!sPainter.getProjector()->project(pos, screenpos)) return; Vec3f c(obj->getInfoColor()); if (StelApp::getInstance().getVisionModeNight()) c = StelUtils::getNightColor(c); sPainter.setColor(c[0], c[1], c[2]); texPointer->bind(); sPainter.enableTexture2d(true); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Normal transparency mode sPainter.drawSprite2dMode(screenpos[0], screenpos[1], 13.f, StelApp::getInstance().getTotalRunTime()*40.); } }
void ConstellationMgr::drawBoundaries(StelPainter& sPainter) const { sPainter.enableTexture2d(false); glDisable(GL_BLEND); vector < Constellation * >::const_iterator iter; for (iter = asterisms.begin(); iter != asterisms.end(); ++iter) { (*iter)->drawBoundaryOptim(sPainter); } }
// Draw the art texture void Constellation::drawArt(StelPainter& sPainter) const { glBlendFunc(GL_ONE, GL_ONE); sPainter.enableTexture2d(true); glEnable(GL_BLEND); glEnable(GL_CULL_FACE); SphericalRegionP region = sPainter.getProjector()->getViewportConvexPolygon(); drawArtOptim(sPainter, *region); glDisable(GL_CULL_FACE); }
// Draw constellations lines void ConstellationMgr::drawLines(StelPainter& sPainter, const StelCore* core) const { sPainter.enableTexture2d(false); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); const SphericalCap& viewportHalfspace = sPainter.getProjector()->getBoundingCap(); vector < Constellation * >::const_iterator iter; for (iter = asterisms.begin(); iter != asterisms.end(); ++iter) { (*iter)->drawOptim(sPainter, core, viewportHalfspace); } }
// Draw the names of all the constellations void ConstellationMgr::drawNames(StelPainter& sPainter) const { glEnable(GL_BLEND); sPainter.enableTexture2d(true); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); vector < Constellation * >::const_iterator iter; for (iter = asterisms.begin(); iter != asterisms.end(); iter++) { // Check if in the field of view if (sPainter.getProjector()->projectCheck((*iter)->XYZname, (*iter)->XYname)) (*iter)->drawName(sPainter); } }
// Draw constellations art textures void ConstellationMgr::drawArt(StelPainter& sPainter) const { glBlendFunc(GL_ONE, GL_ONE); sPainter.enableTexture2d(true); glEnable(GL_BLEND); glEnable(GL_CULL_FACE); vector < Constellation * >::const_iterator iter; SphericalRegionP region = sPainter.getProjector()->getViewportConvexPolygon(); for (iter = asterisms.begin(); iter != asterisms.end(); ++iter) { (*iter)->drawArtOptim(sPainter, *region); } glDisable(GL_CULL_FACE); }
void ConstellationMgr::drawBoundaries(StelPainter& sPainter) const { sPainter.enableTexture2d(false); glDisable(GL_BLEND); #ifndef USE_OPENGL_ES2 glLineStipple(2, 0x3333); glEnable(GL_LINE_STIPPLE); #endif vector < Constellation * >::const_iterator iter; for (iter = asterisms.begin(); iter != asterisms.end(); ++iter) { (*iter)->drawBoundaryOptim(sPainter); } #ifndef USE_OPENGL_ES2 glDisable(GL_LINE_STIPPLE); #endif }
void Novae::drawPointer(StelCore* core, StelPainter &painter) { const QList<StelObjectP> newSelected = GETSTELMODULE(StelObjectMgr)->getSelectedObject("Nova"); if (!newSelected.empty()) { const StelObjectP obj = newSelected[0]; Vec3d pos=obj->getJ2000EquatorialPos(core); Vec3d screenpos; // Compute 2D pos and return if outside screen if (!painter.getProjector()->project(pos, screenpos)) return; const Vec3f& c(obj->getInfoColor()); painter.setColor(c[0],c[1],c[2]); texPointer->bind(); painter.enableTexture2d(true); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Normal transparency mode painter.drawSprite2dMode(screenpos[0], screenpos[1], 13.f, StelApp::getInstance().getTotalRunTime()*40.); } }
void Constellation::drawBoundaryOptim(StelPainter& sPainter) const { if (!boundaryFader.getInterstate()) return; sPainter.enableTexture2d(false); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Normal transparency mode sPainter.setColor(boundaryColor[0], boundaryColor[1], boundaryColor[2], boundaryFader.getInterstate()); unsigned int i, j; size_t size; Vec3f pt1, pt2; Vec3d ptd1, ptd2; std::vector<Vec3f> *points; if (singleSelected) size = isolatedBoundarySegments.size(); else size = sharedBoundarySegments.size(); const SphericalCap& viewportHalfspace = sPainter.getProjector()->getBoundingCap(); for (i=0;i<size;i++) { if (singleSelected) points = isolatedBoundarySegments[i]; else points = sharedBoundarySegments[i]; for (j=0;j<points->size()-1;j++) { pt1 = points->at(j); pt2 = points->at(j+1); if (pt1*pt2>0.9999999f) continue; ptd1.set(pt1[0], pt1[1], pt1[2]); ptd2.set(pt2[0], pt2[1], pt2[2]); sPainter.drawGreatCircleArc(ptd1, ptd2, &viewportHalfspace); } } }
bool SkyLabel::draw(StelCore* core, StelPainter& sPainter) { if(labelFader.getInterstate() <= 0.0) return false; Vec3d objectPos = labelObject->getJ2000EquatorialPos(core); Vec3d labelXY; sPainter.getProjector()->project(objectPos,labelXY); sPainter.setFont(labelFont); double xOffset(0.); double yOffset(0.); char hJustify = 'c'; char vJustify = 'c'; if (labelSide.toUpper().contains("N")) { yOffset = 1.0; vJustify = 'b'; // bottom justify text } else if (labelSide.toUpper().contains("S")) { yOffset = -1.0; vJustify = 't'; // top justufy text } if (labelSide.toUpper().contains("E")) { xOffset = 1.0; hJustify = 'l'; // right justify text } else if (labelSide.toUpper().contains("W")) { xOffset = -1.0; hJustify = 'r'; // left justify text } if (labelDistance >= 0.0) { xOffset *= labelDistance; yOffset *= labelDistance; } else { float shift = 4.f + labelObject->getAngularSize(core)*M_PI/180.*sPainter.getProjector()->getPixelPerRadAtCenter()/1.8f; // use the object size xOffset *= shift; yOffset *= shift; } double jxOffset(0.); double jyOffset(0.); if (hJustify == 'r') jxOffset = sPainter.getFontMetrics().width(labelText); else if (hJustify == 'c') jxOffset = sPainter.getFontMetrics().width(labelText) / 2.; if (vJustify == 't') jyOffset = sPainter.getFontMetrics().height(); else if (vJustify == 'c') jyOffset = sPainter.getFontMetrics().height() / 2.; sPainter.setColor(labelColor[0], labelColor[1], labelColor[2], labelFader.getInterstate()); sPainter.drawText(labelXY[0]+xOffset-jxOffset, labelXY[1]+yOffset-jyOffset, labelText, 0, 0, 0, false); if (labelStyle == SkyLabel::Line) { sPainter.enableTexture2d(false); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // screen coordinates of object Vec3d objXY; sPainter.getProjector()->project(objectPos,objXY); double lineEndX = labelXY[0]+xOffset; double lineEndY = labelXY[1]+yOffset; if (vJustify == 'b') lineEndY -= 5; else if (vJustify == 't') lineEndY += 5; if (hJustify == 'l') lineEndX -= 5; else if (hJustify == 'r') lineEndX += 5; sPainter.setColor(labelColor[0], labelColor[1], labelColor[2], labelFader.getInterstate()); sPainter.drawLine2d(lineEndX,lineEndY,objXY[0], objXY[1]); } return true; }