flightgear/utils/fgpanel/FGTexturedLayer.cxx
2022-10-20 20:29:11 +08:00

125 lines
4.5 KiB
C++

//
// Written by David Megginson, started January 2000.
// Adopted for standalone fgpanel application by Torsten Dreyer, August 2009
//
// This program 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; either version 2 of the
// License, or (at your option) any later version.
//
// This program 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 this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#include "GL_utils.hxx"
#include "FGTexturedLayer.hxx"
GLuint FGTexturedLayer::Textured_Layer_Program_Object (0);
GLint FGTexturedLayer::Textured_Layer_Position_Loc (0);
GLint FGTexturedLayer::Textured_Layer_Tex_Coord_Loc (0);
GLint FGTexturedLayer::Textured_Layer_MVP_Loc (0);
GLint FGTexturedLayer::Textured_Layer_Sampler_Loc (0);
void
FGTexturedLayer::Init (const GLuint Program_Object,
const GLint Position_Loc,
const GLint Tex_Coord_Loc,
const GLint MVP_Loc,
const GLint Sampler_Loc) {
Textured_Layer_Program_Object = Program_Object;
Textured_Layer_Position_Loc = Position_Loc;
Textured_Layer_Tex_Coord_Loc = Tex_Coord_Loc;
Textured_Layer_MVP_Loc = MVP_Loc;
Textured_Layer_Sampler_Loc = Sampler_Loc;
}
FGTexturedLayer::FGTexturedLayer (const int w, const int h) :
FGInstrumentLayer (w, h) {
}
FGTexturedLayer::FGTexturedLayer (const FGCroppedTexture_ptr texture, const int w, const int h) :
FGInstrumentLayer (w, h),
m_texture (texture),
m_emissive (false) {
}
FGTexturedLayer::~FGTexturedLayer () {
}
void
FGTexturedLayer::draw () {
if (test ()) {
transform ();
getDisplayList ();
}
}
void
FGTexturedLayer::setTexture (const FGCroppedTexture_ptr texture) {
m_texture = texture;
}
FGCroppedTexture_ptr
FGTexturedLayer::getTexture () const {
return m_texture;
}
void
FGTexturedLayer::setEmissive (const bool emissive) {
m_emissive = emissive;
}
void
FGTexturedLayer::getDisplayList () {
int w2 = m_w / 2;
int h2 = m_h / 2;
glUseProgram (Textured_Layer_Program_Object);
m_texture->bind (Textured_Layer_Sampler_Loc);
const GLfloat v_Vertices[] = {
float (-w2), float (-h2), 0.0f, // Position 0 (bottom left corner)
m_texture->getMinX (), m_texture->getMinY (), // TexCoord 0 (bottom left corner)
float ( w2), float (-h2), 0.0f, // Position 1 (bottom right corner)
m_texture->getMaxX (), m_texture->getMinY (), // TexCoord 1 (bottom right corner)
float ( w2), float ( h2), 0.0f, // Position 2 (top right corner)
m_texture->getMaxX (), m_texture->getMaxY (), // TexCoord 2 (top right corner)
float (-w2), float ( h2), 0.0f, // Position 3 (top left corner)
m_texture->getMinX (), m_texture->getMaxY () }; // TexCoord 3 (top left corner)
glVertexAttribPointer (Textured_Layer_Position_Loc,
3,
GL_FLOAT,
GL_FALSE,
5 * sizeof (GLfloat),
v_Vertices);
glVertexAttribPointer (Textured_Layer_Tex_Coord_Loc,
2,
GL_FLOAT,
GL_FALSE,
5 * sizeof (GLfloat),
&v_Vertices[3]);
glEnableVertexAttribArray (Textured_Layer_Position_Loc);
glEnableVertexAttribArray (Textured_Layer_Tex_Coord_Loc);
GL_utils::instance ().glMatrixMode (GL_utils::GL_UTILS_PROJECTION);
GL_utils::instance ().glPushMatrix ();
GL_utils::instance ().glMultMatrixf
(*reinterpret_cast <GLfloat (*)[4][4]>
(GL_utils::instance ().get_top_matrix (GL_utils::GL_UTILS_MODELVIEW)));
glUniformMatrix4fv (Textured_Layer_MVP_Loc,
1,
GL_FALSE,
GL_utils::instance ().get_top_matrix (GL_utils::GL_UTILS_PROJECTION));
const GLushort indices[] = {0, 1, 2, 0, 2, 3};
glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
GL_utils::instance ().glPopMatrix ();
GL_utils::instance ().glMatrixMode (GL_utils::GL_UTILS_MODELVIEW);
}