[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: =?utf-8?q?=5Bkstars=5D_kstars=3A_Create_function_for_textured_re?=
From: Khudyakov Alexey <alexey.skladnoy () gmail ! com>
Date: 2011-05-05 12:20:30
Message-ID: 20110505122030.A449FA60C8 () git ! kde ! org
[Download RAW message or body]
Git commit 8b625b1d49f8f71d7d06abf6a3846801eb73be17 by Khudyakov Alexey.
Committed on 05/05/2011 at 13:50.
Pushed by khudyakov into branch 'master'.
Create function for textured retangle rendering. Show fix same
problem with image mirroring in deepskes as planets had
M +54 -59 kstars/skyglpainter.cpp
M +6 -0 kstars/skyglpainter.h
http://commits.kde.org/kstars/8b625b1d49f8f71d7d06abf6a3846801eb73be17
diff --git a/kstars/skyglpainter.cpp b/kstars/skyglpainter.cpp
index 454153a..a9788ec 100644
--- a/kstars/skyglpainter.cpp
+++ b/kstars/skyglpainter.cpp
@@ -52,7 +52,10 @@ Vector3f SkyGLPainter::m_color[NUMTYPES][6*BUFSIZE];
int SkyGLPainter::m_idx[NUMTYPES];
bool SkyGLPainter::m_init = false;
-SkyGLPainter::SkyGLPainter( QGLWidget *widget ) : SkyPainter()
+
+
+SkyGLPainter::SkyGLPainter( QGLWidget *widget ) :
+ SkyPainter()
{
m_widget = widget;
if( !m_init ) {
@@ -150,17 +153,54 @@ bool SkyGLPainter::addItem(SkyPoint* p, int type, float width, char sp)
return true;
}
+void SkyGLPainter::drawTexturedRectangle( const QImage& img,
+ const Vector2f& pos, const float angle,
+ const float sizeX, const float sizeY )
+{
+ // Set up texture
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glEnable(GL_TEXTURE_2D);
+ TextureManager::bindFromImage( img, m_widget );
+
+ // Render rectangle
+ glPushMatrix();
+ glTranslatef( pos.x(), pos.y(), 0 );
+ glRotatef( angle, 0, 0, 1 );
+ glScalef( sizeX, sizeY, 1 );
+
+ glBegin(GL_QUADS);
+ // Note! Y coordinate of texture is mirrored w.r.t. to
+ // vertex coordinates to account for difference between
+ // OpenGL and QPainter coordinate system.
+ // Otherwise image would appear mirrored
+ glTexCoord2f( 0, 1 );
+ glVertex2f( -0.5, -0.5 );
+
+ glTexCoord2f( 1, 1 );
+ glVertex2f( 0.5, -0.5 );
+
+ glTexCoord2f( 1, 0 );
+ glVertex2f( 0.5, 0.5 );
+
+ glTexCoord2f( 0, 0 );
+ glVertex2f( -0.5, 0.5 );
+ glEnd();
+
+ glPopMatrix();
+}
+
bool SkyGLPainter::drawPlanet(KSPlanetBase* planet)
{
//If it's surely not visible, just stop now
- if( !m_proj->checkVisibility(planet) ) return false;
+ if( !m_proj->checkVisibility(planet) )
+ return false;
float zoom = Options::zoomFactor();
float fakeStarSize = ( 10.0 + log10( zoom ) - log10( MINZOOM ) ) * ( 10 - planet->mag() ) / 10;
- fakeStarSize = qMin(fakeStarSize,20.f);
-
+ fakeStarSize = qMin(fakeStarSize, 20.f);
+
float size = planet->angSize() * dms::PI * zoom/10800.0;
-
if( size < fakeStarSize || planet->image().isNull() )
{
// Draw them as bright stars of appropriate color instead of images
@@ -182,43 +222,14 @@ bool SkyGLPainter::drawPlanet(KSPlanetBase* planet)
Vector2f pos = m_proj->toScreenVec(planet,true,&visible);
if( !visible )
return false;
-
+
//Because Saturn has rings, we inflate its image size by a factor 2.5
if( planet->name() == "Saturn" )
size *= 2.5;
- float s = size/2.;
-
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- glEnable(GL_TEXTURE_2D);
- TextureManager::bindFromImage( planet->image(), m_widget );
-
- // Change modelview matrix
- glPushMatrix();
- glTranslatef( pos.x(), pos.y(), 0 );
- glRotatef( m_proj->findPA(planet, pos.x(), pos.y()), 0, 0, 1 );
- glScalef( s, s, 1 );
-
- glBegin(GL_QUADS);
- // Note! Y coordinate of texture is mirrored w.r.t. to
- // vertex coordinates to account for difference between
- // OpenGL and QPainter coordinate system.
- // Otherwise image would appear mirrored
- glTexCoord2f( 0, 1);
- glVertex2f( -1, -1);
-
- glTexCoord2f( 1, 1);
- glVertex2f( 1, -1);
-
- glTexCoord2f( 1, 0);
- glVertex2f( 1, 1);
-
- glTexCoord2f( 0, 0);
- glVertex2f( -1, 1);
- glEnd();
-
- glPopMatrix();
+ drawTexturedRectangle( planet->image(),
+ pos, m_proj->findPA(planet, pos.x(), pos.y()),
+ size, size );
return true;
}
}
@@ -226,7 +237,8 @@ bool SkyGLPainter::drawPlanet(KSPlanetBase* planet)
bool SkyGLPainter::drawDeepSkyObject(DeepSkyObject* obj, bool drawImage)
{
//If it's surely not visible, just stop now
- if( !m_proj->checkVisibility(obj) ) return false;
+ if( !m_proj->checkVisibility(obj) )
+ return false;
int type = obj->type();
//addItem(obj, type, obj->a() * dms::PI * Options::zoomFactor() / 10800.0);
@@ -236,7 +248,8 @@ bool SkyGLPainter::drawDeepSkyObject(DeepSkyObject* obj, bool drawImage)
bool visible = false;
Vector2f vec = m_proj->toScreenVec(obj,true,&visible);
- if(!visible) return false;
+ if(!visible)
+ return false;
float width = obj->a() * dms::PI * Options::zoomFactor() / 10800.0;
float pa = m_proj->findPA(obj, vec[0], vec[1]) * (M_PI/180.0);
@@ -246,25 +259,7 @@ bool SkyGLPainter::drawDeepSkyObject(DeepSkyObject* obj, bool drawImage)
//Init texture if it doesn't exist and we would be drawing it anyways
if( drawImage && !obj->image().isNull() ) {
- glEnable(GL_TEXTURE_2D);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- Vector2f vertex;
- TextureManager::bindFromImage( obj->image(), m_widget );
- glBegin(GL_QUADS);
- vertex = vec + r*Vector2f(-w,-h);
- glTexCoord2f(0.,0.);
- glVertex2fv(vertex.data());
- vertex = vec + r*Vector2f( w,-h);
- glTexCoord2f(1.,0.);
- glVertex2fv(vertex.data());
- vertex = vec + r*Vector2f( w, h);
- glTexCoord2f(1.,1.);
- glVertex2fv(vertex.data());
- vertex = vec + r*Vector2f(-w, h);
- glTexCoord2f(0.,1.);
- glVertex2fv(vertex.data());
- glEnd();
+ drawTexturedRectangle( obj->image(), vec, pa, w, h);
} else {
//If the buffer is full, flush it
if(m_idx[type] == BUFSIZE)
diff --git a/kstars/skyglpainter.h b/kstars/skyglpainter.h
index 73ac82c..9c4fb77 100644
--- a/kstars/skyglpainter.h
+++ b/kstars/skyglpainter.h
@@ -54,6 +54,12 @@ private:
void drawBuffer(int type);
void drawPolygon(const QVector< Vector2f >& poly, bool convex = true, bool flush_buffers = true);
+ /** Render textured rectangle on screeen. Parameters are texture
+ * to be used, position, orientation and size of rectangle*/
+ void drawTexturedRectangle( const QImage& img,
+ const Vector2f& pos, const float angle,
+ const float sizeX, const float sizeY );
+
const Projector *m_proj;
Vector4f m_pen;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic