Commit d080e7b9 authored by Oliver Bock's avatar Oliver Bock

Visualize beam intensity

* Using a texture on beam cone base
* FIXME: beam's texture transparency doesn't work with background texture
* Removed inner cone
* Reduced outer beam shell's opacity to 0.33
parent 007c6dfe
......@@ -70,6 +70,7 @@ PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) :
// initialize texture pointers
m_backgroundTexture = 0;
m_beamTexture = 0;
// initial render timing settings
m_framesPerSecond = 25;
......@@ -118,6 +119,7 @@ PulsarAnimationWidget::~PulsarAnimationWidget()
if(m_quadricLineOfSightCone) gluDeleteQuadric(m_quadricLineOfSightCone);
if(m_quadricLineOfSightConeBase) gluDeleteQuadric(m_quadricLineOfSightConeBase);
if(m_backgroundTexture) deleteTexture(m_backgroundTexture);
if(m_beamTexture) deleteTexture(m_beamTexture);
}
void PulsarAnimationWidget::initializeGL()
......@@ -202,16 +204,31 @@ void PulsarAnimationWidget::initializeGL()
backgroundTexture = backgroundTexture.scaled(maxTextureSize, maxTextureSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
}
// prepare and check beam texture
QImage beamTexture(":/textures/resources/texture_beam.png");
if(beamTexture.width() != beamTexture.height()) {
qWarning() << msgShape.arg(tr("Beam"));
}
else {
double integer = 0.0;
double fraction = 0.0;
fraction = modf(log(beamTexture.width()) / log(2.0), &integer);
if(fraction > 0.0) {
qWarning() << msgPower.arg(tr("Beam"));
}
}
if(beamTexture.width() > maxTextureSize) {
qWarning() << msgSize.arg(tr("beam").arg(maxTextureSize).arg(maxTextureSize));
beamTexture = beamTexture.scaled(maxTextureSize, maxTextureSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
}
// bind textures
m_backgroundTexture = bindTexture(backgroundTexture, GL_TEXTURE_2D, GL_RGBA);
m_beamTexture = bindTexture(beamTexture, GL_TEXTURE_2D, GL_RGBA);
// use mipmapped textures
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
// enable 2D mapping (s/t coordinates, sphere map won't rotate texture!)
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
}
void PulsarAnimationWidget::resizeGL(int w, int h)
......@@ -331,14 +348,7 @@ void PulsarAnimationWidget::paintGL()
}
glPopMatrix();
// TODO: should be located elsewhere
static GLfloat coneAmbient[] = {1.0, 1.0, 0.0, 1.0};
static GLfloat coneDiffuse[] = {1.0, 1.0, 0.0, 1.0};
static GLfloat coneSpecular[] = {1.0, 1.0, 0.5, 1.0};
glMaterialfv(GL_FRONT, GL_SPECULAR, coneSpecular);
// first cone
// first cone (pointing away from camera)
glPushMatrix();
{
glRotatef(-m_pulsarSpinAxisInclination, 1.0, 0.0, 0.0);
......@@ -373,15 +383,13 @@ void PulsarAnimationWidget::paintGL()
glTranslatef(0.0, 0.0, -m_pulsarBeamLength);
glMaterialfv(GL_FRONT, GL_AMBIENT, coneAmbient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, coneDiffuse);
// 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
glColor3f(1.0f, 1.0f, 0.0f);
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
......@@ -398,26 +406,25 @@ void PulsarAnimationWidget::paintGL()
}
glEnd();
// draw first cone's inner layer (do we need/want this?)
glBegin(GL_TRIANGLE_FAN);
{
glColor3f(0.66f, 0.66f, 0.0f);
glVertex3f(0.0f, 0.0f, m_pulsarBeamLength);
for(angle = 0.0f; angle < (2.0f*PI); angle += (PI/32.0f)) {
x = m_pulsarBeamInnerRadius * sin(angle);
y = m_pulsarBeamInnerRadius * cos(angle);
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_quadricPulsarConeRim1, GL_TRUE);
glBindTexture(GL_TEXTURE_2D, m_beamTexture);
glEnable(GL_TEXTURE_2D);
gluDisk(m_quadricPulsarConeRim1, 0, m_pulsarBeamOuterRadius, 32, 1);
// draw first cone's "rim" (disk topping gap between both cones)
glColor3f(1.0f, 1.0f, 0.5f);
gluDisk(m_quadricPulsarConeRim1, m_pulsarBeamInnerRadius, m_pulsarBeamOuterRadius, 32, 8);
// disable texturing
glDisable(GL_TEXTURE_2D);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}
glPopMatrix();
// second cone
// second cone (pointing towards from camera)
glPushMatrix();
{
glRotatef(180.0, 1.0, 0.0, 0.0);
......@@ -428,15 +435,12 @@ void PulsarAnimationWidget::paintGL()
glTranslatef(0.0, 0.0, -m_pulsarBeamLength);
glMaterialfv(GL_FRONT, GL_AMBIENT, coneAmbient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, coneDiffuse);
// draw first cone's outer layer
// 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
glColor3f(1.0f, 1.0f, 0.0f);
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
......@@ -453,22 +457,21 @@ void PulsarAnimationWidget::paintGL()
}
glEnd();
// draw first cone's inner layer (do we need/want this?)
glBegin(GL_TRIANGLE_FAN);
{
glColor3f(0.66f, 0.66f, 0.0f);
glVertex3f(0.0f, 0.0f, m_pulsarBeamLength);
for(angle = 0.0f; angle < (2.0f*PI); angle += (PI/32.0f)) {
x = m_pulsarBeamInnerRadius * sin(angle);
y = m_pulsarBeamInnerRadius * cos(angle);
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_quadricPulsarConeRim2, GL_TRUE);
glBindTexture(GL_TEXTURE_2D, m_beamTexture);
glEnable(GL_TEXTURE_2D);
gluDisk(m_quadricPulsarConeRim2, 0, m_pulsarBeamOuterRadius, 32, 1);
// draw first cone's "rim" (disk topping gap between both cones)
glColor3f(1.0f, 1.0f, 0.5f);
gluDisk(m_quadricPulsarConeRim2, m_pulsarBeamInnerRadius, m_pulsarBeamOuterRadius, 32, 8);
// disable texturing
glDisable(GL_TEXTURE_2D);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}
glPopMatrix();
}
......@@ -499,7 +502,6 @@ void PulsarAnimationWidget::paintGL()
// draw backdrop (independent parallel projection)
glColor3f(1.0f, 1.0f, 1.0f);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_specular);
glTranslatef(0.0, 0.0, -501.0);
drawTexture(QPointF(0.0, 0.0), m_backgroundTexture);
......
......@@ -88,6 +88,7 @@ private:
GLUquadricObj *m_quadricLineOfSightConeBase;
GLuint m_backgroundTexture;
GLuint m_beamTexture;
int m_framesPerSecond;
......
......@@ -16,5 +16,6 @@
<qresource prefix="/textures">
<file>resources/texture_background_carina.png</file>
<file>resources/texture_pulsar.png</file>
<file>resources/texture_beam.png</file>
</qresource>
</RCC>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.09448819"
height="1052.3622047"
id="svg2"
version="1.1"
inkscape:version="0.47 r22583"
sodipodi:docname="texture_beam.svg">
<defs
id="defs4">
<linearGradient
id="linearGradient3685">
<stop
style="stop-color:#ffff00;stop-opacity:1;"
offset="0"
id="stop3687" />
<stop
style="stop-color:#ffff00;stop-opacity:0;"
offset="1"
id="stop3689" />
</linearGradient>
<linearGradient
id="linearGradient3679">
<stop
id="stop3681"
offset="0"
style="stop-color:#ffff00;stop-opacity:0;" />
<stop
style="stop-color:#ffff00;stop-opacity:0.33613446;"
offset="0.68535012"
id="stop3705" />
<stop
id="stop3703"
offset="0.85416669"
style="stop-color:#ffff00;stop-opacity:0.74901961;" />
<stop
style="stop-color:#ffff00;stop-opacity:1;"
offset="0.85416669"
id="stop3691" />
<stop
id="stop3683"
offset="1"
style="stop-color:#ffff00;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient3671">
<stop
style="stop-color:#ffff00;stop-opacity:1;"
offset="0"
id="stop3673" />
<stop
style="stop-color:#ffff00;stop-opacity:0;"
offset="1"
id="stop3675" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective10" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3679"
id="radialGradient3677"
cx="438.57144"
cy="610.93359"
fx="438.57144"
fy="610.93359"
r="187.14285"
gradientUnits="userSpaceOnUse"
spreadMethod="repeat" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.71743361"
inkscape:cx="123.94066"
inkscape:cy="470.4268"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1680"
inkscape:window-height="1002"
inkscape:window-x="1440"
inkscape:window-y="22"
inkscape:window-maximized="0" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
sodipodi:type="arc"
style="fill:url(#radialGradient3677);fill-opacity:1.0"
id="path2816"
sodipodi:cx="438.57144"
sodipodi:cy="610.93359"
sodipodi:rx="187.14285"
sodipodi:ry="187.14285"
d="m 625.71429,610.93359 a 187.14285,187.14285 0 1 1 -374.2857,0 187.14285,187.14285 0 1 1 374.2857,0 z"
transform="matrix(1.367939,0,0,1.367939,-217.81337,-338.24157)"
inkscape:export-filename="/Users/oliver/Development/pulsatingscience/src/resources/texture_beam.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
</g>
</svg>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment