pulsaranimationwidget.cpp 18.5 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
61
    m_quadricLHOv = NULL;
    m_quadricLHOh = NULL;
62
63

    // initialize texture pointers
64
    m_beamTexture = 0;
65

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

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

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

    // initial view settings
79
80
    m_mouseAngleH = -55.0;
    m_mouseAngleV = 20.0;
81
    m_cameraZoom = 100.0;
82
83
84
85
86
87
88
    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
89
90
91
92
}

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

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

void PulsarAnimationWidget::initializeGL()
{
109
110
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
    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
137
138
    m_quadricVirgoh = gluNewQuadric();
    m_quadricVirgov = gluNewQuadric();
Oliver Bock's avatar
Oliver Bock committed
139
    m_quadricEarth = gluNewQuadric();
Oliver Bock's avatar
Oliver Bock committed
140
141
    m_quadricLLOh = gluNewQuadric();
    m_quadricLLOv = gluNewQuadric();
Oliver Bock's avatar
Oliver Bock committed
142
143
144
    m_quadricSourcePlane = gluNewQuadric();
    m_quadricSourcePlaneNormal = gluNewQuadric();
    m_quadricSourcePlaneNormalCap = gluNewQuadric();
145
146
    m_quadricLHOv = gluNewQuadric();
    m_quadricLHOh = gluNewQuadric();
147

Oliver Bock's avatar
Oliver Bock committed
148
149
    gluQuadricNormals(m_quadricVirgoh, GLU_SMOOTH);
    gluQuadricNormals(m_quadricVirgov, GLU_SMOOTH);
Oliver Bock's avatar
Oliver Bock committed
150
    gluQuadricNormals(m_quadricEarth, GLU_SMOOTH);
Oliver Bock's avatar
Oliver Bock committed
151
152
    gluQuadricNormals(m_quadricLLOh, GLU_SMOOTH);
    gluQuadricNormals(m_quadricLLOv, GLU_SMOOTH);
Oliver Bock's avatar
Oliver Bock committed
153
154
155
    gluQuadricNormals(m_quadricSourcePlane, GLU_SMOOTH);
    gluQuadricNormals(m_quadricSourcePlaneNormal, GLU_SMOOTH);
    gluQuadricNormals(m_quadricSourcePlaneNormalCap, GLU_SMOOTH);
156
157
    gluQuadricNormals(m_quadricLHOv, GLU_SMOOTH);
    gluQuadricNormals(m_quadricLHOh, GLU_SMOOTH);
158

Oliver Bock's avatar
Oliver Bock committed
159
160
161
162
    // query max texture size (estimate)
    GLint maxTextureSize;
    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);

163
    // prepare and check beam texture
164
    QImage beamTexture(":/textures/resources/World-Map-7.jpg");
165

Oliver Bock's avatar
Oliver Bock committed
166
    // bind textures
167
    m_beamTexture = bindTexture(beamTexture, GL_TEXTURE_2D, GL_RGBA);
168

169
    // use mipmapped textures
170
171
    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
172
173
174
175
}

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

178
179
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
Oliver Bock's avatar
Oliver Bock committed
180

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

183
184
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
Oliver Bock's avatar
Oliver Bock committed
185
186
187
188
}

void PulsarAnimationWidget::paintGL()
{
189
190
    GLfloat x,y,angle;

191
192
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

193
194
    // TODO: should be located elsewhere
    static GLfloat no_mat[] = {0.0, 0.0, 0.0, 1.0};
195
    static GLfloat mat_diffuse[] = {0.0, 0.0, 0.5, 1.0};
196
197
198
199
200
201
202
203
204
205
    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);

206
207
208
209
210
211
212
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

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

213
214
215
216
217
218
219
220
221
222
223
224
    // 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)
225
            glColor3f(1.0, 1.0, 1.0f);
226
227
228
229
230
231
232
233
234
235
            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
236
    // draw earth
237
    glPushMatrix();
