From 5a0790ed5d2d208c525f57d0d3c382b94627be9d Mon Sep 17 00:00:00 2001
From: Oliver Bock <oliver.bock@aei.mpg.de>
Date: Tue, 2 Dec 2008 15:18:59 +0100
Subject: [PATCH] Added orbit indicator displayed during interactive camera
 movement

* TODO: alpha blending doesn't seem to work
* Also: decreased camera zoom (zoom should be called distance...)
---
 src/pulsaranimationwidget.cpp | 40 +++++++++++++++++++++++++++++++++--
 src/pulsaranimationwidget.h   |  3 +++
 2 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp
index 7758911..3818c59 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 6edf805..cedde98 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;
-- 
GitLab