T
Hallo Leute,
ich habe es dickes Problem ich hab hab keine Ahnung wie ich es lösen könnte.
Ich möchte ein Farbverlaufbalken oben links ins OpenGL Fenster kleben. Das klappt ja auch schon. Nur leider muss ich an diesen Farbverlaufbalken auch noch schrift bringen. Die bisherige Methode funktioniert nicht mehr. Die Schrift wird auf den Kopf dagestellt, weil ich die Projektionsmatrix geändert hab. Das muss ich aber machen, da ich Pixelgenau positionieren will.
Desweitern hab ich das Problem das alles was vorher gezeichnet worden ist weg ist. Kommt dadurch das ich die Matrix ändern muss.
Wie kann ich es schaffen das ich Pixelgenau positionieren kann und trotzdem nicht die Projektionsmatrix ändern muss, desweitern wie kann ich dann den Balken beschriften.
Bitte helft mir... es ist wichtig.... Danke im voraus.
#include "Color_gradient.h"
#include <gl\glaux.h> // Header File For The Glaux Library
#include "glf.h"
// ----------------------------------------------------------------------------
ColorGradient::ColorGradient(const char *Filename)
{
AUX_RGBImageRec *TextureImage; // = auxDIBImageLoadA("texture.bmp"); // lädt die Textur
TextureImage = auxDIBImageLoadA(Filename);
glGenTextures(1, &texture[0]); // Create The Texture
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
free(TextureImage->data);
free(TextureImage);
}
// ----------------------------------------------------------------------------
void ColorGradient::colorGradientDraw(int windowWidth, int windowHeight, int posX, int posY, int barWidth, int barHeight, int Steps, float minValue, float maxValue)
{
GLint viewport[4];
GLdouble mvmatrix[16], projmatrix[16];
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projmatrix);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, windowWidth, windowHeight, 0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping ( NEW )
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glColor4f(1.0,1.0,1.0,1.0);
glTexCoord2f(0.0f, 1.0f); glVertex2i(posX , posY);
glTexCoord2f(1.0f, 1.0f); glVertex2i(posX + barWidth, posY);
glTexCoord2f(1.0f, 0.0f); glVertex2i(posX + barWidth, posY + barHeight);
glTexCoord2f(0.0f, 0.0f); glVertex2i(posX , posY + barHeight);
glEnd();
glDisable(GL_TEXTURE_2D);
glBegin(GL_LINES);
for (int i = 1; i <= Steps; i++) {
if (Steps > 1) {
glVertex2i(posX , posY + ((barHeight / (Steps - 1) ) * (i - 1))); glVertex2i(posX - 5, posY + ((barHeight / (Steps - 1)) * (i - 1)));
}
}
glEnd();
// Billboarding (http://www.lighthouse3d.com/opengl/billboarding/index.php3?billCheat)
float modelview2[16];
int a,b;
// get the current modelview matrix
glGetFloatv(GL_MODELVIEW_MATRIX , modelview2);
// undo all rotations
// beware all scaling is lost as well
for( a=0; a<3; a++ )
for( b=0; b<3; b++ ) {
if ( a==b )
modelview2[a*4+b] = 1.0;
else
modelview2[a*4+b] = 0.0;
}
// set the modelview with no rotations
glLoadMatrixf(modelview2);
glScalef(10.0f,10.0f,10.0f);
QString m = "Hallo";
char* puffer = (char*)m.latin1();
glColor4f(1.0,1.0,1.0,1.0);
glTranslatef(20.0f,20.0f,0.0f);
glfDrawSolidString(puffer);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(projmatrix);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(mvmatrix);
}
Cu,
Torakas