238
    {
239
        glRotatef(90, 0.0, 1.0, 0.0);
240
        glPushMatrix();
241
242
        {
            glRotatef(90, 1.0, 0.0, 0.0);
243
244
245
            glRotatef(180, 1.0, 1.0, 0.0);

            // create texture coordinates and enable texturing
Oliver Bock's avatar
Oliver Bock committed
246
            gluQuadricTexture(m_quadricEarth, GL_TRUE);
247
248
            glBindTexture(GL_TEXTURE_2D, m_beamTexture);
            glEnable(GL_TEXTURE_2D);
249

Oliver Bock's avatar
Oliver Bock committed
250
            gluSphere(m_quadricEarth, m_earthRadius, 32, 32);
251
252
        }
        glPopMatrix();
253
254
    }
    glPopMatrix();
255

256
257
258
259
260
    // draw LHO
    glPushMatrix();
    {
        glColor3f(1.0f, 1.0f, 1.0f);

261
262
263
        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
264
        glTranslatef(0.0, 0.0, m_earthRadius);
265

266
        glRotatef(m_LHOAngle+180, 0.0, 0.0, 1.0);
267
268
269
        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
270
            gluCylinder(m_quadricLHOh, 0.020, 0.020, 0.40, 32, 1);
271
272
273
274
275
276
277
        }
        glPopMatrix();

        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
            glRotatef(90, 1.0, 0.0, 0.0);
278
279
            glColor3f(0.0f, 0.0f, 1.0f);
            gluCylinder(m_quadricLHOv, 0.020, 0.020, 0.40, 32, 1);
280
281
282
283
284
        }
        glPopMatrix();
    }
    glPopMatrix();

Oliver Bock's avatar
Oliver Bock committed
285
286
287
288
289
    // draw LLO
    glPushMatrix();
    {
        glColor3f(1.0f, 1.0f, 1.0f);

290
291
292
        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
293
        glTranslatef(0.0, 0.0, m_earthRadius);
294

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

        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
            glRotatef(90, 1.0, 0.0, 0.0);
307
308
            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
309
310
311
312
313
        }
        glPopMatrix();
    }
    glPopMatrix();

Oliver Bock's avatar
Oliver Bock committed
314
315
316
317
318
    // draw Virgo
    glPushMatrix();
    {
        glColor3f(1.0f, 1.0f, 1.0f);

319
320
321
        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
322
        glTranslatef(0.0, 0.0, m_earthRadius);
323

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

        glPushMatrix();
        {
            glRotatef(90, 0.0, 1.0, 0.0);
            glRotatef(90, 1.0, 0.0, 0.0);
336
337
            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
338
339
340
341
342
        }
        glPopMatrix();
    }
    glPopMatrix();

343
    // draw source
344
    glPushMatrix();
345
    {
346
347
        glRotatef(-31.384, 0.0, 0.0, 1.0);
        glRotatef(45.093, 0.0, 1.0, 0.0);
348

Oliver Bock's avatar
Oliver Bock committed
349
        glTranslatef(0.0, 0.0, m_earthRadius + 2.0);
350

351
        glRotatef(m_sourceInclination, 0.0, 1.0, 0.0);
352
        glRotatef(180, 0.0, 1.0, 0.0);
353
354

        glPushMatrix();
355
        {
Oliver Bock's avatar
Oliver Bock committed
356
            glRotatef(m_sourceIota, 1.0, 0.0, 0.0);
357

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

                    // 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
384
                    {
Oliver Bock's avatar
Oliver Bock committed
385
                        // Calculate x and y position of the next vertex
386
387
                        x = 0.1f * sin(angle);
                        y = 0.1f * cos(angle);
Oliver Bock's avatar
Oliver Bock committed
388
389
390

                        // Specify the next vertex for the triangle fan
                        glVertex2f(x, y);
Oliver Bock's avatar
Oliver Bock committed
391
392
                    }
                }
Oliver Bock's avatar
Oliver Bock committed
393
                glEnd();
394
            }
Oliver Bock's avatar
Oliver Bock committed
395
            glPopMatrix();
396

397
398
            // draw disc
            glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, translucent);
399
400
            glEnable(GL_LIGHTING);

401
            glPushMatrix();
402
            {
Oliver Bock's avatar
Oliver Bock committed
403
                gluDisk(m_quadricSourcePlane,
404
                        0,
405
                        1.0,
406
                        64, 1);
407
408
409
            }
            glPopMatrix();

410
            glDisable(GL_LIGHTING);
