pulsaranimationwidget.cpp 19 KB
Newer Older
Oliver Bock's avatar
Oliver Bock committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/******************************************************************************
 *   Copyright (C) 2008 by Oliver Bock                                        *
 *   oliver.bock[AT]aei.mpg.de                                                *
 *                                                                            *
 *   This file is part of PulsatingScience.                                   *
 *                                                                            *
 *   PulsatingScience is free software: you can redistribute it and/or modify *
 *   it under the terms of the GNU General Public License as published        *
 *   by the Free Software Foundation, version 3 of the License.               *
 *                                                                            *
 *   PulsatingScience is distributed in the hope that it will be useful,      *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the             *
 *   GNU General Public License for more details.                             *
 *                                                                            *
 *   You should have received a copy of the GNU General Public License        *
 *   along with PulsatingScience. If not, see <http://www.gnu.org/licenses/>. *
 *                                                                            *
 ******************************************************************************/

#include "pulsaranimationwidget.h"
22
#include "lib/antenna_lib.h"
Oliver Bock's avatar
Oliver Bock committed
23

Oliver Bock's avatar
Oliver Bock committed
24
const double PulsarAnimationWidget::deg2rad = PI/180.0;
25

Oliver Bock's avatar
Oliver Bock committed
26
PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) :
27
    QGLWidget(QGLFormat(QGL::AlphaChannel | QGL::SampleBuffers), parent)
Oliver Bock's avatar
Oliver Bock committed
28
{
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    QString msgThis = tr("3D animation");
    if(!format().directRendering()) {
        QString msg = tr("Sorry, no direct rendering support for %1...");
        qWarning() << msg.arg(msgThis);
    }
    if(!format().doubleBuffer()) {
        QString msg = tr("Sorry, no double buffering support for %1...");
        qWarning() << msg.arg(msgThis);
    }
    if(!format().rgba()) {
        QString msg = tr("Sorry, no RGBA support for %1...");
        qWarning() << msg.arg(msgThis);
    }
    if(!format().alpha()) {
        QString msg = tr("Sorry, no alpha channel support for %1...");
        qWarning() << msg.arg(msgThis);
    }
    if(!format().sampleBuffers()) {
        QString msg = tr("Sorry, no multisampling support for %1...");
        qWarning() << msg.arg(msgThis);
    }

Oliver Bock's avatar
Oliver Bock committed
51
    // initialize quadric pointers
Oliver Bock's avatar
Oliver Bock committed
52
53
    m_quadricVirgoh = NULL;
    m_quadricVirgov = NULL;
Oliver Bock's avatar
Oliver Bock committed
54
    m_quadricEarth = NULL;
Oliver Bock's avatar
Oliver Bock committed
55
56
    m_quadricLLOh = NULL;
    m_quadricLLOv = NULL;
Oliver Bock's avatar
Oliver Bock committed
57
58
59
    m_quadricSourcePlane = NULL;
    m_quadricSourcePlaneNormal = NULL;
    m_quadricSourcePlaneNormalCap = NULL;
60
    m_quadricSourcePlaneNormalCenter = NULL;
61
62
    m_quadricLHOv = NULL;
    m_quadricLHOh = NULL;
63
64

    // initialize texture pointers
65
    m_beamTexture = 0;
66

67
    // initial parameters (have to match GUI!)
68
69
70
    m_LHOAngle = 0;
    m_LLOAngle = 0;
    m_VirgoAngle = 0;
Oliver Bock's avatar
Oliver Bock committed
71
    m_sourceIota = 0.0;
72
    m_sourceInclination = 0;
73

Oliver Bock's avatar
Oliver Bock committed
74
    m_earthRadius = 3.0;
75

76
77
78
79
    // initial view features
    m_cameraInteraction = false;

    // initial view settings
80
81
    m_mouseAngleH = -55.0;
    m_mouseAngleV = 20.0;
82
    m_cameraZoom = 100.0;
83
84
85
86
87
88
89
    m_cameraZoomLBound = 10.0;
    m_cameraZoomUBound = 4500.0;
    m_mouseLastX = 0;
    m_mouseLastY = 0;

    // update camera based on settings above
    updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom);
Oliver Bock's avatar
Oliver Bock committed
90
91
92
93
}

PulsarAnimationWidget::~PulsarAnimationWidget()
{
Oliver Bock's avatar
Oliver Bock committed
94
95
    if(m_quadricVirgoh) gluDeleteQuadric(m_quadricVirgoh);
    if(m_quadricVirgov) gluDeleteQuadric(m_quadricVirgov);
Oliver Bock's avatar
Oliver Bock committed
96
    if(m_quadricEarth) gluDeleteQuadric(m_quadricEarth);
Oliver Bock's avatar
Oliver Bock committed
97
98
    if(m_quadricLLOh) gluDeleteQuadric(m_quadricLLOh);
    if(m_quadricLLOv) gluDeleteQuadric(m_quadricLLOv);
Oliver Bock's avatar
Oliver Bock committed
99
100
101
    if(m_quadricSourcePlane) gluDeleteQuadric(m_quadricSourcePlane);
    if(m_quadricSourcePlaneNormal) gluDeleteQuadric(m_quadricSourcePlaneNormal);
    if(m_quadricSourcePlaneNormalCap) gluDeleteQuadric(m_quadricSourcePlaneNormalCap);
102
    if(m_quadricSourcePlaneNormalCenter) gluDeleteQuadric(m_quadricSourcePlaneNormalCenter);
103
104
    if(m_quadricLHOv) gluDeleteQuadric(m_quadricLHOv);
    if(m_quadricLHOh) gluDeleteQuadric(m_quadricLHOh);
105

106
    if(m_beamTexture) deleteTexture(m_beamTexture);
Oliver Bock's avatar
Oliver Bock committed
107
108
109
110
}

void PulsarAnimationWidget::initializeGL()
{
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClearDepth(1.0);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);

    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    GLfloat LightAmbient[] = {0.3, 0.3, 0.3, 1.0};
    GLfloat LightDiffuse[] = {1.0, 1.0, 1.0, 1.0};
    GLfloat LightSpecular[] = {1.0, 1.0, 1.0, 1.0};
    GLfloat LightPosition[] = {0.0, 0.0, 3.0, 1.0};
    GLfloat spot_direction[] = {0.0, 0.0, -1.0};

    glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
    glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 50.0);
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
    glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 10.0);

    glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
    glEnable(GL_LIGHT0);

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);

Oliver Bock's avatar
Oliver Bock committed
139
140
    m_quadricVirgoh = gluNewQuadric();
    m_quadricVirgov = gluNewQuadric();
Oliver Bock's avatar
Oliver Bock committed
141
    m_quadricEarth = gluNewQuadric();
Oliver Bock's avatar
Oliver Bock committed
142
143
    m_quadricLLOh = gluNewQuadric();
    m_quadricLLOv = gluNewQuadric();
Oliver Bock's avatar
Oliver Bock committed
144
145
146
    m_quadricSourcePlane = gluNewQuadric();
    m_quadricSourcePlaneNormal = gluNewQuadric();
    m_quadricSourcePlaneNormalCap = gluNewQuadric();
147
    m_quadricSourcePlaneNormalCenter = gluNewQuadric();
148
149
    m_quadricLHOv = gluNewQuadric();
    m_quadricLHOh = gluNewQuadric();
150

Oliver Bock's avatar
Oliver Bock committed
151
152
    gluQuadricNormals(m_quadricVirgoh, GLU_SMOOTH);
    gluQuadricNormals(m_quadricVirgov, GLU_SMOOTH);
Oliver Bock's avatar
Oliver Bock committed
153
    gluQuadricNormals(m_quadricEarth, GLU_SMOOTH);
