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;El c�mo se almacenan los datos de los v�rtices depende del modo de render:typedef struct V3D_f { float x, y, z; - posici�n float u, v; - coordenadas de la textura int c; - color } V3D_f;
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.