411
        }
412
413
        glPopMatrix();
    }
414
    glPopMatrix();
Oliver Bock's avatar
Oliver Bock committed
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433

    // 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
434
            renderText(10, 25, -100, QString("Copyright %1 2017").arg(QChar(0x00A9)), font);
435
            renderText(10, 10, -100, tr("Max Planck Institute for Gravitational Physics"), font);
Oliver Bock's avatar
Oliver Bock committed
436
437
438
439
440
441
442
443

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

446
447
void PulsarAnimationWidget::mousePressEvent(QMouseEvent *event)
{
448
    Q_UNUSED(event);
449

450
451
    m_cameraInteraction = true;
    updateGL();
452
453
}

454
455
void PulsarAnimationWidget::mouseMoveEvent(QMouseEvent *event)
{
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
    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);
483
484
485
486
}

void PulsarAnimationWidget::mouseReleaseEvent(QMouseEvent *event)
{
487
    Q_UNUSED(event);
488

489
490
491
    m_mouseLastX = 0;
    m_mouseLastY = 0;
    m_cameraInteraction = false;
492

493
    updateGL();
494
495
}

Oliver Bock's avatar
Oliver Bock committed
496
497
void PulsarAnimationWidget::showEvent(QShowEvent *event)
{
498
    Q_UNUSED(event);
Oliver Bock's avatar
Oliver Bock committed
499

500
501
    // update and propagate pulse profile
    updatePulseProfile();
Oliver Bock's avatar
Oliver Bock committed
502
503
}

Oliver Bock's avatar
Oliver Bock committed
504
void PulsarAnimationWidget::updateCameraPosition(const double angleH, const double angleV, const double zoom)
505
{
506
507
508
    m_cameraPosX = sin(angleH * deg2rad) * cos(angleV * deg2rad) * zoom;
    m_cameraPosY = sin(angleV * deg2rad) * zoom;
    m_cameraPosZ = cos(angleH * deg2rad) * cos(angleV * deg2rad) * zoom;
509

510
    updateGL();
511
512
}

513
void PulsarAnimationWidget::setSourceInclination(const double degrees)
Oliver Bock's avatar
Oliver Bock committed
514
{
515
    m_sourceInclination = degrees;
516
    updatePulseProfile();
Oliver Bock's avatar
Oliver Bock committed
517

518
    updateGL();
Oliver Bock's avatar
Oliver Bock committed
519
}
520

Oliver Bock's avatar
Oliver Bock committed
521
void PulsarAnimationWidget::setLHOAngle(const double degrees)
522
{
523
    m_LHOAngle = degrees;
524
    updatePulseProfile();
Oliver Bock's avatar
Oliver Bock committed
525

526
    updateGL();
527
528
}

529
void PulsarAnimationWidget::setLLOAngle(const double degrees)
530
{
531
    m_LLOAngle = degrees;
532
    updatePulseProfile();
Oliver Bock's avatar
Oliver Bock committed
533
534

    updateGL();
Oliver Bock's avatar
Oliver Bock committed
535
536
}

537
void PulsarAnimationWidget::setVirgoAngle(const int degrees)
Oliver Bock's avatar
Oliver Bock committed
538
{
539
    m_VirgoAngle = degrees;
540
    updatePulseProfile();
541

542
    updateGL();
543
544
}

Oliver Bock's avatar
Oliver Bock committed
545
void PulsarAnimationWidget::setSourceIota(const int degrees)
546
{
Oliver Bock's avatar
Oliver Bock committed
547
    m_sourceIota = degrees;
548
    updatePulseProfile();
549

550
    updateGL();
551
}
552

553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
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);
}

569
570
void PulsarAnimationWidget::updatePulseProfile()
{
571
572
573
574
575
576
577
578
579
    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
580
    // get actual detector data
581
582
    get_antenna(&out, &in);

Oliver Bock's avatar
Oliver Bock committed
583
    // populate plot data object
584
    for(int x = 0; x < 360*PERIODS; ++x) {
585
586
587
        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];
588
589
    }

Oliver Bock's avatar
Oliver Bock committed
590
591
592
593
594
595
596
597
598
599
600
601
602
    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
603
    emit pulseProfileUpdated(m_plotData);
604
}