home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Action Ware 10: Quake
/
ACWARE10.iso
/
acware10
/
editors
/
mdlv14
/
mdl_3d.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1996-08-07
|
24KB
|
865 lines
//
// this file by brian martin 1996
// brian@phyast.pitt.edu
//
// this is part of the source for the MedDLe quake model viewer/editor
//
//
#include"mdl.h"
#include<grdriver.h>
// pre-calculated vertex normals needed to do shading
BG_3pt vertex_normal[162]={
{-0.525731,0.000000,0.850651},
{-0.442863,0.238856,0.864188},
{-0.295242,0.000000,0.955423},
{-0.309017,0.500000,0.809017},
{-0.162460,0.262866,0.951056},
{0.000000,0.000000,1.000000},
{0.000000,0.850651,0.525731},
{-0.147621,0.716567,0.681718},
{0.147621,0.716567,0.681718},
{0.000000,0.525731,0.850651},
{0.309017,0.500000,0.809017},
{0.525731,0.000000,0.850651},
{0.295242,0.000000,0.955423},
{0.442863,0.238856,0.864188},
{0.162460,0.262866,0.951056},
{-0.681718,0.147621,0.716567},
{-0.809017,0.309017,0.500000},
{-0.587785,0.425325,0.688191},
{-0.850651,0.525731,0.000000},
{-0.864188,0.442863,0.238856},
{-0.716567,0.681718,0.147621},
{-0.688191,0.587785,0.425325},
{-0.500000,0.809017,0.309017},
{-0.238856,0.864188,0.442863},
{-0.425325,0.688191,0.587785},
{-0.716567,0.681718,-0.147621},
{-0.500000,0.809017,-0.309017},
{-0.525731,0.850651,0.000000},
{0.000000,0.850651,-0.525731},
{-0.238856,0.864188,-0.442863},
{0.000000,0.955423,-0.295242},
{-0.262866,0.951056,-0.162460},
{0.000000,1.000000,0.000000},
{0.000000,0.955423,0.295242},
{-0.262866,0.951056,0.162460},
{0.238856,0.864188,0.442863},
{0.262866,0.951056,0.162460},
{0.500000,0.809017,0.309017},
{0.238856,0.864188,-0.442863},
{0.262866,0.951056,-0.162460},
{0.500000,0.809017,-0.309017},
{0.850651,0.525731,0.000000},
{0.716567,0.681718,0.147621},
{0.716567,0.681718,-0.147621},
{0.525731,0.850651,0.000000},
{0.425325,0.688191,0.587785},
{0.864188,0.442863,0.238856},
{0.688191,0.587785,0.425325},
{0.809017,0.309017,0.500000},
{0.681718,0.147621,0.716567},
{0.587785,0.425325,0.688191},
{0.955423,0.295242,0.000000},
{1.000000,0.000000,0.000000},
{0.951056,0.162460,0.262866},
{0.850651,-0.525731,0.000000},
{0.955423,-0.295242,0.000000},
{0.864188,-0.442863,0.238856},
{0.951056,-0.162460,0.262866},
{0.809017,-0.309017,0.500000},
{0.681718,-0.147621,0.716567},
{0.850651,0.000000,0.525731},
{0.864188,0.442863,-0.238856},
{0.809017,0.309017,-0.500000},
{0.951056,0.162460,-0.262866},
{0.525731,0.000000,-0.850651},
{0.681718,0.147621,-0.716567},
{0.681718,-0.147621,-0.716567},
{0.850651,0.000000,-0.525731},
{0.809017,-0.309017,-0.500000},
{0.864188,-0.442863,-0.238856},
{0.951056,-0.162460,-0.262866},
{0.147621,0.716567,-0.681718},
{0.309017,0.500000,-0.809017},
{0.425325,0.688191,-0.587785},
{0.442863,0.238856,-0.864188},
{0.587785,0.425325,-0.688191},
{0.688191,0.587785,-0.425325},
{-0.147621,0.716567,-0.681718},
{-0.309017,0.500000,-0.809017},
{0.000000,0.525731,-0.850651},
{-0.525731,0.000000,-0.850651},
{-0.442863,0.238856,-0.864188},
{-0.295242,0.000000,-0.955423},
{-0.162460,0.262866,-0.951056},
{0.000000,0.000000,-1.000000},
{0.295242,0.000000,-0.955423},
{0.162460,0.262866,-0.951056},
{-0.442863,-0.238856,-0.864188},
{-0.309017,-0.500000,-0.809017},
{-0.162460,-0.262866,-0.951056},
{0.000000,-0.850651,-0.525731},
{-0.147621,-0.716567,-0.681718},
{0.147621,-0.716567,-0.681718},
{0.000000,-0.525731,-0.850651},
{0.309017,-0.500000,-0.809017},
{0.442863,-0.238856,-0.864188},
{0.162460,-0.262866,-0.951056},
{0.238856,-0.864188,-0.442863},
{0.500000,-0.809017,-0.309017},
{0.425325,-0.688191,-0.587785},
{0.716567,-0.681718,-0.147621},
{0.688191,-0.587785,-0.425325},
{0.587785,-0.425325,-0.688191},
{0.000000,-0.955423,-0.295242},
{0.000000,-1.000000,0.000000},
{0.262866,-0.951056,-0.162460},
{0.000000,-0.850651,0.525731},
{0.000000,-0.955423,0.295242},
{0.238856,-0.864188,0.442863},
{0.262866,-0.951056,0.162460},
{0.500000,-0.809017,0.309017},
{0.716567,-0.681718,0.147621},
{0.525731,-0.850651,0.000000},
{-0.238856,-0.864188,-0.442863},
{-0.500000,-0.809017,-0.309017},
{-0.262866,-0.951056,-0.162460},
{-0.850651,-0.525731,0.000000},
{-0.716567,-0.681718,-0.147621},
{-0.716567,-0.681718,0.147621},
{-0.525731,-0.850651,0.000000},
{-0.500000,-0.809017,0.309017},
{-0.238856,-0.864188,0.442863},
{-0.262866,-0.951056,0.162460},
{-0.864188,-0.442863,0.238856},
{-0.809017,-0.309017,0.500000},
{-0.688191,-0.587785,0.425325},
{-0.681718,-0.147621,0.716567},
{-0.442863,-0.238856,0.864188},
{-0.587785,-0.425325,0.688191},
{-0.309017,-0.500000,0.809017},
{-0.147621,-0.716567,0.681718},
{-0.425325,-0.688191,0.587785},
{-0.162460,-0.262866,0.951056},
{0.442863,-0.238856,0.864188},
{0.162460,-0.262866,0.951056},
{0.309017,-0.500000,0.809017},
{0.147621,-0.716567,0.681718},
{0.000000,-0.525731,0.850651},
{0.425325,-0.688191,0.587785},
{0.587785,-0.425325,0.688191},
{0.688191,-0.587785,0.425325},
{-0.955423,0.295242,0.000000},
{-0.951056,0.162460,0.262866},
{-1.000000,0.000000,0.000000},
{-0.850651,0.000000,0.525731},
{-0.955423,-0.295242,0.000000},
{-0.951056,-0.162460,0.262866},
{-0.864188,0.442863,-0.238856},
{-0.951056,0.162460,-0.262866},
{-0.809017,0.309017,-0.500000},
{-0.864188,-0.442863,-0.238856},
{-0.951056,-0.162460,-0.262866},
{-0.809017,-0.309017,-0.500000},
{-0.681718,0.147621,-0.716567},
{-0.681718,-0.147621,-0.716567},
{-0.850651,0.000000,-0.525731},
{-0.688191,0.587785,-0.425325},
{-0.587785,0.425325,-0.688191},
{-0.425325,0.688191,-0.587785},
{-0.425325,-0.688191,-0.587785},
{-0.587785,-0.425325,-0.688191}
};
void sort(float v[], int vi[], int left, int right);
void swap(float v[], int vi[], int i, int j);
int frame=0;
int firsttime=1;
int draw_flat=0,ii=5, draw_wire=0, draw_vertices=0;
int draw_gshade=0, draw_textured=0, draw_gtextured=1;
int show_head=0;
int back_color=0;
situation eyeball;
//situation qmodel;
void init_view(MDL_model *);
BG_Polygon mdlpts;
GrContext *vscreen;
int mdl_3d(MDL_model *model, MDL_window *w)
{
char str[128];
byte mainloop=1;
byte cur_key=0;
FILE *in;
int i,j,k,l,jj,kk,ll,iii,jjj,kkk;
int zed=0;
int dumby,draw_poly;
int num_screen_pts=0;
int oldmx, oldmy;
int y_val;
int x_val;
int max_depth=128;
int update=1;
int num_screen_sides=0;
int cycle=0;
int p1,p2,p3,p4;
word usi;
word objects, sides, osides, curblock;
word prev_y[BG_ScreenWidth];
unsigned ui,uj,uk,ul;
long unsigned map_max_x=1024;
long unsigned map_max_y=1024;
double forward=0,upward=0,rightward=0;
double t0,t1,frames, fps;
double dT=.03;
double view_angle;
double u,v;
double u0,v0,w0;
double a,b,c,d;
double aa,bb,cc,dd;
double front_plane=28.0, back_plane=10000.0, plane_const;
double z_scale_factor;
double zadd=5.0;
double scale_terra=.1;
struct time t;
float ftemp;
int maxn;
int draw_2d=0;
// to scale view
BG_Matrix scaling;
// the rotation matrices
BG_Matrix Rx,Ry,Rz;
BG_Matrix N,T,M,OTemp;
BG_Matrix M1,M2,M3;
BG_Matrix E_TM,B_TM,O_TM,Temp_TM,T_TM,TM;
BG_3pt *framemin, *framemax;
BG_3pt eye_ptlist[5000];
float xlist[5000];
int xindexlist[5000];
BG_3pt pt1, pt2, pt3, pt4, vect1, vect2, vect3;
BG_3pt light_ray;
BG_3pt LR; // light ray
BG_3pt MD; // move direction
BG_3pt vn[162];
BG_3pt X_axis,Y_axis, Z_axis; // move direction
BG_ScreenCoor pt[4];
BG_MouseRange(0,0,BG_ScreenWidth,BG_ScreenHeight);
BG_ClearScreen(0);
// create a screen buffer in ram to do rendering
vscreen = GrCreateContext(BG_ScreenWidth,BG_ScreenHeight,NULL,NULL);
G_buffer = (unsigned char *)(vscreen->gc_frame.gf_baseaddr[0]);
if(firsttime==1)init_view(model);
firsttime=0;
X_axis.x=10.0;
X_axis.y=0.0;
X_axis.z=0.0;
Y_axis.x=0.0;
Y_axis.y=10.0;
Y_axis.z=0.0;
Z_axis.x=0.0;
Z_axis.y=0.0;
Z_axis.z=10.0;
//Rotation Matrices
Rx=BG_CalcRx(0);
Ry=BG_CalcRy(0);
Rz=BG_CalcRz(0);
//Scaling matrix
BG_IdentityMatrix( &scaling );
//focus=20.0; // ~79 degree total view
scaling.m[0][0]=focus*(double)(BG_ScreenHeight-1)/win_height; //scale x
scaling.m[0][1]=(BG_ScreenWidth/2);
scaling.m[2][1]=(BG_ScreenHeight/2);
scaling.m[2][2]=-focus*(double)(BG_ScreenHeight-1)/win_width; // scale y
plane_const=(double)USHRT_MAX/((double)back_plane-(double)front_plane);
BG_MouseToXY(BG_ScreenWidth/2,BG_ScreenHeight/2);
BG_MouseStatus();
oldmx=BG_MouseX;
oldmy=BG_MouseY;
// direction of light source
// like sun pointing down
light_ray.x=.0;
light_ray.y=-1.0;
light_ray.z=-1.0;
a=cos(0);
b=sin(0);
/*
My general prescription for viewing and such:
1. Get movement of eye, ORI & POS
a. if moved, then update POS
b. if rotated, then calc the rotation matrix: Ri=CalcRi(ang)
and then rotate ORI: ORI=Ri*ORI
2. Construct a transformation matrix for the eye: E_TM=SCALE*ORI*POS
3. Rotate and Move all objects in a similar manner to form
the objects transformation matrix: O_TM=O_POS*O_ORI
4. Construct the final transformation for each object: TM=E_TM*O_TM
5. Convert Points to eye's coords
a. make vector,O_P, from origin of object to point of object
b. new pt in eye frame is P=TM*O_P (all 4 components)
6. Rotate/Calc side Normals to perform Culling
a. make side normal,N, in eye coords
b. make vector from eye origin to a point on the side,EV
c. if N(dot)EV<0 then draw side
7. Project the 3d points to the screen
a. if pt.y>0 then its in front so draw it
b. get window (screen) coords
win_x=pt.x/pt.y;
win_y=pt.z/pt.y;
8. Draw the polygon using the above points (and clip)
9. Get input, Calulate, and Repeat
I should scale like above, but I'm doing it later so i understand the
math better.
*/
int light_move=0;
update=1;
cycle=0;
// main loop
while(mainloop==1)
{
if(kbhit())
{
if((cur_key=getch())==0x0)
{ cur_key=getch();
switch(cur_key)
{
case ARROW_DOWN: upward=-1.0; break;
case ARROW_UP: upward=1.0; break;
case ARROW_LEFT: {frame--; if(frame<0) frame=(int)model->blocks-1;break;}
case ARROW_RIGHT: {frame++; if(frame>=(int)model->blocks) frame=0; break;}
}
}
else{
switch(cur_key)
{
//case KEY_ENTER: mainloop=0; break;
case 27: mainloop=0; draw_2d=0; break;
case '1': mainloop=0; draw_2d=2; break;
case '2': mainloop=0; draw_2d=1; break;
case 'V': case 'v': if(draw_vertices==0) draw_vertices=1; else draw_vertices=0; break;
case 'T': case 't': if(draw_wire==0) draw_wire=1; else draw_wire=0; break;
case '\t':
if(ii==5) {ii=2; draw_flat=1;draw_gshade=0;draw_textured=0;draw_gtextured=0;}
else if(ii==2) { ii=3; draw_flat=0;draw_gshade=1;draw_textured=0; draw_gtextured=0;}
else if(ii==3){ ii=4; draw_flat=0;draw_textured=1;draw_gshade=0; draw_gtextured=0;}
else { ii=5; draw_flat=0;draw_textured=0;draw_gshade=0; draw_gtextured=1;}
break;
case 'h': if(show_head==0) show_head=1; else show_head=0; break;
case 'c': if(cycle==1) cycle=0; else cycle=1; break;
case 'b': if(back_color==0) back_color=0x08080808;
else if(back_color==0x08080808) back_color=0x0F0F0F0F;
else back_color=0;
break;
// case 'l': if(light_move==0) light_move=1; else light_move=0; break;
case 'r':
BG_ZeroMatrix( &model->sit.dir_matrix );
model->sit.dir_matrix.m[0][0]= 1.0;
model->sit.dir_matrix.m[1][1]= 1.0;
model->sit.dir_matrix.m[2][2]= 1.0;
model->sit.dir_matrix.m[3][3]= 1.0;
break;
case ',': case '<': if(model->cur_skin==0) model->cur_skin=model->num_skins-1;
else model->cur_skin-=1;
break;
case '.': case '>': model->cur_skin++;
if(model->cur_skin==model->num_skins) model->cur_skin=0;
break;
case '\"': case '\'': model->bcolor++;
if(model->bcolor>13)model->bcolor=0;
break;
case ';': case ':': model->bcolor--;
if(model->bcolor<0)model->bcolor=13;
break;
case '}': case ']': model->tcolor++;
if(model->tcolor>13)model->tcolor=0;
break;
case '{': case '[': model->tcolor--;
if(model->tcolor<0) model->tcolor=13;
break;
case 's': //screen shot
{
for(i=0;i<100; i++)
{
sprintf(str,"pic%d.bmp",i);
//see if file exists
in=fopen(str,"rb");
if(in==NULL)
{
in=fopen(str,"wb");
BG_WriteBMP(in, pal, G_buffer, BG_ScreenWidth, BG_ScreenHeight);
fclose(in);
break;
}
}
break;
}
}
}
update=1;
}
// check on mouse
BG_MouseStatus();
//if not moving light, move object
// if(light_move==0)
// {
if((BG_MouseLeft)&&(BG_MouseX!=oldmx))
{
i=(oldmx-BG_MouseX);
Rz=BG_CalcRz((byte)i);
model->sit.dir_matrix=BG_MatrixMult(&Rz,&model->sit.dir_matrix);
zed=1;
update=1;
}
if((BG_MouseRight)&&(BG_MouseY!=oldmy))
{
i=(BG_MouseY-oldmy);
forward=i;
update=1;
}
if((BG_MouseLeft)&&(BG_MouseY!=oldmy))
{
i=(oldmy-BG_MouseY);
Ry=BG_CalcRy((byte)i);
model->sit.dir_matrix=BG_MatrixMult(&Ry,&model->sit.dir_matrix);
update=1;
}
// }
// else move light source
// else
// {
if((BG_MouseX!=oldmx)&&(!BG_MouseRight)&&(!BG_MouseLeft))
{
i=(oldmx-BG_MouseX);
Rz=BG_CalcRz((byte)i);
light_ray =BG_MatrixVector3(&Rz,&light_ray);
update=1;
}
if((BG_MouseY!=oldmy)&&(!BG_MouseRight)&&(!BG_MouseLeft))
{
i=(oldmy-BG_MouseY);
Ry=BG_CalcRy((byte)i);
light_ray =BG_MatrixVector3(&Ry,&light_ray);
update=1;
}
// }
if(cycle==1)
{
frame++;
update=1;
if(frame>=(int)model->blocks) frame=0;
}
BG_MouseToXY(BG_ScreenWidth/2,BG_ScreenHeight/2);
oldmx=BG_ScreenWidth/2;//BG_MouseX;
oldmy=BG_ScreenHeight/2;//BG_MouseY;
// if something has changed, redraw screen
if(update==1)
{
MD.x=rightward;
MD.y=forward;
MD.z=upward;
MD=BG_VectorMatrix3(&MD,&eyeball.dir_matrix);
forward=0;
upward=0;
rightward=0;
eyeball.pos.x+=MD.x;
if(eyeball.pos.x>=(double)map_max_x) eyeball.pos.x=map_max_x-1;
if(eyeball.pos.x<0.0) eyeball.pos.x=0;
eyeball.pos.y+=MD.y;
if(eyeball.pos.y>=(double)map_max_y) eyeball.pos.y=map_max_y-1;
if(eyeball.pos.y<0.0) eyeball.pos.y=0;
eyeball.ix=(unsigned)eyeball.pos.x;
eyeball.iy=(unsigned)eyeball.pos.y;
eyeball.pos.z+=MD.z;
eyeball.pos_matrix.m[0][3]=-eyeball.pos.x;
eyeball.pos_matrix.m[1][3]=-eyeball.pos.y;
eyeball.pos_matrix.m[2][3]=-eyeball.pos.z;
// eye transformation matrix
E_TM=BG_MatrixMult(&eyeball.dir_matrix,&eyeball.pos_matrix);
// the light ray
LR=BG_MatrixVector4(&eyeball.dir_matrix,&light_ray);
BG_Normalize(&LR);
//***************************************************************************
//***************************************************************************
// draw objects !!!!!!!!!!!!!!!!!!!!!!!!
//***************************************************************************
//***************************************************************************
// object's transformation matrix
O_TM=BG_MatrixMult(&model->sit.pos_matrix,&model->sit.dir_matrix);
// overall transformation matrix
TM=BG_MatrixMult(&E_TM,&O_TM);
i=0;
// put all points in eyeballs coordinates
for(k=0; k < model->block[frame].num_pts+8; k++)
{
eye_ptlist[k]=BG_MatrixVector4(&TM,&model->block[frame].ptlist[k]);
}
// put all vertex normals in eye's coords
for(k=0; k < 162; k++)
{
vn[k]=BG_MatrixVector3(&TM,&vertex_normal[k]);
}
// find farthest point of each poly from eye.
for(k=0; k <model->block[frame].num_sides ; k++)
{
xlist[k]=-1e23;
for(l=0; l < 3; l++)
{
if(eye_ptlist[model->block[frame].side[k].pt[l]].y>xlist[k])
xlist[k]=eye_ptlist[model->block[frame].side[k].pt[l]].y;
}
xindexlist[k]=k;
}
// now sort polys by furthest point
sort(xlist,xindexlist,0,model->block[frame].num_sides-1);
G_clear(back_color);
// if show header, draw points at bounding box
if(show_head)
{
for(k=0;k<8;k++)
{
pt1=eye_ptlist[model->block[frame].num_pts+k];
pt1=BG_MatrixVector4(&scaling,&pt1);
if((pt1.y>0))//front_plane)&&(pt1.y<back_plane))
{
u=pt1.x/pt1.y;
v=pt1.z/pt1.y;
mdlpts.x[0]=(int)u;
mdlpts.x[1]=(int)v;
G_dot(mdlpts.x,250);
}
}
}
//do all sides
num_screen_sides=0;
for(k=0; k <model->block[frame].num_sides ; k++)
{
num_screen_pts=0;
// find normals for culling
pt1=eye_ptlist[model->block[frame].side[xindexlist[k]].pt[0]];
vect1=BG_MatrixVector3(&TM,&model->block[frame].side[xindexlist[k]].normal);
// dot normal with a vector which points from the eye to the side
a = BG_DotProduct(&vect1,&pt1);
// if in front of eyeball...
if( a < 0.0 )
{
// see how much normal is pointing towards light for flat shading
if((b= BG_DotProduct(&vect1,&LR)+1.) >2.) b=2.0;
if(b < 0.) b=0.;
draw_poly=1;
// do each point on each side
for(l=0; l < 3; l++)
{
u=0;
v=0;
pt1.x=eye_ptlist[model->block[frame].side[xindexlist[k]].pt[l]].x;
pt1.y=eye_ptlist[model->block[frame].side[xindexlist[k]].pt[l]].y;
pt1.z=eye_ptlist[model->block[frame].side[xindexlist[k]].pt[l]].z;
pt1=BG_MatrixVector4(&scaling,&pt1);
num_screen_sides++;
// front and back plane clipping
if((pt1.y>0))//front_plane)&&(pt1.y<back_plane))
{
// put points in 2d screen coords
u=pt1.x/pt1.y;
v=pt1.z/pt1.y;
// put data in 3dgpl style for rendering
mdlpts.x[l*ii]=(int)u;
mdlpts.x[l*ii+1]=(int)v;
if(draw_gshade)
{
//see how much normal is pointed towards lighgt
b= 1.-BG_DotProduct(&vn[model->block[frame].nindex[model->block[frame].side[xindexlist[k]].pt[l]]],&LR);
b=b*.5;
if(b < 0) b=0;
// scale intesity from 0 to 15 (different from colormap)
mdlpts.x[l*3+2]=(int)(15.*(1.-b));//15-(int)(.5*b*15.0);
}
if(draw_textured)
{
// get coords of texture
if((model->vertex[3*model->triangle[xindexlist[k]*4+l+1]]==32)
&&
(model->triangle[xindexlist[k]*4]==0))
{
mdlpts.x[l*4+2]=model->skinw/2+model->vertex[3*model->triangle[xindexlist[k]*4+l+1]+1];
mdlpts.x[l*4+3]=model->vertex[3*model->triangle[xindexlist[k]*4+l+1]+2];
}
else
{
mdlpts.x[l*4+2]=model->vertex[3*model->triangle[xindexlist[k]*4+l+1]+1];
mdlpts.x[l*4+3]=model->vertex[3*model->triangle[xindexlist[k]*4+l+1]+2];
}
}
if(draw_gtextured)
{
// get coords of texture
if((model->vertex[3*model->triangle[xindexlist[k]*4+l+1]]==32)
&&
(model->triangle[xindexlist[k]*4]==0))
{
mdlpts.x[l*5+2]=model->skinw/2+model->vertex[3*model->triangle[xindexlist[k]*4+l+1]+1];
mdlpts.x[l*5+3]=model->vertex[3*model->triangle[xindexlist[k]*4+l+1]+2];
}
else
{
mdlpts.x[l*5+2]=model->vertex[3*model->triangle[xindexlist[k]*4+l+1]+1];
mdlpts.x[l*5+3]=model->vertex[3*model->triangle[xindexlist[k]*4+l+1]+2];
}
//see how much normal is pointed towards lighgt
b= 1.-BG_DotProduct(&vn[model->block[frame].nindex[model->block[frame].side[xindexlist[k]].pt[l]]],&LR);
b=b*.5;
if(b < 0) b=0;
// scale intesity from 0 to 15
mdlpts.x[l*5+4]=(int)(b*15.);//15-(int)(.5*b*15.0);
}
}
else //don't draw if not in front
{
draw_poly=0;
num_screen_sides--;
break;
}
num_screen_pts++;
}
// now call the rendering functs
if(draw_poly)
{
mdlpts.x[3*ii]=mdlpts.x[0];
mdlpts.x[3*ii+1]=mdlpts.x[1];
if(draw_flat)
G_ambient_polygon(mdlpts.x,3,(int)(b*15.0*.5));
else if(draw_gtextured)
{
// must set wrap around point
mdlpts.x[3*ii+2]=mdlpts.x[2];
mdlpts.x[3*ii+3]=mdlpts.x[3];
mdlpts.x[3*ii+4]=mdlpts.x[4];
G_gtex_poly(mdlpts.x,3,model->skin[model->cur_skin].bitmap,model->skinw, model);
}
else if(draw_gshade)
{
// must set wrap around point
mdlpts.x[3*ii+2]=mdlpts.x[2];
G_shaded_polygon(mdlpts.x,3);
}
else if(draw_textured)
{
// must set wrap around point
mdlpts.x[3*ii+2]=mdlpts.x[2];
mdlpts.x[3*ii+3]=mdlpts.x[3];
G_textured_polygon(mdlpts.x,3,model->skin[model->cur_skin].bitmap,model->skinw, model);
}
if(draw_wire)
{
G_line(mdlpts.x,mdlpts.x+ii,8);
G_line(mdlpts.x+ii,mdlpts.x+2*ii,8);
G_line(mdlpts.x+2*ii,mdlpts.x,8);
}
if(draw_vertices)
{
l=250;
G_dot(mdlpts.x,l);
G_dot(mdlpts.x+ii,l);
G_dot(mdlpts.x+2*ii,l);
}
}
}
}
// draw some text for some things
if(light_move==1)
{
sprintf(str,"move light");
MDL_Text(BG_ScreenWidth-90,2,str,253);
}
if(show_head)
{
sprintf(str,"Frame Name: %s",model->block[frame].name);
MDL_Text(5,2,str,253);
sprintf(str,"Frame #: %d",(int)frame);
MDL_Text(5,10,str,253);
/* sprintf(str,"Bounding Box: %d %d %d : %d %d %d",
model->frame[frame].sframe.bboxmin.v[0],
model->frame[frame].sframe.bboxmin.v[1],
model->frame[frame].sframe.bboxmin.v[2],
model->frame[frame].sframe.bboxmax.v[0],
model->frame[frame].sframe.bboxmax.v[1],
model->frame[frame].sframe.bboxmax.v[2]);
MDL_Text(5,18,str,253);
*/
}
// use GRX to BitBlt Ram screen buffer to current active video screen
GrBitBltNC(NULL,0,0,vscreen,0,0,BG_ScreenWidth-1,BG_ScreenHeight-1,GrWRITE);
}
update=0;
}
// get rid of ram screen buffer
GrDestroyContext(vscreen);
// jump to next section
if(draw_2d==1) return 1;
else if(draw_2d==2) return 2;
else return 0;
}
// sorting routine from some book. Not the fastest, but it works.
void sort(float v[], int vi[], int left, int right)
{
int i, last;
if(left>=right) return;
swap(v,vi,left,(left+right)/2);
last=left;
for(i=left+1; i<=right; i++)
if(v[i]>v[left])
swap(v,vi,++last,i);
swap(v,vi,left,last);
sort(v,vi,left,last-1);
sort(v,vi,last+1,right);
}
void swap(float v[], int vi[], int i, int j)
{
float temp;
int itemp;
temp = v[i];
v[i]=v[j];
v[j]=temp;
itemp=vi[i];
vi[i]=vi[j];
vi[j]=itemp;
}
// this routine just sets the initial conditions
void init_view(MDL_model *model)
{
model->sit.pos.x=0.0;
model->sit.pos.y=0.0;
model->sit.pos.z=0.0;
eyeball.ix=(unsigned)eyeball.pos.x;
eyeball.iy=(unsigned)eyeball.pos.y;
eyeball.pos.x=175.0; eyeball.pos.y=0.0; eyeball.pos.z=12.0;
// model.pos.x=0.0;
// model.pos.y=0.0;
// model.pos.z=0.0;
// eyeball.ix=(unsigned)eyeball.pos.x;
// eyeball.iy=(unsigned)eyeball.pos.y;
BG_IdentityMatrix( &eyeball.pos_matrix );
BG_IdentityMatrix( &model->sit.pos_matrix );
eyeball.pos_matrix.m[0][3]=eyeball.pos.x;
eyeball.pos_matrix.m[1][3]=eyeball.pos.y;
eyeball.pos_matrix.m[2][3]=eyeball.pos.z;
model->sit.pos_matrix.m[0][3]=model->sit.pos.x;
model->sit.pos_matrix.m[1][3]=model->sit.pos.y;
model->sit.pos_matrix.m[2][3]=model->sit.pos.z;
/*
Direction matrix:
right 1 0 0 0
looking 0 1 0 0
up 0 0 1 0
translation 0 0 0 1
*/
BG_ZeroMatrix( &eyeball.dir_matrix );
BG_ZeroMatrix( &model->sit.dir_matrix );
eyeball.dir_matrix.m[0][1]= 1.0;
eyeball.dir_matrix.m[1][0]= -1.0;
eyeball.dir_matrix.m[2][2]= 1.0;
eyeball.dir_matrix.m[3][3]= 1.0;
model->sit.dir_matrix.m[0][0]= 1.0;
model->sit.dir_matrix.m[1][1]= 1.0;
model->sit.dir_matrix.m[2][2]= 1.0;
model->sit.dir_matrix.m[3][3]= 1.0;
}