Sign in to follow this  
tirengarfio

The size of the window

Recommended Posts

Hi, i have written this code below, that shows a window whose size is 300x300. I think his size should be 100x100, so why is it 300x300?

#include "stdafx.h"
//#include "GL/gl.h"
#include "GL/glut.h"
#include "GL/glaux.h"
#include "GL/glu.h"
#include "stdio.h"

typedef struct // Utilizamos esta estructura
{
GLubyte *imageData;
GLuint bpp;
GLuint width;
GLuint height;
GLuint texID;
} Imagen;
/*
---------------------
Carga_TGA
Carga un TGA en memoria. El TGA debe cumplir las siguientes características:
Ser de 24 bits + Canal ALPHA. (32 bits) y SIN COMPRIMIR
El tamaño debe ser cuadrado (x=y) y 32x32 o 64x64 o 128x128 o 256x256
Devuleve un puntero a la imagen y el tamaño (variable tam) de la imagen
-----------------------
*/
GLubyte *CargaTGA(char *filename,int *tam)
{
GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};

GLubyte TGAcompare[12];

GLubyte header[6];

GLuint bytesPerPixel;

GLuint imageSize;

GLuint temp,i;

GLuint type=GL_RGBA;

Imagen texture;

GLubyte *aux;

FILE *file = fopen(filename, "rb");

if (file == NULL)
printf("Error1");

/* Esto abre y comprueba que es un TGA */
fread(TGAcompare,1,sizeof(TGAcompare),file);
if (memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0)
printf("Its a TGA file");


/* Leemos la cabecera*/
fread(header,1,sizeof(header),file);


/* Determinamos el tamaño */
texture.width = header[1] * 256 + header[0];
texture.height = header[3] * 256 + header[2];


/* Vemos las características y comprobamos si son correctas*/
if( texture.width <=0 ||texture.height <=0 ||texture.width >256 ||texture.height !=texture.width ||( header[4]!=32))
{
fclose(file);
printf("Error - >  Las caracteristicas de la imagen no son las correctas.");
}


/* Calculamos la memoria que será necesaria */
texture.bpp = header[4];
bytesPerPixel = texture.bpp/8;
imageSize = texture.width*texture.height*bytesPerPixel;


/* Reservamos memoria */
texture.imageData=(GLubyte *)malloc(imageSize);


/* Cargamos y hacemos alguna comprobaciones */
if( texture.imageData==NULL ||
fread(texture.imageData, 1, imageSize, file)!=imageSize)
{
if(texture.imageData!=NULL)
free(texture.imageData);
fclose(file);
printf("Error6");
}


/* El TGA viene en formato BGR con, lo pasamos a RGB */
for(i=0; i<(GLuint)(imageSize); i+=bytesPerPixel)
{
temp=texture.imageData[i];
texture.imageData[i] = texture.imageData[i + 2];
texture.imageData[i + 2] = temp;
}
fclose (file);


/* Ahora, cambiamos el orden de las líneas, como si hiciesemosun flip vertical. */
aux=(GLubyte *)malloc(imageSize);
for(i=0; i<texture.height; i++)
memcpy(&aux[imageSize-((i+1)*texture.width*4)],&texture.imageData[i*texture.width*4],texture.width*4);


/* tam devolverá el tamaño */
*tam=texture.width;


/* Liberamos memoria */
free(texture.imageData);

/* Todo fue bien!*/
return aux;


}