Oliver Bock's avatar
Oliver Bock committed
154
155
    gluQuadricNormals(m_quadricLLOh, GLU_SMOOTH);
    gluQuadricNormals(m_quadricLLOv, GLU_SMOOTH);
Oliver Bock's avatar
Oliver Bock committed
156
157
158
    gluQuadricNormals(m_quadricSourcePlane, GLU_SMOOTH);
    gluQuadricNormals(m_quadricSourcePlaneNormal, GLU_SMOOTH);
    gluQuadricNormals(m_quadricSourcePlaneNormalCap, GLU_SMOOTH);
159
    gluQuadricNormals(m_quadricSourcePlaneNormalCenter, GLU_SMOOTH);
160
161
    gluQuadricNormals(m_quadricLHOv, GLU_SMOOTH);
    gluQuadricNormals(m_quadricLHOh, GLU_SMOOTH);
162

Oliver Bock's avatar
Oliver Bock committed
163
164
165
166
    // query max texture size (estimate)
    GLint maxTextureSize;
    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);

167
    // prepare and check beam texture
168
    QImage beamTexture(":/textures/resources/World-Map-7.jpg");
169

Oliver Bock's avatar
Oliver Bock committed
170
    // bind textures
171
    m_beamTexture = bindTexture(beamTexture, GL_TEXTURE_2D, GL_RGBA);
172

173
    // use mipmapped textures
174
175
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
Oliver Bock's avatar
Oliver Bock committed
176
177
178
179
}

void PulsarAnimationWidget::resizeGL(int w, int h)
{
180
    glViewport(0, 0, w, h);
Oliver Bock's avatar
Oliver Bock committed
181

182
183
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
Oliver Bock's avatar
Oliver Bock committed
184

185
    gluPerspective(4.5, (GLfloat)w / (GLfloat)h, 0.1, 5000.0);
Oliver Bock's avatar
Oliver Bock committed
186

187
188
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
Oliver Bock's avatar
Oliver Bock committed
189
190
191
192
}

void PulsarAnimationWidget::paintGL()
{
193
194
    GLfloat x,y,angle;

195
196
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

197
198
    // TODO: should be located elsewhere
    static GLfloat no_mat[] = {0.0, 0.0, 0.0, 1.0};
199
    static GLfloat mat_diffuse[] = {0.0, 0.0, 0.5, 1.0};
200
201
202
203
204
205
206
207
208
209
    static GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
    static GLfloat low_shininess[] = {2.5};
    static GLfloat translucent[] = {1.0, 1.0, 1.0, 0.33};

    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

210
211
212
213
214
215
216
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    gluLookAt(m_cameraPosX, m_cameraPosY, m_cameraPosZ,
              0.0, 0.0, 0.0,
              0.0, 1.0, 0.0);

217
218
219
220
221
222
223
224
225
226
227
228
    // save current state (the following is using parallel projection)
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    {
        glLoadIdentity();
        glOrtho(0, width(), 0, height(), 0.1, 501.0);
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        {
            glLoadIdentity();

            // draw backdrop (independent parallel projection)
229
            glColor3f(1.0, 1.0, 1.0f);
230
231
232
233
234
235
236
237
238
239
            glTranslatef(0.0, 0.0, -501.0);

            // restore original state
            glMatrixMode(GL_PROJECTION);
        }
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
    }
    glPopMatrix();

Oliver Bock's avatar
Oliver Bock committed
240
    // draw earth
241
    glPushMatrix();
242
    {
243
        glRotatef(90, 0.0, 1.0, 0.0);
244
        glPushMatrix();
245
246
        {
            glRotatef(90, 1.0, 0.0, 0.0);
247
248
249
            glRotatef(180, 1.0, 1.0, 0.0);

            // create texture coordinates and enable texturing
Oliver Bock's avatar
Oliver Bock committed
250
            gluQuadricTexture(m_quadricEarth, GL_TRUE);
251
252
            glBindTexture(GL_TEXTURE_2D, m_beamTexture);
            glEnable(GL_TEXTURE_2D);
253

Oliver Bock's avatar
Oliver Bock committed
254
            gluSphere(m_quadricEarth, m_earthRadius, 32, 32);
255
256
        }
        glPopMatrix();
257
258
    }
    glPopMatrix();
259

260
261
262
263
264
    // draw LHO
    glPushMatrix();
    {
        glColor3f(1.0f, 1.0f, 1.0f);

265
266
267
        glRotatef(-48.455144, 0.0, 0.0, 1.0);
        glRotatef(-110.407656, 0.0, 1.0, 0.0);

Oliver Bock's avatar
Oliver Bock committed
268
        glTranslatef(0.0, 0.0, m_earthRadius);
269

270
        glRotatef(m_LHOAngle+180, 0.0, 0.0, 1.0);
271
272
273
        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
274
            gluCylinder(m_quadricLHOh, 0.020, 0.020, 0.40, 32, 1);
275
276
277
278
279
280
281
        }
        glPopMatrix();

        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
            glRotatef(90, 1.0, 0.0, 0.0);
282
283
            glColor3f(0.0f, 0.0f, 1.0f);
            gluCylinder(m_quadricLHOv, 0.020, 0.020, 0.40, 32, 1);
284
285
286
287
288
        }
        glPopMatrix();
    }
    glPopMatrix();

Oliver Bock's avatar
Oliver Bock committed
289
290
291
292
293
    // draw LLO
    glPushMatrix();
    {
        glColor3f(1.0f, 1.0f, 1.0f);

294
295
296
        glRotatef(-30.562894, 0.0, 0.0, 1.0);
        glRotatef(-90.774242, 0.0, 1.0, 0.0);

Oliver Bock's avatar
Oliver Bock committed
297
        glTranslatef(0.0, 0.0, m_earthRadius);
298

299
        glRotatef(m_LLOAngle-90, 0.0, 0.0, 1.0);
Oliver Bock's avatar
Oliver Bock committed
300
301
302
        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
303
            gluCylinder(m_quadricLLOh, 0.020, 0.020, 0.40, 32, 1);
Oliver Bock's avatar
Oliver Bock committed
304
305
306
307
308
309
310
        }
        glPopMatrix();

        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
            glRotatef(90, 1.0, 0.0, 0.0);
311
312
            glColor3f(1.0f, 0.0f, 0.0f);
            gluCylinder(m_quadricLLOv, 0.020, 0.020, 0.40, 32, 1);
Oliver Bock's avatar
Oliver Bock committed
313
314
315
316
317
        }
        glPopMatrix();
    }
    glPopMatrix();

Oliver Bock's avatar
Oliver Bock committed
318
319
320
321
322
    // draw Virgo
    glPushMatrix();
    {
        glColor3f(1.0f, 1.0f, 1.0f);

323
324
325
        glRotatef(-45.6305, 1.0, 0.0, 0.0);
        glRotatef(7.5021, 0.0, 1.0, 0.0);

Oliver Bock's avatar
Oliver Bock committed
326
        glTranslatef(0.0, 0.0, m_earthRadius);
327

328
        glRotatef(m_VirgoAngle+165, 0.0, 0.0, 1.0);
Oliver Bock's avatar
Oliver Bock committed
329
330
331
        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
332
            gluCylinder(m_quadricVirgoh, 0.020, 0.020, 0.40, 32, 1);
Oliver Bock's avatar
Oliver Bock committed
333
334
335
336
337
338
339
        }
        glPopMatrix();

        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
            glRotatef(90, 1.0, 0.0, 0.0);
340
341
            glColor3f(0.0f, 1.0f, 0.0f);
            gluCylinder(m_quadricVirgov, 0.020, 0.020, 0.40, 32, 1);
Oliver Bock's avatar
Oliver Bock committed
342
343
344
345
346
        }
        glPopMatrix();
    }
    glPopMatrix();

347
    // draw source
348
    glPushMatrix();
349
    {
350
351
        glRotatef(-31.384, 0.0, 0.0, 1.0);
        glRotatef(45.093, 0.0, 1.0, 0.0);
352

Oliver Bock's avatar
Oliver Bock committed
353
        glTranslatef(0.0, 0.0, m_earthRadius + 2.0);
354

355
        glRotatef(m_sourceInclination, 0.0, 1.0, 0.0);
356
        glRotatef(180, 0.0, 1.0, 0.0);
357
358

        glPushMatrix();
359
        {
Oliver Bock's avatar
Oliver Bock committed
360
            glRotatef(m_sourceIota, 1.0, 0.0, 0.0);
361

Oliver Bock's avatar
Oliver Bock committed
362
363
364
365
            // draw source plane normal
            glColor3f(1.0f, 0.0f, 0.0f);
            glPushMatrix();
            {
366
                glTranslatef(0.0, 0.0, -1.0);
Oliver Bock's avatar
Oliver Bock committed
367
                gluCylinder(m_quadricSourcePlaneNormal, 0.020, 0.020, 1.5, 32, 1);
Oliver Bock's avatar
Oliver Bock committed
368
369
370
371
            }
            glPopMatrix();
            glPushMatrix();
            {
372
                glTranslatef(0.0, 0.0, -1.0);
Oliver Bock's avatar
Oliver Bock committed
373
                gluDisk(m_quadricSourcePlaneNormalCap, 0, 0.020, 32, 8);
Oliver Bock's avatar
Oliver Bock committed
374
375
376
377
            }
            glPopMatrix();
            glPushMatrix();
            {
378
                glTranslatef(0.0, 0.0, 0.5f);
Oliver Bock's avatar
Oliver Bock committed
379
                glBegin(GL_TRIANGLE_FAN);
Oliver Bock's avatar
Oliver Bock committed
380
                {
Oliver Bock's avatar
Oliver Bock committed
381
382
                    // Pinnacle of cone is shared vertex for fan, moved up z-axis
                    // to produce a cone instead of a circle
383
                    glVertex3f(0.0f, 0.0f, 0.5f);
Oliver Bock's avatar
Oliver Bock committed
384
385
386
387

                    // Loop around in a circle and specify even points along the circle
                    // as the vertices of the triangle fan (32 sections)
                    for(angle = 0.0f; angle < (2.0f*PI); angle += (PI/32.0f))
Oliver Bock's avatar
Oliver Bock committed
388
                    {
Oliver Bock's avatar
Oliver Bock committed
389
                        // Calculate x and y position of the next vertex
390
391
                        x = 0.1f * sin(angle);
                        y = 0.1f * cos(angle);
Oliver Bock's avatar
Oliver Bock committed
392
393
394

                        // Specify the next vertex for the triangle fan
                        glVertex2f(x, y);
Oliver Bock's avatar
Oliver Bock committed
395
396
                    }
                }
Oliver Bock's avatar
Oliver Bock committed
397
                glEnd();
398
            }
Oliver Bock's avatar
Oliver Bock committed
399
            glPopMatrix();
400
401
402
403
404
405
            glColor3f(1.0f, 1.0f, 1.0f);
            glPushMatrix();
            {
                gluSphere(m_quadricSourcePlaneNormalCenter, 0.040, 32, 32);
            }
            glPopMatrix();
406

407
408
            // draw disc
            glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, translucent);
409
410
            glEnable(GL_LIGHTING);

411
            glPushMatrix();
412
            {
Oliver Bock's avatar
Oliver Bock committed
413
                gluDisk(m_quadricSourcePlane,
414
                        0,
415
                        1.0,
416
                        64, 1);
417
418
419
            }
            glPopMatrix();

420
            glDisable(GL_LIGHTING);
421
        }
422
423
        glPopMatrix();
    }
424
    glPopMatrix();
Oliver Bock's avatar
Oliver Bock committed
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443

    // save current state (the following is using parallel projection)
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    {
        glLoadIdentity();
        glOrtho(0, width(), 0, height(), 0.1, 501.0);
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        {
            glLoadIdentity();

            // draw copyright info last (appears in front of everything)
            glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
            QFont font;
            font.setPointSize(11);
            font.setBold(true);
            font.setFamily("Arial");
            font.setStyleStrategy((QFont::StyleStrategy) (QFont::OpenGLCompatible | QFont::PreferQuality));
Oliver Bock's avatar
Oliver Bock committed
444
            renderText(10, 25, -100, QString("Copyright %1 2017").arg(QChar(0x00A9)), font);
445
            renderText(10, 10, -100, tr("Max Planck Institute for Gravitational Physics"), font);
Oliver Bock's avatar
Oliver Bock committed
446
447
448
449
450
451
452
453

            // restore original state
            glMatrixMode(GL_PROJECTION);
        }
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
    }
    glPopMatrix();
Oliver Bock's avatar
Oliver Bock committed
454
455
}

456
457
void PulsarAnimationWidget::mousePressEvent(QMouseEvent *event)
{
458
    Q_UNUSED(event);
459

460
461
    m_cameraInteraction = true;
    updateGL();
462
463
}

464
465
void PulsarAnimationWidget::mouseMoveEvent(QMouseEvent *event)
{
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
    Qt::MouseButtons buttons = event->buttons();
    if((buttons & Qt::LeftButton) == Qt::LeftButton) {
        if(m_mouseLastX != 0) {
            m_mouseAngleH += (m_mouseLastX - event->x());
            m_mouseAngleH = m_mouseAngleH < 360 ? m_mouseAngleH : 0;
            m_mouseAngleH = m_mouseAngleH >=  0 ? m_mouseAngleH : 359;
        }
        if(m_mouseLastY != 0) {
            m_mouseAngleV -= (m_mouseLastY - event->y());
            m_mouseAngleV = m_mouseAngleV <  90 ? m_mouseAngleV : 90;
            m_mouseAngleV = m_mouseAngleV > -90 ? m_mouseAngleV : -90;
        }

        m_mouseLastX = event->x();
        m_mouseLastY = event->y();
    }
    else if((buttons & Qt::RightButton) == Qt::RightButton) {
        if(m_mouseLastY != 0) {
            m_cameraZoom -= (m_mouseLastY - event->y());
            m_cameraZoom = m_cameraZoom >= m_cameraZoomLBound ? m_cameraZoom : m_cameraZoomLBound;
            m_cameraZoom = m_cameraZoom >= m_cameraZoomUBound ? m_cameraZoomUBound : m_cameraZoom;
        }

        m_mouseLastY = event->y();
    }

    updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom);
493
494
495
496
}

void PulsarAnimationWidget::mouseReleaseEvent(QMouseEvent *event)
{
497
    Q_UNUSED(event);
498

499
500
501
    m_mouseLastX = 0;
    m_mouseLastY = 0;
    m_cameraInteraction = false;
502

503
    updateGL();
504
505
}

Oliver Bock's avatar
Oliver Bock committed
506
507
void PulsarAnimationWidget::showEvent(QShowEvent *event)
{
508
    Q_UNUSED(event);
Oliver Bock's avatar
Oliver Bock committed
509

510
511
    // update and propagate pulse profile
    updatePulseProfile();
Oliver Bock's avatar
Oliver Bock committed
512
513
}

Oliver Bock's avatar
Oliver Bock committed
514
void PulsarAnimationWidget::updateCameraPosition(const double angleH, const double angleV, const double zoom)
515
{
516
517
518
    m_cameraPosX = sin(angleH * deg2rad) * cos(angleV * deg2rad) * zoom;
    m_cameraPosY = sin(angleV * deg2rad) * zoom;
    m_cameraPosZ = cos(angleH * deg2rad) * cos(angleV * deg2rad) * zoom;
519

520
    updateGL();
521
522
}

