16 Renderizaci�n de pol�gonos



void polygon3d(BITMAP *bmp, int type, BITMAP *texture, int vc, V3D *vtx[]);
void polygon3d_f(BITMAP *bmp, int type, BITMAP *texture, int vc, V3D_f *vtx[]);
Dibuja pol�gonos 3d en el bitmap especificado, usando el modo de render especificado. A diferencia de la funci�n polygon(), estas rutinas no soportan figuras c�ncavas o con intersecciones, y no pueden dibujar sobre bitmaps de pantalla en modo-X ( si quiere escribir c�digo en modo-X, dibuja en un bitmap de memoria y c�pialo a la pantalla). El ancho y alto del bitmap de la textura debe ser un m�ltiplo de dos, pero puede ser diferente, ejemplo: una textura 64x16 est� bien, pero una de 17x3 no. El par�metro que cuenta los v�rtices (vc) debe ser seguido por un array que contiene el n�mero apropiado de punteros a estructuras vertex: polygon3d() usa la estructura de punto fijo V3D, mientras que polygon3d_f() usa la estructura coma flotante V3D_f. Estas son definidas as�:

   typedef struct V3D
   {
      fixed x, y, z;       - posici�n
      fixed u, v;          - coordenadas de la textura
      int c;               - color
   } V3D;

typedef struct V3D_f { float x, y, z; - posici�n float u, v; - coordenadas de la textura int c; - color } V3D_f;

El c�mo se almacenan los datos de los v�rtices depende del modo de render:

Los valores x e y especifican la posici�n del v�rtice en coordenadas de pantalla 2d.

El valor z s�lo es necesario cuando use correcci�n de perspectiva en las texturas, y especifica la profundidad del punto usando coordenadas del mundo 3d.

Las coordenadas u y v s�lo son necesarias cuando use texturas, y especifica la posici�n del punto en el bitmap de la textura. Por ejemplo 0, 0 corresponde al v�rtice de la esquina superior izquierda de la textura, y si la textura es de 32x32, el punto u=32 y v=16 dibuja en el v�rtice el punto que est� en la mitad a la derecha de la textura. Las coordenadas u/v vuelven a cero en los bordes de la textura, por lo que en una textura de 32x32, u=v=32 es lo mismo que u=v=0. Esto puede ser usado para repetir la textura sobre el pol�gono.

El valor c especifica el color del v�rtice, y es interpretado de forma diferente por los modos de render.

El par�metro type especifica el modo de render, y puede ser cualquiera de los siguientes:

POLYTYPE_FLAT:
Un simple pol�gono con sombreado plano, que toma el color del valor c del primer v�rtice. Este tipo de pol�gono es afectado por la funci�n drawing_mode(), por lo que puede ser usado para renderizar pol�gonos transparentes o XOR.

POLYTYPE_GCOL:
Un pol�gono con un color de sombreado goraud. Los colores de cada v�rtice son tomados del valor c, e interpolados a trav�s del pol�gono. Esto es muy r�pido, pero s�lo funcionar� en modos de 256 colores si su paleta tiene un suave gradiente de colores. En modos truecolor interpreta el color como valor empaquetado en formato directo de hardware producido por la funci�n makecol().

POLYTYPE_GRGB:
Un pol�gono con sombreado goraud que interpola tripletes RGB en vez de un solo color. En modos de 256 colores usa la tabla global rgb_map para convertir el resultado a color de 8 bits, por lo que s�lo puede ser usado despu�s de que haya creado una tabla de mapa de colores. Los colores para cada v�rtice son tomados del valor c, que es interpretado como un triplete RGB de 24 bits (0xFF0000 es rojo, 0x00FF00 es verde y 0x0000FF es azul).

POLYTYPE_ATEX:
Un pol�gono con textura af�n. Esto dibuja la textura a trav�s del pol�gono con una simple interpolaci�n 2d lineal, que es r�pida pero matem�ticamente incorrecta. Puede estar bien si el pol�gono es peque�o o plano hacia la c�mara, pero como no cuenta con la acortaci�n de perspectiva, puede producir extra�os artefactos movidos en la textura. Para ver lo que quiero decir, ejecuta test.exe y mire lo que pasa con el test polygon3d() cuando hace un zoom muy cerca del cubo.

