Sign in to follow this  
maxfire

SDL Opengl mode 2D Texture Mapping

Recommended Posts

maxfire    209
Hi guys' im having a few problems with clipping a 2D texture in SDL OpenGL mode.

Currently I have the image clipping but when it blends to the screen it distorts/twists ( I'll just put a screen shot up [img]http://public.gamedev.net//public/style_emoticons/default/tongue.png[/img] ). Now I know its something to do with my Quad matrix but I just can't see the error. Here's my function any advice would be great [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img].

[code]void MainWnd::RenderSprite( GraphicsTexture* graphic, SDL_Rect position, SDL_Rect clipping )
{
glColor4ub( 255,255,255,255 );

glEnable( GL_TEXTURE_2D );

glBindTexture( GL_TEXTURE_2D, graphic->GetTexture() );

glTranslatef( position.x, position.y, 0 );

float x = 0;
float y = 0;

glBegin( GL_QUADS );

x = GetClippingPercentage( clipping.x, clipping.w );
y = GetClippingPercentage( clipping.y, clipping.h );

glTexCoord2d( x, y );
glVertex3f( 0.0, 0.0, 0.0 );//top left

x = GetClippingPercentage( ( clipping.x + clipping.w ), graphic->_TextureDimentions.width );
y = GetClippingPercentage( clipping.y, graphic->_TextureDimentions.height );

glTexCoord2d( x, y );
glVertex3f( ( position.w + 0.0 ), 0.0, 0.0 );//top right

x = GetClippingPercentage( clipping.w + 0.0, graphic->_TextureDimentions.width + 0.0 );
y = GetClippingPercentage( ( clipping.y + clipping.h + 0.0 ), ( graphic->_TextureDimentions.height + 0.0 ) );

glTexCoord2d( x, y );
glVertex3f( ( position.w + 0.0 ), ( position.h + 0.0 ), 0.0 );//bottom right

x = GetClippingPercentage( clipping.x + 0.0 , graphic->_TextureDimentions.width + 0.0 );
y = GetClippingPercentage( clipping.h + 0.0, graphic->_TextureDimentions.height + 0.0 );

glTexCoord2d( x, y );
glVertex3f( 0.0, ( position.h + 0.0 ), 0.0 );//bottom left

glEnd();

glDisable( GL_TEXTURE_2D );

//Reset
glLoadIdentity();
}
float MainWnd::GetClippingPercentage( int inner, int outer )
{
float value = ( float ) ( inner ) / ( float ) ( outer + 0.0 );
return value;
}[/code]

Update: I worked out by hand the clipping margins ( multiplying the float value by the texture size and the outcomes match the clipping rect ) so the math is correct. Am I missing something?

Share this post


Link to post
Share on other sites
SimonForsman    7642
Try glScissor: [url="http://www.opengl.org/sdk/docs/man/xhtml/glScissor.xml"]http://www.opengl.or...l/glScissor.xml[/url]


glScissor is probably the easiest way to do clipping.


[code]
void MainWnd::RenderSprite( GraphicsTexture* graphic, SDL_Rect position, SDL_Rect clipping ) {
glColor4ub( 255,255,255,255 );
glEnable(GL_SCISSOR_TEST);
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, graphic->GetTexture() );
glLoadIdentity();
glTranslatef( position.x, position.y, 0 );
glScissor(clipping.x,clipping.y,clipping.w,clipping.h);

glBegin(GL_QUADS);
glTextCoord2(0.0f,0.0f); glVertex3f(0.0f,0.0f,0.0f);
glTextCoord2(1.0f,0.0f); glVertex3f((float)position.w,0.0f,0.0f);
glTextCoord2(1.0f,1.0f); glVertex3f((float)position.w,float(position.h,0.0f);
glTextCoord2(0.0f,1.0f); glVertex3f(0.0f,position.h,0.0f);
glEnd();
glDisable(GL_SCISSOR_TEST);
}
[/code]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this