lunes, 23 de abril de 2012

Arnow2D. Mejorando el pintado

Artículo perteneciente a la sección de motores gráficos

Hola a todos,

En este capitulo nos encargaremos de mejorar el pintado de gráficos 2D por pantalla.

Por un lado, haremos que los gráficos se pinten con el tamaño del gráfico original y no a un valor hardcodeado por código y en segundo lugar permitiremos cargar diferentes tipos de formatos gráficos.

Para pintar gráficos con un tamaño especifico solamente hemos de texturizar en un quad del tamaño que a nosotros nos interese. La información del tamaño del quad la perdemos al eliminar el objeto de gráfico, así que tendremos que guardarlo de alguna forma.....

//Creamos una estructura donde almacenaremos el identificador de textura y sus dimensiones

typedef struct
{
int texture; //Almacenamos el identificador de textura
int w,h; //Ancho y largo de la textura original
}TGraf;

//Modificamos la función de carga...

int A2D_Load(char cad[])
{
GLuint tex;
corona::Image* imagen=NULL;

cout << "Cargamos recurso: " << cad << "\n";

imagen = corona::OpenImage(cad, corona::PF_R8G8B8A8 , corona::FF_AUTODETECT);

if(imagen==NULL)
{
cout << "Recurso no cargado\n";
return -1;
}

printf("Ancho:%d  Alto:%d\n",imagen->getWidth(),imagen->getHeight());
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imagen->getWidth(), imagen->getHeight(),0, GL_RGBA, GL_UNSIGNED_BYTE, imagen->getPixels());
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

GrafList[index_graf].texture = tex;
GrafList[index_graf].h = imagen->getHeight();
GrafList[index_graf].w = imagen->getWidth();

tex = index_graf;
index_graf++;

delete imagen;  

cout << "Recurso cargado\n";

return tex;
}

Y modificamos la función de pintado:

void A2D_Draw(float x, float y, int id)
{
int tex,w,h;

tex = GrafList[id].texture;
w = GrafList[id].w;
h = GrafList[id].h;

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

glBegin(GL_QUADS);
glTexCoord2f( 1.0f, 1.0f); glVertex2i( x + w , y + h );
glTexCoord2f( 0.0f, 1.0f); glVertex2i( x     , y + h );
glTexCoord2f( 0.0f, 0.0f); glVertex2i( x     , y  );
glTexCoord2f( 1.0f, 0.0f); glVertex2i( x + w    , y );
glEnd();
}



En cuanto a usar diferentes formatos gráficos corona nos lo deja muy fácil ya que solo nos pide que usemos la siguiente linea:
imagen = corona::OpenImage(cad, corona::PF_R8G8B8A8 , corona::FF_AUTODETECT);

Finalmente, pondremos un código de ejemplo para comprobar como funciona:



#include "Arnow2D.h"

GLuint graf[10];

void Draw(void)
{
int i,j;

A2D_Draw(0,0,graf[0]);
A2D_Draw(500,0,graf[1]);
A2D_Draw(0,300,graf[2]);
A2D_Draw(500,300,graf[3]);

}

void Main_Loop(void)
{
  while(1)
  {
//Limpiamos la pantalla
A2D_Clear();

Draw();

//Renderizamos la escena
A2D_Render();
  }
}

int main(void)
{
  A2D_Init();
  graf[0] = A2D_Load("img_test.png");
  graf[1] = A2D_Load("images.jpg");
  graf[2] = A2D_Load("78bc6b62fEySW.gif");
  graf[3] = A2D_Load("ejemplo.bmp");

  Main_Loop();

  A2D_DeInit();
}

Espero , que aunque sencillo, os haya ayudado, en breve más. Creo que en el próximo capitulo implementaré las z's. Si teneis sugerencias aqui estoy esperandolas

Os dejo el archivo con todo el código y los ejemplos aqui

Nos vemos

LordPakusBlog

0 comentarios :

Publicar un comentario

Entradas populares