📄 car.cpp
字号:
#include "..\..\lib\Fly3D.h"
#include "..\gamelib\gamelib.h"
#include "car.h"
void mp_message(int from,mp_msg *msg);
camera_desc cd_camera;
car_desc cd_car;
sun_desc cd_sun;
BOOL APIENTRY DllMain(HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
__declspec( dllexport )
int num_classes()
{
return 3;
}
__declspec( dllexport )
class_desc *get_class_desc(int i)
{
switch(i)
{
case 0:
return &cd_camera;
case 1:
return &cd_car;
case 2:
return &cd_sun;
default:
return 0;
}
}
__declspec( dllexport )
int fly_message(int msg,int param,void *data)
{
switch(msg)
{
case FLYM_DRAWSCENE:
if (directx->mpmode!=FLYMP_SERVER)
{
// sets view
flyengine->set_camera(flyengine->cam);
// draws the sun
if (flyengine->cam->type==TYPE_CAMERA)
if (((camera *)flyengine->cam)->s)
((camera *)flyengine->cam)->s->draw();
// draws the scene
flyengine->draw_bsp(1);
// draw stencil shadow filter polygon
if (flyengine->stencil)
{
flyengine->start_text_mode();
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_NOTEQUAL,0,~0);
glColor3fv(&flyengine->shadowcolor.x);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
glBlendFunc(GL_ZERO, GL_SRC_COLOR);
glRecti(0, 0, screen_sx, screen_sy);
glDisable(GL_STENCIL_TEST);
}
}
break;
case FLYM_DRAWTEXT:
if (directx->mpmode!=FLYMP_SERVER)
{
static DWORD t=timeGetTime();
static int frame_rate=0,frame_count=0;
static char str[256];
frame_count++;
if (flyengine->cur_time-t>1000)
{
frame_rate=frame_count*1000/(flyengine->cur_time-t);
t=flyengine->cur_time;
frame_count=0;
}
if (flyengine->cur_time - flyengine->status_msg_time > 2000)
{
sprintf(str,"FPS:%i N:%i",frame_rate,flyengine->nodedrawcount);
flyengine->draw_text( screen_sx-96, 0, str );
}
}
break;
case FLYM_UPDATESCENE:
{
bsp_object *obj=0;
while(obj=flyengine->get_next_active_object(obj,TYPE_CAR))
if (obj==flyengine->player)
((car *)obj)->check_keys(param);
else if (((car *)obj)->player==0)
((car *)obj)->check_robot_keys(param);
}
break;
case FLYM_MPUPDATE:
((car *)flyengine->player)->mp_send_pos(FLYMP_MSG_POS,0);
return 0;
case FLYM_MPMESSAGE:
mp_message(param,(mp_msg *)data);
return 0;
}
return 1;
}
bsp_object *car::clone()
{
car *tmp=new car;
*tmp=*this;
tmp->source=this;
return tmp;
}
int car::get_custom_param_desc(int i,param_desc *pd)
{
if (pd!=0)
switch(i)
{
case 0:
pd->type='f';
pd->data=&maxvel;
strcpy(pd->name,"maxvel");
break;
case 1:
pd->type='f';
pd->data=&accel;
strcpy(pd->name,"accel");
break;
case 2:
pd->type='v';
pd->data=&veldamp;
strcpy(pd->name,"veldamp");
break;
case 3:
pd->type='f';
pd->data=&carwheelrot;
strcpy(pd->name,"carwheelrot");
break;
case 4:
pd->type='f';
pd->data=&carheight;
strcpy(pd->name,"carheight");
break;
case 5:
pd->type='f';
pd->data=&wheelmaxrot;
strcpy(pd->name,"wheelmaxrot");
break;
case 6:
pd->type='f';
pd->data=&wheelrotvel;
strcpy(pd->name,"wheelrotvel");
break;
case 7:
pd->type='f';
pd->data=&wheelrotdamp;
strcpy(pd->name,"wheelrotdamp");
break;
case 8:
pd->type='f';
pd->data=&wheelradius;
strcpy(pd->name,"wheelradius");
break;
case 9:
pd->type='f';
pd->data=&gravity;
strcpy(pd->name,"gravity");
break;
case 10:
pd->type='3';
pd->data=&carmesh;
strcpy(pd->name,"carmesh");
break;
case 11:
pd->type='3';
pd->data=&wheelmesh;
strcpy(pd->name,"wheelmesh");
break;
case 12:
pd->type='v';
pd->data=&wheelposft;
strcpy(pd->name,"wheelposft");
break;
case 13:
pd->type='v';
pd->data=&wheelposbk;
strcpy(pd->name,"wheelposbk");
break;
case 14:
pd->type='z';
pd->data=&track;
strcpy(pd->name,"track");
break;
case 15:
pd->type=TYPE_SHADOW;
pd->data=&carshadow;
strcpy(pd->name,"carshadow");
break;
}
return 16;
}
void car::init()
{
static vector delta(0,0,0);
if (source)
{
pos=source->pos+delta;
delta.z+=1000;
}
align_z(vector(0,0,1));
rotate(rot);
if (track)
totaltracktime=(int)(track->length()/maxvel);
if (wheelmesh && wheelmesh->edges==0)
wheelmesh->compute_normals(MESH_EDGES);
if (carmesh && carmesh->edges==0)
carmesh->compute_normals(MESH_EDGES);
}
void car::draw()
{
static light_vertex lights;
static vector viewpos,color,lightpos,v;
sun *s=0;
if (flyengine->cam->type==TYPE_CAMERA)
s=((camera *)flyengine->cam)->s;
if(carshadow && flyengine->stencil==0)
{
carshadow->reposition(this);
carshadow->draw();
}
if (carmesh && wheelmesh)
{
lights.nlights=0;
if (s)
{
lightpos=(s->pos-pos)*mat_t;
color=s->color;
lights.add_light(lightpos,color,0);
}
else
{
lightpos.null();
color.vec(1,1,1);
}
static mat4x4 m1,m2;
m1.set_rotation(-wheelroll,vector(1,0,0));
m2.set_rotation(-wheelrot,vector(0,1,0));
m2=m2*m1;
viewpos=(flyengine->cam->pos-pos)*mat_t;
float f=viewpos.length()/flyengine->viewmaxdist;
if (f<1.0f)
f=(1.0f-f)*flyengine->cartoonwidth;
else f=0.0f;
glPushMatrix();
glTranslatef(pos.x,pos.y,pos.z);
glMultMatrixf((float *)&mat);
carmesh->draw_cartoon(viewpos,color,lights,f);
v=viewpos*m1;
lights.pos[0]=lightpos*m1;
glPushMatrix();
glTranslatef(wheelposbk.x,wheelposbk.y,wheelposbk.z);
glRotatef(wheelroll,1,0,0);
wheelmesh->draw_cartoon(v,color,lights,f);
glPopMatrix();
glPushMatrix();
glTranslatef(-wheelposbk.x,wheelposbk.y,wheelposbk.z);
glRotatef(wheelroll,1,0,0);
wheelmesh->draw_cartoon(v,color,lights,f);
glPopMatrix();
v=viewpos*m2;
lights.pos[0]=lightpos*m2;
glPushMatrix();
glTranslatef(wheelposft.x,wheelposft.y,wheelposft.z);
glRotatef(wheelrot,0,1,0);
glRotatef(wheelroll,1,0,0);
wheelmesh->draw_cartoon(v,color,lights,f);
glPopMatrix();
glPushMatrix();
glTranslatef(-wheelposft.x,wheelposft.y,wheelposft.z);
glRotatef(wheelrot,0,1,0);
glRotatef(wheelroll,1,0,0);
wheelmesh->draw_cartoon(v,color,lights,f);
glPopMatrix();
glPopMatrix();
}
if (flyengine->stencil && s)
draw_stencil_shadow(lightpos);
}
void car::draw_stencil_shadow(vector& lightpos)
{
// compute light direction
vector lightdir=lightpos-pos;
lightdir.normalize();
lightdir*=flyengine->shadowdepth;
// set current car pos and rotation
glPushMatrix();
glTranslatef(pos.x,pos.y,pos.z);
glMultMatrixf((float *)&mat);
// draw body shadow
carmesh->draw_shadow_volume(lightdir);
// draw back right wheel shadow
glPushMatrix();
glTranslatef(wheelposbk.x,wheelposbk.y,wheelposbk.z);
wheelmesh->draw_shadow_volume(lightdir);
glPopMatrix();
// draw back left wheel shadow
glPushMatrix();
glTranslatef(-wheelposbk.x,wheelposbk.y,wheelposbk.z);
wheelmesh->draw_shadow_volume(lightdir);
glPopMatrix();
// compute front wheel rotation
static mat4x4 m;
m.set_rotation(-wheelrot,vector(0,1,0));
lightdir=lightdir*m;
// draw front right wheel shadow
glPushMatrix();
glTranslatef(wheelposft.x,wheelposft.y,wheelposft.z);
glRotatef(wheelrot,0,1,0);
wheelmesh->draw_shadow_volume(lightdir);
glPopMatrix();
// draw front left wheel shadow
glPushMatrix();
glTranslatef(-wheelposft.x,wheelposft.y,wheelposft.z);
glRotatef(wheelrot,0,1,0);
wheelmesh->draw_shadow_volume(lightdir);
glPopMatrix();
glPopMatrix();
}
int car::step(int dt)
{
static vector p,v;
// if no contact, apply gravity
if (!contactobj)
vel.z-=gravity*dt;
// apply damping to the steering
if (wheelrot>=0.0f)
{
wheelrot-=wheelrotdamp*dt;
if (wheelrot<0.0f)
wheelrot=0.0f;
if (wheelrot>wheelmaxrot)
wheelrot=wheelmaxrot;
}
else
{
wheelrot+=wheelrotdamp*dt;
if (wheelrot>0.0f)
wheelrot=0.0f;
if (wheelrot<-wheelmaxrot)
wheelrot=-wheelmaxrot;
}
float len=vel.length();
// if moving
if (len>0.01f)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -