diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp index 3b07b6326bc27f7f593bf96e4c38a0cc6d6328f7..1e7481899993e8fb9e8d7d5e6af7504fe6fbee15 100644 --- a/src/pulsaranimationwidget.cpp +++ b/src/pulsaranimationwidget.cpp @@ -311,15 +311,15 @@ void PulsarAnimationWidget::paintGL() } glPopMatrix(); - // enable wireframe mode - glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); + // back to solid rendering + glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - // draw pulsar + // draw source glPushMatrix(); { - glTranslatef(sin(m_orbitRotationAngle * deg2rad) * m_pulsarSemiMajorAxis, - 0.0, - cos(m_orbitRotationAngle * deg2rad) * m_pulsarSemiMajorAxis); + glTranslatef(3.0, + 3.0, + 0.0); glPushMatrix(); { @@ -349,189 +349,26 @@ void PulsarAnimationWidget::paintGL() gluDisk(m_quadricPulsarSpinAxisTop2, 0, 0.020, 32, 8); } glPopMatrix(); - glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); } - // draw sphere, with proper lighting + // draw disc + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, translucent); glEnable(GL_LIGHTING); - glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); - glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); - gluSphere(m_quadricPulsar, m_pulsarRadius, 32, 32); - glDisable(GL_LIGHTING); - } - glPopMatrix(); - - // first cone - glPushMatrix(); - { - glRotatef(90.0, 1.0, 0.0, 0.0); - glRotatef(m_pulsarSpinAxisInclination, 0.0, 1.0, 0.0); - - glRotatef(-m_pulsarRotationAngle - 90.0, 0.0, 0.0, 1.0); - glRotatef(-m_pulsarMagneticAxisInclination, 1.0, 0.0, 0.0); - - // draw magnetic axis (for both cones) - if(m_showRotationAxes) { - glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - glColor3f(1.0f, 1.0f, 0.0f); - glPushMatrix(); - { - glTranslatef(0.0, 0.0, -4.5); - gluCylinder(m_quadricPulsarMagneticAxis, 0.020, 0.020, 9.0, 32, 1); - } - glPopMatrix(); - glPushMatrix(); - { - glTranslatef(0.0, 0.0, -4.5); - gluDisk(m_quadricPulsarSpinAxisTop1, 0, 0.020, 32, 8); - } - glPopMatrix(); - glPushMatrix(); - { - glTranslatef(0.0, 0.0, 4.5); - gluDisk(m_quadricPulsarSpinAxisTop2, 0, 0.020, 32, 8); - } - glPopMatrix(); - glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - } - - glTranslatef(0.0, 0.0, -(m_pulsarBeamLength + m_pulsarRadius + 0.1)); - - // draw first cone's outer layer - glBegin(GL_TRIANGLE_FAN); - { - // Pinnacle of cone is shared vertex for fan, moved up z-axis - // to produce a cone instead of a circle - glColor4f(1.0f, 1.0f, 0.0f, 0.33f); - glVertex3f(0.0f, 0.0f, m_pulsarBeamLength); - - // 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)) - { - // Calculate x and y position of the next vertex - x = m_pulsarBeamOuterRadius * sin(angle); - y = m_pulsarBeamOuterRadius * cos(angle); - - // Specify the next vertex for the triangle fan - glVertex2f(x, y); - } - } - glEnd(); - - // draw first cone's "base" (textured bottom to visualize beam intensity) - glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - - // create texture coordinates and enable texturing - gluQuadricTexture(m_quadricPulsarCone1Shell, GL_TRUE); - glBindTexture(GL_TEXTURE_2D, m_beamTexture); - glEnable(GL_TEXTURE_2D); - gluDisk(m_quadricPulsarCone1Shell, 0, m_pulsarBeamOuterRadius, 32, 1); - - // disable texturing - glDisable(GL_TEXTURE_2D); - - glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); - } - glPopMatrix(); - - // second cone (pointing towards from camera) - glPushMatrix(); - { - glRotatef(-90.0, 1.0, 0.0, 0.0); - glRotatef(-m_pulsarSpinAxisInclination, 0.0, 1.0, 0.0); - - glRotatef(m_pulsarRotationAngle - 90.0, 0.0, 0.0, 1.0); - glRotatef(m_pulsarMagneticAxisInclination, 1.0, 0.0, 0.0); - - glTranslatef(0.0, 0.0, -(m_pulsarBeamLength + m_pulsarRadius + 0.1)); - - // draw second cone's outer layer - glBegin(GL_TRIANGLE_FAN); - { - // Pinnacle of cone is shared vertex for fan, moved up z-axis - // to produce a cone instead of a circle - glColor4f(1.0f, 1.0f, 0.0f, 0.33f); - glVertex3f(0.0f, 0.0f, m_pulsarBeamLength); - - // 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)) - { - // Calculate x and y position of the next vertex - x = m_pulsarBeamOuterRadius * sin(angle); - y = m_pulsarBeamOuterRadius * cos(angle); - - // Specify the next vertex for the triangle fan - glVertex2f(x, y); - } - } - glEnd(); - - // draw second cone's "base" (textured bottom to visualize beam intensity) - glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - - // create texture coordinates and enable texturing - gluQuadricTexture(m_quadricPulsarCone2Shell, GL_TRUE); - glBindTexture(GL_TEXTURE_2D, m_beamTexture); - glEnable(GL_TEXTURE_2D); - - gluDisk(m_quadricPulsarCone2Shell, 0, m_pulsarBeamOuterRadius, 32, 1); - - // disable texturing - glDisable(GL_TEXTURE_2D); - } - glPopMatrix(); - } - glPopMatrix(); - - // back to solid rendering - glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); - - // draw orbital planes - if(m_cameraInteraction || m_showOrbits) { - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, translucent); - glEnable(GL_LIGHTING); - - static double sizeOffset = 0.25; - - // companion's plane (only if not identical with pulsar's) - if(m_companionSemiMajorAxis != m_pulsarSemiMajorAxis) { glPushMatrix(); { - glRotatef(90.0, 1.0, 0.0, 0.0); - - // separate them slightly in case of overlap - // based on ugly mass diff check (no collision detection) - // single known problematic pair: (m_c=1.4, m_p=1.5) - if((int)(10*(m_pulsarMass-m_companionMass)+0.5) == 1){ - glTranslatef(0.0, 0.0, 0.01); - } - - gluDisk(m_quadricCompanionOrbitPlane, - m_companionSemiMajorAxis - sizeOffset, - m_companionSemiMajorAxis + sizeOffset, + gluDisk(m_quadricPulsarOrbitPlane, + 0, + 2, 64, 1); } glPopMatrix(); - } - // pulsar's plane - glPushMatrix(); - { - glRotatef(90.0, 1.0, 0.0, 0.0); - gluDisk(m_quadricPulsarOrbitPlane, - m_pulsarSemiMajorAxis - sizeOffset, - m_pulsarSemiMajorAxis + sizeOffset, - 64, 1); + glDisable(GL_LIGHTING); } glPopMatrix(); - - glDisable(GL_LIGHTING); } + glPopMatrix(); // save current state (the following is using parallel projection) glMatrixMode(GL_PROJECTION);