void RenderScene (void)
{
	

	
    // Borra la ventana con el color de borrado actual
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    
	//Establecemos el color del cuadrado que queremos dibujar.
	glColor3f(1.0f, 0.0f, 0.0f);
	

	/*glBegin (GL_QUADS);
		
		glTexCoord2f(0.0f, 1.0f); 
		glVertex3f(-100.0f, -100.0f, 0.0f);


		glTexCoord2f(1.0f, 1.0f); 
		glVertex3f( 100.0f, -100.0f, 0.0f);

		glTexCoord2f(1.0f, 0.0f); 
		glVertex3f( 100.0f, 100.0f, 0.0f);


		glTexCoord2f(0.0f, 0.0f); 
		glVertex3f(-100.0f, 100.0f, 0.0f);

	
	

	glEnd();

	*/



	//glRotatef(45.0f, 4.0f, 2.0f, 6.0f);

	//Hace que el cubo tenga aspecto de alambre (wire)
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);




	glBegin(GL_QUADS);		// Draw The Cube Using quads
    glColor3f(0.0f,1.0f,0.0f);	// Color Blue
    glVertex3f( 10.0f, 10.0f,-10.0f);	// Top Right Of The Quad (Top)
    glVertex3f(-10.0f, 10.0f,-10.0f);	// Top Left Of The Quad (Top)
    glVertex3f(-10.0f, 10.0f, 10.0f);	// Bottom Left Of The Quad (Top)
    glVertex3f( 10.0f, 10.0f, 10.0f);	// Bottom Right Of The Quad (Top)
    glColor3f(1.0f,0.5f,0.0f);	// Color Orange
    glVertex3f( 10.0f,-10.0f, 10.0f);	// Top Right Of The Quad (Bottom)
    glVertex3f(-10.0f,-10.0f, 10.0f);	// Top Left Of The Quad (Bottom)
    glVertex3f(-10.0f,-10.0f,-10.0f);	// Bottom Left Of The Quad (Bottom)
    glVertex3f( 10.0f,-10.0f,-10.0f);	// Bottom Right Of The Quad (Bottom)
    glColor3f(1.0f,0.0f,0.0f);	// Color Red	
    glVertex3f( 10.0f, 10.0f, 10.0f);	// Top Right Of The Quad (Front)
    glVertex3f(-10.0f, 10.0f, 10.0f);	// Top Left Of The Quad (Front)
    glVertex3f(-10.0f,-10.0f, 10.0f);	// Bottom Left Of The Quad (Front)
    glVertex3f( 10.0f,-10.0f, 10.0f);	// Bottom Right Of The Quad (Front)
    glColor3f(1.0f,1.0f,0.0f);	// Color Yellow
    glVertex3f( 10.0f,-10.0f,-10.0f);	// Top Right Of The Quad (Back)
    glVertex3f(-10.0f,-10.0f,-10.0f);	// Top Left Of The Quad (Back)
    glVertex3f(-10.0f, 10.0f,-10.0f);	// Bottom Left Of The Quad (Back)
    glVertex3f( 10.0f, 10.0f,-10.0f);	// Bottom Right Of The Quad (Back)
    glColor3f(0.0f,0.0f,1.0f);	// Color Blue
    glVertex3f(-10.0f, 10.0f, 10.0f);	// Top Right Of The Quad (Left)
    glVertex3f(-10.0f, 10.0f,-10.0f);	// Top Left Of The Quad (Left)
    glVertex3f(-10.0f,-10.0f,-10.0f);	// Bottom Left Of The Quad (Left)
    glVertex3f(-10.0f,-10.0f, 10.0f);	// Bottom Right Of The Quad (Left)
    glColor3f(1.0f,0.0f,1.0f);	// Color Violet
    glVertex3f( 10.0f, 10.0f,-10.0f);	// Top Right Of The Quad (Right)
    glVertex3f( 10.0f, 10.0f, 10.0f);	// Top Left Of The Quad (Right)
    glVertex3f( 10.0f,-10.0f, 10.0f);	// Bottom Left Of The Quad (Right)
    glVertex3f( 10.0f,-10.0f,-10.0f);	// Bottom Right Of The Quad (Right)
    glEnd();		

	//glRectf(-1.0f, 1.0f, 1.0f, -1.0f);


	// Do the buffer Swap
    glutSwapBuffers();


}


