Use shaders in sky grid drawing
parent
8005ac1577
commit
5d4b23f241
|
@ -390,6 +390,10 @@ SkyGrid::render(Renderer& renderer,
|
||||||
int windowWidth,
|
int windowWidth,
|
||||||
int windowHeight)
|
int windowHeight)
|
||||||
{
|
{
|
||||||
|
auto *prog = renderer.getShaderManager().getShader("uniform_color");
|
||||||
|
if (prog == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
// 90 degree rotation about the x-axis used to transform coordinates
|
// 90 degree rotation about the x-axis used to transform coordinates
|
||||||
// to Celestia's system.
|
// to Celestia's system.
|
||||||
Quaterniond xrot90 = XRotation(-PI / 2.0);
|
Quaterniond xrot90 = XRotation(-PI / 2.0);
|
||||||
|
@ -539,7 +543,8 @@ SkyGrid::render(Renderer& renderer,
|
||||||
Quaterniond q = xrot90 * m_orientation * xrot90.conjugate();
|
Quaterniond q = xrot90 * m_orientation * xrot90.conjugate();
|
||||||
Quaternionf orientationf = q.cast<float>();
|
Quaternionf orientationf = q.cast<float>();
|
||||||
|
|
||||||
glColor(m_lineColor);
|
prog->use();
|
||||||
|
prog->vec4Param("color") = m_lineColor.toVector4();
|
||||||
|
|
||||||
// Render the parallels
|
// Render the parallels
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
@ -551,22 +556,26 @@ SkyGrid::render(Renderer& renderer,
|
||||||
|
|
||||||
double arcStep = (maxTheta - minTheta) / (double) ARC_SUBDIVISIONS;
|
double arcStep = (maxTheta - minTheta) / (double) ARC_SUBDIVISIONS;
|
||||||
double theta0 = minTheta;
|
double theta0 = minTheta;
|
||||||
|
|
||||||
|
auto buffer = new Vector3f[ARC_SUBDIVISIONS+1];
|
||||||
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
glVertexPointer(3, GL_FLOAT, 0, buffer);
|
||||||
|
|
||||||
for (int dec = startDec; dec <= endDec; dec += decIncrement)
|
for (int dec = startDec; dec <= endDec; dec += decIncrement)
|
||||||
{
|
{
|
||||||
double phi = PI * (double) dec / (double) DEG_MIN_SEC_TOTAL;
|
double phi = PI * (double) dec / (double) DEG_MIN_SEC_TOTAL;
|
||||||
double cosPhi = cos(phi);
|
double cosPhi = cos(phi);
|
||||||
double sinPhi = sin(phi);
|
double sinPhi = sin(phi);
|
||||||
|
|
||||||
glBegin(GL_LINE_STRIP);
|
|
||||||
for (int j = 0; j <= ARC_SUBDIVISIONS; j++)
|
for (int j = 0; j <= ARC_SUBDIVISIONS; j++)
|
||||||
{
|
{
|
||||||
double theta = theta0 + j * arcStep;
|
double theta = theta0 + j * arcStep;
|
||||||
auto x = (float) (cosPhi * std::cos(theta));
|
auto x = (float) (cosPhi * std::cos(theta));
|
||||||
auto y = (float) (cosPhi * std::sin(theta));
|
auto y = (float) (cosPhi * std::sin(theta));
|
||||||
auto z = (float) sinPhi;
|
auto z = (float) sinPhi;
|
||||||
glVertex3f(x, z, -y); // convert to Celestia coords
|
buffer[j] = {x, z, -y}; // convert to Celestia coords
|
||||||
}
|
}
|
||||||
glEnd();
|
glDrawArrays(GL_LINE_STRIP, 0, ARC_SUBDIVISIONS+1);
|
||||||
|
|
||||||
// Place labels at the intersections of the view frustum planes
|
// Place labels at the intersections of the view frustum planes
|
||||||
// and the parallels.
|
// and the parallels.
|
||||||
|
@ -633,16 +642,15 @@ SkyGrid::render(Renderer& renderer,
|
||||||
double cosTheta = cos(theta);
|
double cosTheta = cos(theta);
|
||||||
double sinTheta = sin(theta);
|
double sinTheta = sin(theta);
|
||||||
|
|
||||||
glBegin(GL_LINE_STRIP);
|
|
||||||
for (int j = 0; j <= ARC_SUBDIVISIONS; j++)
|
for (int j = 0; j <= ARC_SUBDIVISIONS; j++)
|
||||||
{
|
{
|
||||||
double phi = phi0 + j * arcStep;
|
double phi = phi0 + j * arcStep;
|
||||||
auto x = (float) (cos(phi) * cosTheta);
|
auto x = (float) (cos(phi) * cosTheta);
|
||||||
auto y = (float) (cos(phi) * sinTheta);
|
auto y = (float) (cos(phi) * sinTheta);
|
||||||
auto z = (float) sin(phi);
|
auto z = (float) sin(phi);
|
||||||
glVertex3f(x, z, -y); // convert to Celestia coords
|
buffer[j] = {x, z, -y}; // convert to Celestia coords
|
||||||
}
|
}
|
||||||
glEnd();
|
glDrawArrays(GL_LINE_STRIP, 0, ARC_SUBDIVISIONS+1);
|
||||||
|
|
||||||
// Place labels at the intersections of the view frustum planes
|
// Place labels at the intersections of the view frustum planes
|
||||||
// and the meridians.
|
// and the meridians.
|
||||||
|
@ -692,16 +700,18 @@ SkyGrid::render(Renderer& renderer,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw crosses indicating the north and south poles
|
// Draw crosses indicating the north and south poles
|
||||||
glBegin(GL_LINES);
|
buffer[0] = {-polarCrossSize, 1.0f, 0.0f};
|
||||||
glVertex3f(-polarCrossSize, 1.0f, 0.0f);
|
buffer[1] = { polarCrossSize, 1.0f, 0.0f};
|
||||||
glVertex3f( polarCrossSize, 1.0f, 0.0f);
|
buffer[2] = {0.0f, 1.0f, -polarCrossSize};
|
||||||
glVertex3f(0.0f, 1.0f, -polarCrossSize);
|
buffer[3] = {0.0f, 1.0f, polarCrossSize};
|
||||||
glVertex3f(0.0f, 1.0f, polarCrossSize);
|
buffer[4] = {-polarCrossSize, -1.0f, 0.0f};
|
||||||
glVertex3f(-polarCrossSize, -1.0f, 0.0f);
|
buffer[5] = { polarCrossSize, -1.0f, 0.0f};
|
||||||
glVertex3f( polarCrossSize, -1.0f, 0.0f);
|
buffer[6] = {0.0f, -1.0f, -polarCrossSize};
|
||||||
glVertex3f(0.0f, -1.0f, -polarCrossSize);
|
buffer[7] = {0.0f, -1.0f, polarCrossSize};
|
||||||
glVertex3f(0.0f, -1.0f, polarCrossSize);
|
glDrawArrays(GL_LINES, 0, 8);
|
||||||
glEnd();
|
|
||||||
|
|
||||||
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
glUseProgram(0);
|
||||||
|
delete[] buffer;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue