94 tdble b_offset = 0.0f;
95 tdble curAngle = 0.0f;
98#define BRK_ANGLE (2.0 * M_PI / (tdble)BRK_BRANCH)
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);
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) {
608 grCarInfo[index].carTransform =
new ssgTransform;
612 grCarInfo[index].LODSelector = LODSel =
new ssgSelector;
613 grCarInfo[index].carTransform->addKid(LODSel);
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);
649 grCarInfo[index].driverSelector =
new ssgSelector;
651 ssgBranch *bp = b->getParent(0);
652 bp->addKid(
grCarInfo[index].driverSelector);
653 grCarInfo[index].driverSelector->addKid(b);
655 grCarInfo[index].driverSelector->select(1);
656 grCarInfo[index].driverSelectorinsg =
true;
658 grCarInfo[index].driverSelectorinsg =
false;
663 carBody->addKid(carEntity);
665 for (i = 0; i < 4; i++){
667 carBody->addKid(wheel[i]);
669 grCarInfo[index].LODSelectMask[0] = 1 << selIndex;
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);
691 grCarInfo[index].LODSelectMask[i-1] = 1 << selIndex;
695 LODSel->select(
grCarInfo[index].LODSelectMask[0]);
766 static float maxVel[3] = { 20.0, 40.0, 70.0 };
781 if ((car == curCar) && (dispCarFlag != 1)) {
784 lod = curCam->
getLODFactor(car->_pos_X, car->_pos_Y, car->_pos_Z);
794 grCarInfo[index].driverSelector->select(1);
796 grCarInfo[index].driverSelector->select(0);
800 sgCopyMat4(
grCarInfo[index].carPos, car->_posMat);
801 sgCopyMat4(renderCarPos,
grCarInfo[index].carPos);
807 grCarInfo[index].carTransform->setTransform(renderCarPos);
809 if ((car == curCar) && (dispCarFlag != 1)) {
819 if ((car == curCar) && (dispCarFlag != 1)) {
826 grCarInfo[index].envSelector->selectStep(car->_trkPos.seg->envIndex);
829 for (i = 0; i < 4; i++) {
834 grCarInfo[index].wheelPos[i]->setTransform(&wheelpos);
836 grCarInfo[index].wheelRot[i]->setTransform(&wheelpos);
837 for (j = 0; j < 3; j++) {
838 if (fabs(car->_wheelSpinVel(i)) < maxVel[j])
841 grCarInfo[index].wheelselector[i]->select(1<<j);
842 clr =
grCarInfo[index].brkColor[i]->get(0);
843 clr[0] = 0.1 + car->_brakeTemp(i) * 1.5;
844 clr[1] = 0.1 + car->_brakeTemp(i) * 0.3;
845 clr[2] = 0.1 - car->_brakeTemp(i) * 0.3;