523
void PulsarAnimationWidget::setSourceInclination(const double degrees)
Oliver Bock's avatar
Oliver Bock committed
524
{
525
    m_sourceInclination = degrees;
526
    updatePulseProfile();
Oliver Bock's avatar
Oliver Bock committed
527

528
    updateGL();
Oliver Bock's avatar
Oliver Bock committed
529
}
530

Oliver Bock's avatar
Oliver Bock committed
531
void PulsarAnimationWidget::setLHOAngle(const double degrees)
532
{
533
    m_LHOAngle = degrees;
534
    updatePulseProfile();
Oliver Bock's avatar
Oliver Bock committed
535

536
    updateGL();
537
538
}

539
void PulsarAnimationWidget::setLLOAngle(const double degrees)
540
{
541
    m_LLOAngle = degrees;
542
    updatePulseProfile();
Oliver Bock's avatar
Oliver Bock committed
543
544

    updateGL();
Oliver Bock's avatar
Oliver Bock committed
545
546
}

547
void PulsarAnimationWidget::setVirgoAngle(const int degrees)
Oliver Bock's avatar
Oliver Bock committed
548
{
549
    m_VirgoAngle = degrees;
550
    updatePulseProfile();
551

552
    updateGL();
553
554
}

Oliver Bock's avatar
Oliver Bock committed
555
void PulsarAnimationWidget::setSourceIota(const int degrees)
556
{
Oliver Bock's avatar
Oliver Bock committed
557
    m_sourceIota = degrees;
558
    updatePulseProfile();
559

560
    updateGL();
561
}
562

563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
void PulsarAnimationWidget::getCameraPosition(double& cameraAngleH, double& cameraAngleV, double& cameraZoom)
{
    cameraAngleH = m_mouseAngleH;
    cameraAngleV = m_mouseAngleV;
    cameraZoom = m_cameraZoom;
}

void PulsarAnimationWidget::resetCameraPosition(const double angleH, const double angleV, const double zoom)
{
    m_mouseAngleH = angleH;
    m_mouseAngleV = angleV;
    m_cameraZoom = zoom;

    updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom);
}

579
580
void PulsarAnimationWidget::updatePulseProfile()
{
581
582
583
584
585
586
587
588
589
    struct InputStruct in;
    struct OutputStruct out;

    in.iota = m_sourceIota;
    in.psi = m_sourceInclination;
    in.orientation[0] = m_LLOAngle;
    in.orientation[1] = m_LHOAngle;
    in.orientation[2] = m_VirgoAngle;

Oliver Bock's avatar
Oliver Bock committed
590
    // get actual detector data
591
592
    get_antenna(&out, &in);

Oliver Bock's avatar
Oliver Bock committed
593
    // populate plot data object
594
    for(int x = 0; x < 360*PERIODS; ++x) {
595
596
597
        m_plotData.m_dataLLO[x]   = out.amp[0] * sin((x+out.phase[0]) * deg2rad);// + out.dt[0];
        m_plotData.m_dataLHO[x]   = out.amp[1] * sin((x+out.phase[1]) * deg2rad);// + out.dt[1];
        m_plotData.m_dataVirgo[x] = out.amp[2] * sin((x+out.phase[2]) * deg2rad);// + out.dt[2];
598
599
    }

Oliver Bock's avatar
Oliver Bock committed
600
601
602
603
604
605
606
607
608
609
610
611
612
    m_plotData.m_ampLLO   = out.amp[0];
    m_plotData.m_ampLHO   = out.amp[1];
    m_plotData.m_ampVirgo = out.amp[2];

    m_plotData.m_phiLLO   = out.phase[0];
    m_plotData.m_phiLHO   = out.phase[1];
    m_plotData.m_phiVirgo = out.phase[2];

    m_plotData.m_dtLLO   = out.dt[0];
    m_plotData.m_dtLHO   = out.dt[1];
    m_plotData.m_dtVirgo = out.dt[2];

    // propagate new plot data
613
    emit pulseProfileUpdated(m_plotData);
614
}