void SetupRC(void)
{

	GLubyte *pImage;
	GLint iWidth;
	
	//Establece el color azul como color para borrar la ventana.
	glClearColor(0.0f,0.0f,1.0f,1.0f);

	// Targa's are 1 byte aligned
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);


    // Load the TGA file, get width, height, and component/format information
	pImage = CargaTGA("Sin titulo-1.tga", &iWidth);
	

    // Use Window coordinates to set raster position
	//glRasterPos2i(0, 0);
	

    // Escribe un bloque de pixels en el "frame buffer"
    //if(pImage != NULL)
    //    glDrawPixels(iWidth, iWidth, GL_RGBA, GL_UNSIGNED_BYTE, pImage);
	

	//Vinculamos la imagen a GL_TEXTURE_2D
	glTexImage2D(GL_TEXTURE_2D,
		0,        // Nivel de detalle de la imagen. Generalmente el 0
		3,        // Especifica el numero de componentes de color de la textura sin contar con el alpha?
		iWidth,   // Anchura de la imagen. SIEMPRE POTENCIA DE 2
		iWidth,   // Altura
		0,        // Numero de pixels que debe tener el borde la textura. Toma 0,1 o 2
		GL_RGBA,  // Formato de la imagen.
		GL_UNSIGNED_BYTE, // el tipo de datos en que va a ser pasada la informacion de la imagen cargada
		pImage    // Puntero que apunta a la imagen.
		);
	



	// Don't need the image data anymore
	free(pImage);
		


	////TEXTURE FILTERS
	////Cuando la imagen de la textura no se adecua con el tamaño de la superficie
	////que se quiere cubrir.
	////MIN_FILTER: cuando la superficie sea mayor que la imagen.
	////MAX_FILTER: cuando la superficie sea menor que la imagen.
    ////GL_LINEAR: en escaso se ha optado por una interpolacion lineal. Hay 6 mas.
	
	glTexParameteri(GL_TEXTURE_2D, 
		GL_TEXTURE_MIN_FILTER, 
		GL_LINEAR 
		);
		
	glTexParameteri(GL_TEXTURE_2D,
		GL_TEXTURE_MAG_FILTER,
		GL_LINEAR
		);



	////WRAP FILTERS
	////Cuando se pega la textura a una superficie debe indicarse la correspondecia
	////entre las coordenadas de la textura y los vertices de dicha superficie.

	glTexParameteri(GL_TEXTURE_2D, 
		GL_TEXTURE_WRAP_S,  // Se repite o se estira hacia el lado s? de la textura.
		GL_CLAMP         //La textura se puede estirar (GL_CLAMP) o se puede repetir (GL_REPEAT).
		);           


	glTexParameteri(GL_TEXTURE_2D, 
		GL_TEXTURE_WRAP_T,  // Se repite o se estira hacia el lado s? de la textura.
		GL_CLAMP    //La textura se puede estirar (GL_CLAMP) o se puede repetir (GL_REPEAT).
		);         






	////Una textura es un poster que adherimos al poligono, este poster lo podemos combinar con
	////el color del poligono. Podemos elegir 4 modos de combinar el color del poligono con el 
	////color de la textura.
	glTexEnvi(GL_TEXTURE_ENV,  //Obligatorio siempre.
		GL_TEXTURE_ENV_MODE,   //Al poner aqui GL_TEXTURE_ENV_MODE, la siguiente linea puede valer GL_DECAL, GL_REPLACE (usan el color de la textura, ignoran el del poligono), GL_MODULATE o GL_BLEND.
		GL_REPLACE   //
		);


	glEnable(GL_TEXTURE_2D);

	


}


///////////////////////////////////////////////////////////
// Called by GLUT library when the window has chanaged size
void ChangeSize(int w, int h)
	{
	GLfloat aspectRatio;

	// Prevent a divide by zero
	if(h == 0)
		h = 1;
		
	// Set Viewport to window dimensions
    glViewport(0, 0, w, h);

	// Reestablece el sistema de coordenadas antes de que se ejecute ninguna manipulacion de matr
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	// Establish clipping volume (left, right, bottom, top, near, far)
	
	aspectRatio = (GLfloat)w / (GLfloat)h;
    
	if (w <= h) 
		glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 200.0, -200.0);
    
	else 
		glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 200.0, -200.0);

	
	
	glMatrixMode(GL_MODELVIEW);
	
	glLoadIdentity();
	
	glTranslatef(10.0f, 6.0f, 0.0f);

	glRotatef(40.0f, 8.0f, 6.0f, 1.0f);

	glScalef(3.0f, 3.0f, 3.0f);


	//float array[16]={1, 0, 0, 3, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};

	int i;

	float array[16];

	glGetFloatv (GL_MODELVIEW_MATRIX, array);

	for (i=0; i<16; i++)
	{
	printf("%f\n", array[i]);
	}


	
	//glMultMatrixf(array);




	}


void main (void)
{

	
/*
InitDisplayMode: el modo de presentacion (display) que se usará al crear la ventana.
GLUT_SINGLE: usaremos una ventana de un solo buffer, pero en la mayoria del resto de 
los casos (siempre que se requiera animacion) usaremos el doble buffer.
GLUT_RGB: modo de color que usaremos. (RGBA=RGB)
*/
	glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
	
	
	glutCreateWindow("Simple");
	
	
//OJO: RenderScene aparece arriba como funcion
	glutDisplayFunc(RenderScene);

	glutReshapeFunc(ChangeSize);

//OJO: RenderScene esta empalmada con otra funcion (mirar arriba)
//Establece el color de borrado de la pantalla pero no la borra.	
	SetupRC();

	
//Inicia la estructura principal de GLUT
	glutMainLoop();

	

}


Share this post


Link to post
Share on other sites
Hi,
Before glutCreateWindow you have to specify with the values of your choice this :
glutInitWindowSize (640, 480) ;
glutInitWindowPosition (250,250) ;//start from upper left corner

Share this post


Link to post
Share on other sites
yes! it works. ;)

Edited:

no! it doesnt works! my window's size is W=115 and H=100. And i have written this line:

glutInitWindowSize (100, 100) ;


Edited:

I think the minimum of the window's width is 115 pixels...

[Edited by - tirengarfio on September 8, 2006 2:47:04 AM]

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