POLYTYPE_PTEX:
Un pol�gono texturizado con correcci�n de perspectiva. Esto usa el valor z de la estructura del v�rtice as� como las coordenadas u/v, por lo que las texturas se ven correctamente independientemente del �ngulo de visualizaci�n. Ya que esto envuelve c�lculos de divisi�n en al bucle interior de la texturizaci�n, este modo es mucho m�s lento que POLYTYPE_ATEX, y usa coma flotante, por lo que ser� muy lento en cualquier cosa peor que un Pentium (incluso con una FPU, un 486 no es capaz de mezclar divisi�n de coma flotante con otras operaciones de enteros tal y como puede hacer un Pentium).

POLYTYPE_ATEX_MASK:
POLYTYPE_PTEX_MASK:
Como POLYTYPE_ATEX and POLYTYPE_PTEX, pero los pixels a cero de la textura son ignorados, permitiendo que la textura sea transparente.

POLYTYPE_ATEX_LIT:
POLYTYPE_PTEX_LIT:

Como POLYTYPE_ATEX y POLYTYPE_PTEX, pero la tabla global color_map (para modos de 256 colores) o la funci�n de fundido (para modos truecolor no-MMX) es usada para fundir la textura con el nivel de luz tomado del valor c en la estructura del v�rtice. �Esto s�lo puede ser usado despu�s de que haya creado una tabla de mapa de color o funciones de fundido!

POLYTYPE_ATEX_MASK_LIT:
POLYTYPE_PTEX_MASK_LIT:
Como POLYTYPE_ATEX_LIT y POLYTYPE_PTEX_LIT, pero los pixels a cero de la textura son ignorados, permitiendo que la textura sea transparente.

Si la variable global cpu_mmx est� activada, las rutinas GRGB y *LIT truecolor ser�n optimizadas usando instrucciones MMX. Si la variable global cpu_3dnow est� activada, las rutinas truecolor PTEX*LIT tomar�n ventaja de la extensi�n de CPU 3DNow!. Por esta raz�n, es buena idea llamar check_cpu() antes de usar las funciones de pol�gonos.

Usar rutinas MMX para *LIT tiene un efecto secundario: normalmente (sin MMX), estas rutinas usan las funciones de fundido y otras funciones de luz, creadas con set_trans_blender() o set_blender_mode(). Las versiones MMX s�lo usan el valor RGB que se pasa a set_trans_blender() y hacen la interpolaci�n lineal internamente. Por esta raz�n, un nuevo conjundo de funciones de fundido que se pasa a set_blender_mode() es ignorado.

void triangle3d(BITMAP *bmp, int type, BITMAP *tex, V3D *v1, *v2, *v3);
void triangle3d_f(BITMAP *bmp, int type, BITMAP *tex, V3D_f *v1, *v2, *v3);
Dibuja tri�ngulos en 3d, usando las estructuras de vertices de punto fijo o coma flotante. Esto es equivalente a llamar polygon3d(bmp, type, tex, 3, v1, v2, v3); o polygon3d_f(bmp, type, tex, 3, v1, v2, v3);

void quad3d(BITMAP *bmp, int type, BITMAP *tex, V3D *v1, *v2, *v3, *v4);
void quad3d_f(BITMAP *bmp, int type, BITMAP *tex, V3D_f *v1, *v2, *v3, *v4);
Dibuja cuadril�teros en 3d, usando las estructuras de v�rtices de punto fijo o coma flotante. Esto es equivalente a llamar polygon3d(bmp, type, tex, 4, v1, v2, v3, v4); o polygon3d_f(bmp, type, tex, 4, v1, v2, v3, v4);

int clip3d_f(int type, float min_z, float max_z, int vc,
V3D_f *vtx[], V3D_f *vout[], V3D_f *vtmp[], int out[]);

Recorta el pol�gono dado en vtx. vc es el n�mero de v�rtices, el resultado va en vout, y vtmp y out son necesarios para uso interno. Los punteros en vtx, vout y vtmp deben apuntar a estructuras V3D_f v�lidas. El tama�o de vout, vtmp y out deber�a ser al menos vc*2 (ya que en el proceso de recorte pueden aparecer v�rtices adicionales). frustum (vol�men visualizado) est� definido por -z<x<z, -z<y<z, 0<min_z<z<max_z. Si max_z<=min_z, el recorte z<max_z no se hace. Como puede ver, el recorte se realiza en el espacio de la c�mara, con la perspectiva en mente, por lo que esta rutina deber�a ser llamada despues de aplicar la matriz de c�mara, pero antes de la proyecci�n de perspectiva. La rutina interpolar� correctamente u, v, y c en la estructura de v�rtices. Sin embargo, esto no est� previsto para GCOL en profundidades de color high/truecolor.




Volver al Indice