diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp index 7758911d173f4049968ab7f01f3b9f69fab1343c..3818c59ab3396c079c7174d17cec6956bfe677c1 100644 --- a/src/pulsaranimationwidget.cpp +++ b/src/pulsaranimationwidget.cpp @@ -23,11 +23,19 @@ const float PulsarAnimationWidget::deg2rad = PI/180.0f; PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) : - QGLWidget(parent), + QGLWidget(QGLFormat(QGL::AlphaChannel), parent), m_frameTimer() { + if(!format().rgba()) { + qWarning("Sorry, no RGBA support..."); + } + if(!format().alpha()) { + qWarning("Sorry, no alpha channel support..."); + } + connect(&m_frameTimer, SIGNAL(timeout()), this, SLOT(updateFrame())); + m_quadricPulsarOrbitPlane = NULL; m_quadricPulsar = NULL; m_quadricPulsarCone1 = NULL; m_quadricPulsarCone2 = NULL; @@ -41,11 +49,12 @@ PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) : m_pulsarRotationAngle = 0.0f; m_orbitRotationAngle = 0.0f; + m_cameraInteraction = false; m_mouseLastX = 0; m_mouseLastY = 0; m_mouseAngleH = 90.0f; m_mouseAngleV = 30.f; - m_cameraZoom = 10.0f; + m_cameraZoom = 15.0f; m_cameraZoomLBound = 2.0f; updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom); @@ -53,6 +62,7 @@ PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) : PulsarAnimationWidget::~PulsarAnimationWidget() { + if(m_quadricPulsarOrbitPlane) gluDeleteQuadric(m_quadricPulsarOrbitPlane); if(m_quadricPulsar) gluDeleteQuadric(m_quadricPulsar); if(m_quadricPulsarCone1) gluDeleteQuadric(m_quadricPulsarCone1); if(m_quadricPulsarCone2) gluDeleteQuadric(m_quadricPulsarCone2); @@ -85,9 +95,14 @@ void PulsarAnimationWidget::initializeGL() glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + m_quadricPulsarOrbitPlane = gluNewQuadric(); m_quadricPulsar = gluNewQuadric(); m_quadricPulsarCone1 = gluNewQuadric(); m_quadricPulsarCone2 = gluNewQuadric(); + gluQuadricNormals(m_quadricPulsarOrbitPlane, GLU_SMOOTH); gluQuadricNormals(m_quadricPulsar, GLU_SMOOTH); gluQuadricNormals(m_quadricPulsarCone1, GLU_SMOOTH); gluQuadricNormals(m_quadricPulsarCone2, GLU_SMOOTH); @@ -117,6 +132,19 @@ void PulsarAnimationWidget::paintGL() 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); + if(m_cameraInteraction) { + static GLfloat pulsarOrbitAmbientDiffuse[] = { 1.0, 1.0, 1.0, 0.25 }; + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, pulsarOrbitAmbientDiffuse); + + glPushMatrix(); + glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + gluDisk(m_quadricPulsarOrbitPlane, + m_pulsarOrbitRadius * 0.9f, + m_pulsarOrbitRadius * 1.1f, + 64, 1); + glPopMatrix(); + } + // TODO: should be located elsewhere static GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 }; static GLfloat mat_diffuse[] = { 0.5, 0.5, 0.5, 1.0 }; @@ -202,6 +230,12 @@ void PulsarAnimationWidget::updateFrame() updateGL(); } +void PulsarAnimationWidget::mousePressEvent(QMouseEvent *event) +{ + m_cameraInteraction = true; + updateGL(); +} + void PulsarAnimationWidget::mouseMoveEvent(QMouseEvent *event) { Qt::MouseButtons buttons = event->buttons(); @@ -237,6 +271,8 @@ void PulsarAnimationWidget::mouseReleaseEvent(QMouseEvent *event) { m_mouseLastX = 0; m_mouseLastY = 0; + m_cameraInteraction = false; + updateGL(); } void PulsarAnimationWidget::updateCameraPosition(const int angleH, const int angleV, const float zoom) diff --git a/src/pulsaranimationwidget.h b/src/pulsaranimationwidget.h index 6edf80571b142879eb59e316e0e6ec316e3f5362..cedde98ab0e03c9bb38770b439edc4db0ddd3d9f 100644 --- a/src/pulsaranimationwidget.h +++ b/src/pulsaranimationwidget.h @@ -55,6 +55,7 @@ protected: void resizeGL(int w, int h); void paintGL(); + void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); @@ -62,6 +63,7 @@ protected: QTimer m_frameTimer; + GLUquadricObj *m_quadricPulsarOrbitPlane; GLUquadricObj *m_quadricPulsar; GLUquadricObj *m_quadricPulsarCone1; GLUquadricObj *m_quadricPulsarCone2; @@ -77,6 +79,7 @@ protected: float m_pulsarOrbitRadius; float m_companionOrbitRadius; + bool m_cameraInteraction; int m_mouseLastX; int m_mouseLastY; int m_mouseAngleH;