23 #include <sys/types.h> 79 commonState->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
94 tdble b_offset = 0.0f;
95 tdble curAngle = 0.0f;
98 #define BRK_ANGLE (2.0 * M_PI / (tdble)BRK_BRANCH) 99 #define BRK_OFFSET 0.2 101 switch(wheel_index) {
104 b_offset =
BRK_OFFSET - car->_tireWidth(wheel_index) / 2.0;
108 b_offset = car->_tireWidth(wheel_index) / 2.0 -
BRK_OFFSET;
112 b_offset =
BRK_OFFSET - car->_tireWidth(wheel_index) / 2.0;
116 b_offset = car->_tireWidth(wheel_index) / 2.0 -
BRK_OFFSET;
121 ssgVertexArray *brk_vtx =
new ssgVertexArray(
BRK_BRANCH + 1);
122 ssgColourArray *brk_clr =
new ssgColourArray(1);
123 ssgNormalArray *brk_nrm =
new ssgNormalArray(1);
127 vtx[0] = vtx[2] = 0.0;
131 hubRadius = car->_brakeDiskRadius(wheel_index) * 0.6;
133 alpha = (float)i * 2.0 * M_PI / (
float)(
BRK_BRANCH - 1);
134 vtx[0] = hubRadius * cos(alpha);
136 vtx[2] = hubRadius * sin(alpha);
141 clr[0] = clr[1] = clr[2] = 0.0;
144 nrm[0] = nrm[2] = 0.0;
147 switch(wheel_index) {
160 ssgVtxTable *brk =
new ssgVtxTable(GL_TRIANGLE_FAN, brk_vtx, brk_nrm, NULL, brk_clr);
164 ssgTransform *wheel =
new ssgTransform;
169 brk_clr =
new ssgColourArray(1);
170 brk_nrm =
new ssgNormalArray(1);
173 alpha = curAngle + (float)i * 2.0 * M_PI / (
float)(
BRK_BRANCH - 1);
174 vtx[0] = car->_brakeDiskRadius(wheel_index) * cos(alpha);
176 vtx[2] = car->_brakeDiskRadius(wheel_index) * sin(alpha);
178 vtx[0] = car->_brakeDiskRadius(wheel_index) * cos(alpha) * 0.6;
180 vtx[2] = car->_brakeDiskRadius(wheel_index) * sin(alpha) * 0.6;
185 clr[0] = clr[1] = clr[2] = 0.1;
192 brk =
new ssgVtxTable(GL_TRIANGLE_STRIP, brk_vtx, brk_nrm, NULL, brk_clr);
201 brk_clr =
new ssgColourArray(1);
202 brk_nrm =
new ssgNormalArray(1);
205 alpha = - curAngle + (float)i * 2.0 * M_PI / (
float)(
BRK_BRANCH - 1);
206 vtx[0] = (car->_brakeDiskRadius(wheel_index) + 0.02) * cos(alpha);
208 vtx[2] = (car->_brakeDiskRadius(wheel_index) + 0.02) * sin(alpha);
210 vtx[0] = car->_brakeDiskRadius(wheel_index) * cos(alpha) * 0.6;
212 vtx[2] = car->_brakeDiskRadius(wheel_index) * sin(alpha) * 0.6;
226 brk =
new ssgVtxTable(GL_TRIANGLE_STRIP, brk_vtx, brk_nrm, NULL, brk_clr);
237 ssgTransform *whrotation =
new ssgTransform;
239 wheel->addKid(whrotation);
240 ssgSelector *whselector =
new ssgSelector;
241 whrotation->addKid(whselector);
244 float wheelRadius = car->_rimRadius(wheel_index) + car->_tireHeight(wheel_index);
247 for (j = 0; j < 4; j++) {
248 ssgBranch *whl_branch =
new ssgBranch;
249 ssgEntity *whl3d = 0;
254 const int bufsize = 1024;
257 if (wheel_dir != 0) {
258 snprintf(buf, bufsize,
"wheels/%s", wheel_dir);
265 if (wheel_obj != 0 && wheel_dir != 0) {
266 snprintf(buf, bufsize,
"%s%d.acc", wheel_obj, j);
274 ssgTransform *whl_size =
new ssgTransform;
277 sgSetVec4(wheelsz[0], wheelRadius * 2, SG_ZERO, SG_ZERO, SG_ZERO) ;
278 sgSetVec4(wheelsz[1], SG_ZERO, car->_tireWidth(wheel_index), SG_ZERO, SG_ZERO) ;
279 sgSetVec4(wheelsz[2], SG_ZERO, SG_ZERO, wheelRadius * 2, SG_ZERO) ;
280 sgSetVec4(wheelsz[3], SG_ZERO, SG_ZERO, SG_ZERO, SG_ONE) ;
282 whl_size->setTransform(wheelsz);
284 whl_size->addKid(whl3d);
289 ssgTransform *whl_mesh_transform =
new ssgTransform;
291 sgSetCoord(&wheelpos, 0, 0, 0, 180, 0, 0);
292 whl_mesh_transform->setTransform( &wheelpos);
293 whl_mesh_transform->addKid(whl3d);
294 whl_branch->addKid(whl_mesh_transform);
296 whl_branch->addKid(whl3d);
299 static sgVec2 toffset[4] = { {0.0, 0.5}, {0.5, 0.5}, {0.0, 0.0}, {0.5, 0.0} };
301 const int WHL_BRANCH = 16;
305 ssgVertexArray *whl_vtx =
new ssgVertexArray(2 * WHL_BRANCH);
306 ssgColourArray *whl_clr =
new ssgColourArray(2 * WHL_BRANCH);
307 ssgNormalArray *whl_nrm =
new ssgNormalArray(1);
311 for (i = 0; i < WHL_BRANCH; i++) {
312 alpha = (float)i * 2.0 * M_PI / (
float)(WHL_BRANCH - 1);
313 vtx[0] = wheelRadius * cos(alpha);
314 vtx[2] = wheelRadius * sin(alpha);
315 vtx[1] = - car->_tireWidth(wheel_index) / 2.0;
317 vtx[1] = car->_tireWidth(wheel_index) / 2.0;
320 clr[0] = clr[1] = clr[2] = 0.15;
322 clr[0] = clr[1] = clr[2] = 0.0;
327 ssgVtxTable *whl =
new ssgVtxTable(GL_TRIANGLE_STRIP, whl_vtx, whl_nrm, NULL, whl_clr);
334 whl_branch->addKid(whl);
338 switch(wheel_index) {
350 float colorfactor[2];
351 float norm_orig = nrm[1];
354 colorfactor[0] = 0.3f;
355 colorfactor[1] = 1.0f;
358 colorfactor[0] = 1.0f;
359 colorfactor[1] = 0.3f;
362 for (k = 0; k < 2; k++) {
363 ssgVertexArray *whl_vtx =
new ssgVertexArray(WHL_BRANCH + 1);
364 ssgTexCoordArray *whl_tex =
new ssgTexCoordArray(WHL_BRANCH + 1);
365 ssgColourArray *whl_clr =
new ssgColourArray(1);
366 ssgNormalArray *whl_nrm =
new ssgNormalArray(1);
368 clr[0] = 0.8f*colorfactor[k];
369 clr[1] = 0.8f*colorfactor[k];
370 clr[2] = 0.8f*colorfactor[k];
375 vtx[0] = vtx[2] = 0.0;
376 vtx[1] = (float)(2 * k - 1) * car->_tireWidth(wheel_index) / 2.0 - b_offset;
378 tex[0] = 0.25 + toffset[j][0];
379 tex[1] = 0.25 + toffset[j][1];
381 vtx[1] = (float)(2 * k - 1) * car->_tireWidth(wheel_index) / 2.0;
382 for (i = 0; i < WHL_BRANCH; i++) {
383 alpha = (float)i * 2.0 * M_PI / (
float)(WHL_BRANCH - 1);
384 vtx[0] = wheelRadius * cos(alpha);
385 vtx[2] = wheelRadius * sin(alpha);
387 tex[0] = 0.25 + 0.25 * cos(alpha) + toffset[j][0];
388 tex[1] = 0.25 + 0.25 * sin(alpha) + toffset[j][1];
391 ssgVtxTable *whl =
new ssgVtxTable(GL_TRIANGLE_FAN, whl_vtx, whl_nrm, whl_tex, whl_clr);
398 whl_branch->addKid(whl);
407 whselector->addKid(whl_branch);
418 const int BUFSIZE = 256;
420 const char *shdTexName;
428 ssgColourArray *shd_clr =
new ssgColourArray(1);
429 ssgNormalArray *shd_nrm =
new ssgNormalArray(1);
432 snprintf(buf, BUFSIZE,
"cars/%s;", car->_carName);
439 clr[0] = clr[1] = clr[2] = 1.0;
442 nrm[0] = nrm[1] = 0.0;
453 vtx[1] = -car->_dimension_y *
MULT / 2.0;
458 vtx[1] = car->_dimension_y *
MULT / 2.0;
480 if (l->isAKindOf (ssgTypeBranch())) {
482 ssgBranch* br = (ssgBranch*) l;
484 for (
int i = 0 ; i < br -> getNumKids () ; i++ ) {
485 ssgEntity* ln = br->getKid (i);
490 if (l->isAKindOf (ssgTypeVtxTable())) {
493 ssgVtxTable* vt = (ssgVtxTable*) l;
494 Nv = vt->getNumVertices();
495 vt->getVertexList ((
void**) &v);
496 tdble sigma = sgLengthVec3 (force);
497 tdble invSigma = 5.0;
499 for (
int i=0; i<Nv; i++) {
500 tdble r = sgDistanceSquaredVec3 (poc, v[i]);
501 tdble f = exp(-r*invSigma)*5.0;
502 v[i][0] += force[0]*f;
503 v[i][1] += force[1]*f;
505 v[i][2] += (force[2]+0.02*sin(2.0*r + 10.0*sigma))*f;
515 const int BUFSIZE=4096;
519 ssgEntity *carEntity;
521 ssgTransform *wheel[4];
527 const int PATHSIZE=256;
532 const char *lightType;
544 ssgSetCurrentOptions ( &
options ) ;
547 handle = car->_carHandle;
551 car->_exhaustNb =
MIN(car->_exhaustNb, 2);
553 for (i = 0; i < car->_exhaustNb; i++) {
562 for (i = 0; i < lightNum; i++) {
586 GfOut(
"[gr] Init(%d) car %s for driver %s index %d\n", index, car->_carName, car->_modName, car->_driverIndex);
590 lg += snprintf(
grFilePath + lg, BUFSIZE - lg,
"drivers/%s/%d/%s;", car->_modName, car->_driverIndex, car->_carName);
591 lg += snprintf(
grFilePath + lg, BUFSIZE - lg,
"drivers/%s/%d;", car->_modName, car->_driverIndex);
592 lg += snprintf(
grFilePath + lg, BUFSIZE - lg,
"drivers/%s/%s;", car->_modName, car->_carName);
593 lg += snprintf(
grFilePath + lg, BUFSIZE - lg,
"drivers/%s;", car->_modName);
594 lg += snprintf(
grFilePath + lg, BUFSIZE - lg,
"cars/%s", car->_carName);
597 if (strlen(
param) != 0) {
617 GfOut(
"Error not enough levels of detail\n");
623 ssgBranch *carBody =
new ssgBranch;
625 LODSel->addKid(carBody);
628 snprintf(buf, BUFSIZE,
"cars/%s", car->_carName);
630 snprintf(buf, BUFSIZE,
"drivers/%s/%d;drivers/%s;cars/%s", car->_modName, car->_driverIndex, car->_modName, car->_carName);
636 snprintf(buf, BUFSIZE,
"%s.ac", car->_carName);
645 char* stmp = strdup(
"DRIVER");
646 ssgBranch *b = (ssgBranch *)carEntity->getByName(stmp);
651 ssgBranch *bp = b->getParent(0);
652 bp->addKid(
grCarInfo[index].driverSelector);
663 carBody->addKid(carEntity);
665 for (i = 0; i < 4; i++){
667 carBody->addKid(wheel[i]);
675 for (i = 2; i < nranges; i++) {
676 carBody =
new ssgBranch;
683 carBody->addKid(carEntity);
686 for (j = 0; j < 4; j++){
687 carBody->addKid(wheel[j]);
690 LODSel->addKid(carBody);
695 LODSel->select(
grCarInfo[index].LODSelectMask[0]);
722 shadow->setCullFace(TRUE);
723 shadow->getVertexList((
void**)&vtx);
728 vtx[i][2] =
RtTrackHeightG(car->_trkPos.seg, vtx[i][0], vtx[i][1]) + 0.00;
744 seg = car->_trkPos.seg;
749 lg += car->_trkPos.toStart;
752 lg += car->_trkPos.toStart * seg->
radius;
765 static float maxVel[3] = { 20.0, 40.0, 70.0 };
780 if ((car == curCar) && (dispCarFlag != 1)) {
783 lod = curCam->
getLODFactor(car->_pos_X, car->_pos_Y, car->_pos_Z);
799 sgCopyMat4(
grCarInfo[index].carPos, car->_posMat);
805 if ((car == curCar) && (dispCarFlag != 1)) {
815 if ((car == curCar) && (dispCarFlag != 1)) {
825 for (i = 0; i < 4; i++) {
833 for (j = 0; j < 3; j++) {
834 if (fabs(car->_wheelSpinVel(i)) < maxVel[j])
839 clr[0] = 0.1 + car->_brakeTemp(i) * 1.5;
840 clr[1] = 0.1 + car->_brakeTemp(i) * 0.3;
841 clr[2] = 0.1 - car->_brakeTemp(i) * 0.3;
#define REAR_LFT
rear left
ssgEntity * grssgLoadAC3D(const char *fname, const ssgLoaderOptions *options)
float getLODFactor(float x, float y, float z)
#define RM_CAR_STATE_DNF
Car did not finish.
#define FRNT_LFT
front left
#define FRNT_RGT
front right
ssgStateSelector * envSelector
void grUpdateCarlight(tCarElt *car, class cGrPerspCamera *curCam, int disp)
void grAddSmoke(tCarElt *car, double t)
int type
Geometrical type:
void grInitShadow(tCarElt *car)
static ssgLoaderOptionsEx options
tCollisionState collision_state
collision state
ssgTransform * carTransform
ssgColourArray * brkColor[4]
#define PRM_WHEEL_TEXTURE
static ssgTransform * initWheel(tCarElt *car, int wheel_index)
EWheelDetail grUseDetailedWheels
virtual void transform(const sgMat4 m)
#define REAR_RGT
rear right
tdble lgfromstart
Length of beginning of segment from starting line.
static void grDrawShadow(tCarElt *car, int visible)
tdble ay
angle along y axis
const char * GfParmGetStr(void *parmHandle, const char *path, const char *key, const char *deflt)
Get a string parameter from the parameter set handle.
#define RAD2DEG(x)
Radian to degree conversion.
The Gaming Framework API (client part).
ssgSelector * wheelselector[4]
static const int GR_SHADOW_POINTS
ssgEntity * grssgCarLoadAC3D(const char *fname, const ssgLoaderOptions *options, int index)
void grInitCar(tCarElt *car)
void grInitCommonState(void)
#define LIGHT_TYPE_FRONT2
tPosd relPos
position relative to GC
ssgSelector * driverSelector
virtual ssgBase * clone(int clone_flags=0)
#define LIGHT_TYPE_BRAKE2
float tdble
Floating point type used in TORCS.
#define DBG_SET_NAME(base, name, index, subindex)
ssgVtxTableShadow * shadowBase
void grUpdateSkidmarks(tCarElt *car, double t)
update if necessary the skidmarks for a car
Graphic Module Interface Definition.
void grAddCarlight(tCarElt *car, int type, sgVec3 pos, double size)
tdble radius
Radius in meters of the middle of the track (>0)
ssgVtxTableShadow * shadowCurr
Parameter header structure, a parameter can either carry a numeric or a string value, numeric value is constraint by min and max, string value by options in within.
This is the car structure.
ssgBranch * CarsAnchorTmp
ssgTransform * wheelPos[4]
#define PRM_SHADOW_TEXTURE
tdble GfParmGetNum(void *handle, const char *path, const char *key, const char *unit, tdble deflt)
Get a numerical parameter from the parameter set handle.
Track segment (tTrackSeg) The segments can be straights (type TR_STR): (the track goes from the right...
#define _dimension_x
short cut to tInitCar::dimension.x
void grPropagateDamage(ssgEntity *l, sgVec3 poc, sgVec3 force, int cnt)
static ssgSimpleState * brakeState
tdble az
angle along z axis
ssgStateSelector * grEnvSelector
ssgState * grSsgLoadTexState(const char *img)
int GfParmGetEltNb(void *handle, const char *path)
Count the number of subsections in a section in the parameter set handle.
ssgTransform * wheelRot[4]
void grDrawCar(tCarElt *car, tCarElt *curCar, int dispCarFlag, int dispDrvFlag, double curTime, class cGrPerspCamera *curCam)
void grDrawSkidmarks(tCarElt *car)
ssgSelector * LODSelector
void grLinkCarlights(tCarElt *car)
tdble ax
angle along x axis
Track Structure and Track Loader Module Definition.
void grInitBoardCar(tCarElt *car)
static ssgSimpleState * commonState
tdble grGetDistToStart(tCarElt *car)