void grInitBoardCar(tCarElt *car) { char buf[4096]; int index; void *handle; const char *param; myLoaderOptions options ; tgrCarInfo *carInfo; tgrCarInstrument *curInst; tdble xSz, ySz, xpos, ypos; tdble needlexSz, needleySz; ssgSetCurrentOptions ( &options ) ; index = car->index; /* current car's index */ carInfo = &grCarInfo[index]; handle = car->_carHandle; /* Tachometer */ curInst = &(carInfo->instrument[0]); /* Load the Tachometer texture */ param = GfParmGetStr(handle, SECT_GROBJECTS, PRM_TACHO_TEX, "rpm8000.rgb"); sprintf(buf, "drivers/%s/%d;drivers/%s;cars/%s;data/textures", car->_modName, car->_driverIndex, car->_modName, car->_carName); grFilePath = strdup(buf); curInst->texture = (ssgSimpleState*)grSsgLoadTexState(param); free(grFilePath); cleanup[nstate] = curInst->texture; nstate++; /* Load the intrument placement */ xSz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_XSZ, (char*)NULL, 128); ySz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_YSZ, (char*)NULL, 128); xpos = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_XPOS, (char*)NULL, Winw / 2.0 - xSz); ypos = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_YPOS, (char*)NULL, 0); needlexSz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_NDLXSZ, (char*)NULL, 50); needleySz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_NDLYSZ, (char*)NULL, 2); curInst->needleXCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_XCENTER, (char*)NULL, xSz / 2.0) + xpos; curInst->needleYCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_YCENTER, (char*)NULL, ySz / 2.0) + ypos; curInst->digitXCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_XDIGITCENTER, (char*)NULL, xSz / 2.0) + xpos; curInst->digitYCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_YDIGITCENTER, (char*)NULL, 16) + ypos; curInst->minValue = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_MINVAL, (char*)NULL, 0); curInst->maxValue = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_MAXVAL, (char*)NULL, RPM2RADS(10000)) - curInst->minValue; curInst->minAngle = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_MINANG, "deg", 225); curInst->maxAngle = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_MAXANG, "deg", -45) - curInst->minAngle; curInst->monitored = &(car->_enginerpm); curInst->prevVal = curInst->minAngle; curInst->CounterList = glGenLists(1); glNewList(curInst->CounterList, GL_COMPILE); glBegin(GL_TRIANGLE_STRIP); { glColor4f(1.0, 1.0, 1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex2f(xpos, ypos); glTexCoord2f(0.0, 1.0); glVertex2f(xpos, ypos + ySz); glTexCoord2f(1.0, 0.0); glVertex2f(xpos + xSz, ypos); glTexCoord2f(1.0, 1.0); glVertex2f(xpos + xSz, ypos + ySz); } glEnd(); glEndList(); curInst->needleList = glGenLists(1); glNewList(curInst->needleList, GL_COMPILE); glBegin(GL_TRIANGLE_STRIP); { glColor4f(1.0, 0.0, 0.0, 1.0); glVertex2f(0, -needleySz); glVertex2f(0, needleySz); glVertex2f(needlexSz, -needleySz / 2.0); glVertex2f(needlexSz, needleySz / 2.0); } glEnd(); glEndList(); /* Speedometer */ curInst = &(carInfo->instrument[1]); /* Load the Speedometer texture */ param = GfParmGetStr(handle, SECT_GROBJECTS, PRM_SPEEDO_TEX, "speed360.rgb"); sprintf(buf, "drivers/%s/%d;drivers/%s;cars/%s;data/textures", car->_modName, car->_driverIndex, car->_modName, car->_carName); grFilePath = strdup(buf); curInst->texture = (ssgSimpleState*)grSsgLoadTexState(param); free(grFilePath); cleanup[nstate] = curInst->texture; nstate++; /* Load the intrument placement */ xSz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_XSZ, (char*)NULL, 128); ySz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_YSZ, (char*)NULL, 128); xpos = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_XPOS, (char*)NULL, Winw / 2.0); ypos = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_YPOS, (char*)NULL, 0); needlexSz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_NDLXSZ, (char*)NULL, 50); needleySz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_NDLYSZ, (char*)NULL, 2); curInst->needleXCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_XCENTER, (char*)NULL, xSz / 2.0) + xpos; curInst->needleYCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_YCENTER, (char*)NULL, ySz / 2.0) + ypos; curInst->digitXCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_XDIGITCENTER, (char*)NULL, xSz / 2.0) + xpos; curInst->digitYCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_YDIGITCENTER, (char*)NULL, 10) + ypos; curInst->minValue = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_MINVAL, (char*)NULL, 0); curInst->maxValue = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_MAXVAL, (char*)NULL, 100) - curInst->minValue; curInst->minAngle = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_MINANG, "deg", 225); curInst->maxAngle = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_MAXANG, "deg", -45) - curInst->minAngle; curInst->monitored = &(car->_speed_x); curInst->prevVal = curInst->minAngle; if (strcmp(GfParmGetStr(handle, SECT_GROBJECTS, PRM_SPEEDO_DIGITAL, "yes"), "yes") == 0) { curInst->digital = 1; } curInst->CounterList = glGenLists(1); glNewList(curInst->CounterList, GL_COMPILE); glBegin(GL_TRIANGLE_STRIP); { glColor4f(1.0, 1.0, 1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex2f(xpos, ypos); glTexCoord2f(0.0, 1.0); glVertex2f(xpos, ypos + ySz); glTexCoord2f(1.0, 0.0); glVertex2f(xpos + xSz, ypos); glTexCoord2f(1.0, 1.0); glVertex2f(xpos + xSz, ypos + ySz); } glEnd(); glEndList(); curInst->needleList = glGenLists(1); glNewList(curInst->needleList, GL_COMPILE); glBegin(GL_TRIANGLE_STRIP); { glColor4f(1.0, 0.0, 0.0, 1.0); glVertex2f(0, -needleySz); glVertex2f(0, needleySz); glVertex2f(needlexSz, -needleySz / 2.0); glVertex2f(needlexSz, needleySz / 2.0); } glEnd(); glEndList(); }
void grInitCar(tCarElt *car) { const int BUFSIZE=4096; char buf[BUFSIZE]; int index; int selIndex; ssgEntity *carEntity; ssgSelector *LODSel; ssgTransform *wheel[4]; int nranges; int i, j; void *handle; const char *param; int lg; const int PATHSIZE=256; char path[PATHSIZE]; myLoaderOptions options; sgVec3 lightPos; int lightNum; const char *lightType; int lightTypeNum; if (!CarsAnchorTmp) { CarsAnchorTmp = new ssgBranch(); } grInitBoardCar(car); TRACE_GL("loadcar: start"); ssgSetCurrentOptions ( &options ) ; grCarIndex = index = car->index; /* current car's index */ handle = car->_carHandle; /* Load visual attributes */ car->_exhaustNb = GfParmGetEltNb(handle, SECT_EXHAUST); car->_exhaustNb = MIN(car->_exhaustNb, 2); car->_exhaustPower = GfParmGetNum(handle, SECT_EXHAUST, PRM_POWER, NULL, 1.0); for (i = 0; i < car->_exhaustNb; i++) { snprintf(path, PATHSIZE, "%s/%d", SECT_EXHAUST, i + 1); car->_exhaustPos[i].x = GfParmGetNum(handle, path, PRM_XPOS, NULL, -car->_dimension_x / 2.0); car->_exhaustPos[i].y = -GfParmGetNum(handle, path, PRM_YPOS, NULL, car->_dimension_y / 2.0); car->_exhaustPos[i].z = GfParmGetNum(handle, path, PRM_ZPOS, NULL, 0.1); } snprintf(path, PATHSIZE, "%s/%s", SECT_GROBJECTS, SECT_LIGHT); lightNum = GfParmGetEltNb(handle, path); for (i = 0; i < lightNum; i++) { snprintf(path, PATHSIZE, "%s/%s/%d", SECT_GROBJECTS, SECT_LIGHT, i + 1); lightPos[0] = GfParmGetNum(handle, path, PRM_XPOS, NULL, 0); lightPos[1] = GfParmGetNum(handle, path, PRM_YPOS, NULL, 0); lightPos[2] = GfParmGetNum(handle, path, PRM_ZPOS, NULL, 0); lightType = GfParmGetStr(handle, path, PRM_TYPE, ""); lightTypeNum = LIGHT_NO_TYPE; if (!strcmp(lightType, VAL_LIGHT_HEAD1)) { lightTypeNum = LIGHT_TYPE_FRONT; } else if (!strcmp(lightType, VAL_LIGHT_HEAD2)) { lightTypeNum = LIGHT_TYPE_FRONT2; } else if (!strcmp(lightType, VAL_LIGHT_BRAKE)) { lightTypeNum = LIGHT_TYPE_BRAKE; } else if (!strcmp(lightType, VAL_LIGHT_BRAKE2)) { lightTypeNum = LIGHT_TYPE_BRAKE2; } else if (!strcmp(lightType, VAL_LIGHT_REAR)) { lightTypeNum = LIGHT_TYPE_REAR; } grAddCarlight(car, lightTypeNum, lightPos, GfParmGetNum(handle, path, PRM_SIZE, NULL, 0.2)); } grLinkCarlights(car); GfOut("[gr] Init(%d) car %s for driver %s index %d\n", index, car->_carName, car->_modName, car->_driverIndex); grFilePath = (char*)malloc(BUFSIZE); lg = 0; lg += snprintf(grFilePath + lg, BUFSIZE - lg, "drivers/%s/%d/%s;", car->_modName, car->_driverIndex, car->_carName); lg += snprintf(grFilePath + lg, BUFSIZE - lg, "drivers/%s/%d;", car->_modName, car->_driverIndex); lg += snprintf(grFilePath + lg, BUFSIZE - lg, "drivers/%s/%s;", car->_modName, car->_carName); lg += snprintf(grFilePath + lg, BUFSIZE - lg, "drivers/%s;", car->_modName); lg += snprintf(grFilePath + lg, BUFSIZE - lg, "cars/%s", car->_carName); param = GfParmGetStr(handle, SECT_GROBJECTS, PRM_WHEEL_TEXTURE, ""); if (strlen(param) != 0) { grGammaValue = 1.8; grMipMap = 0; grCarInfo[index].wheelTexture = grSsgLoadTexState(param); } grCarInfo[index].envSelector = (ssgStateSelector*)grEnvSelector->clone(); grCarInfo[index].envSelector->ref(); /* the base transformation of the car (rotation + translation) */ grCarInfo[index].carTransform = new ssgTransform; DBG_SET_NAME(grCarInfo[index].carTransform, car->_modName, index, -1); /* Level of details */ grCarInfo[index].LODSelector = LODSel = new ssgSelector; grCarInfo[index].carTransform->addKid(LODSel); snprintf(path, PATHSIZE, "%s/%s", SECT_GROBJECTS, LST_RANGES); nranges = GfParmGetEltNb(handle, path) + 1; if (nranges < 2) { GfOut("Error not enough levels of detail\n"); FREEZ(grFilePath); return; } /* First LOD */ ssgBranch *carBody = new ssgBranch; DBG_SET_NAME(carBody, "LOD", index, 0); LODSel->addKid(carBody); /* The car's model is under cars/<model> */ snprintf(buf, BUFSIZE, "cars/%s", car->_carName); ssgModelPath(buf); snprintf(buf, BUFSIZE, "drivers/%s/%d;drivers/%s;cars/%s", car->_modName, car->_driverIndex, car->_modName, car->_carName); ssgTexturePath(buf); grTexturePath = strdup(buf); /* loading raw car level 0*/ selIndex = 0; /* current selector index */ snprintf(buf, BUFSIZE, "%s.ac", car->_carName); /* default car name */ snprintf(path, PATHSIZE, "%s/%s/1", SECT_GROBJECTS, LST_RANGES); param = GfParmGetStr(handle, path, PRM_CAR, buf); grCarInfo[index].LODThreshold[selIndex] = GfParmGetNum(handle, path, PRM_THRESHOLD, NULL, 0.0); /*carEntity = ssgLoad(param);*/ carEntity = grssgCarLoadAC3D(param, NULL, index); grCarInfo[index].carEntity = carEntity; /* Set a selector on the driver */ char* stmp = strdup("DRIVER"); ssgBranch *b = (ssgBranch *)carEntity->getByName(stmp); free(stmp); grCarInfo[index].driverSelector = new ssgSelector; if (b) { ssgBranch *bp = b->getParent(0); bp->addKid(grCarInfo[index].driverSelector); grCarInfo[index].driverSelector->addKid(b); bp->removeKid(b); grCarInfo[index].driverSelector->select(1); grCarInfo[index].driverSelectorinsg = true; } else { grCarInfo[index].driverSelectorinsg = false; } DBG_SET_NAME(carEntity, "Body", index, -1); carBody->addKid(carEntity); /* add wheels */ for (i = 0; i < 4; i++){ wheel[i] = initWheel(car, i); carBody->addKid(wheel[i]); } grCarInfo[index].LODSelectMask[0] = 1 << selIndex; /* car mask */ selIndex++; grCarInfo[index].sx=carTrackRatioX; grCarInfo[index].sy=carTrackRatioY; /* Other LODs */ for (i = 2; i < nranges; i++) { carBody = new ssgBranch; snprintf(buf, BUFSIZE, "%s/%s/%d", SECT_GROBJECTS, LST_RANGES, i); param = GfParmGetStr(handle, buf, PRM_CAR, ""); grCarInfo[index].LODThreshold[selIndex] = GfParmGetNum(handle, buf, PRM_THRESHOLD, NULL, 0.0); /* carEntity = ssgLoad(param); */ carEntity = grssgCarLoadAC3D(param, NULL, index);; DBG_SET_NAME(carEntity, "LOD", index, i-1); carBody->addKid(carEntity); if (!strcmp(GfParmGetStr(handle, buf, PRM_WHEELSON, "no"), "yes")) { /* add wheels */ for (j = 0; j < 4; j++){ carBody->addKid(wheel[j]); } } LODSel->addKid(carBody); grCarInfo[index].LODSelectMask[i-1] = 1 << selIndex; /* car mask */ selIndex++; } /* default range selection */ LODSel->select(grCarInfo[index].LODSelectMask[0]); CarsAnchor->addKid(grCarInfo[index].carTransform); //grCarInfo[index].carTransform->print(stdout, "-", 1); FREEZ(grTexturePath); FREEZ(grFilePath); TRACE_GL("loadcar: end"); }
int grLoadScene(tTrack *track) { void *hndl = grTrackHandle; char *acname; ssgEntity *desc; char buf[256]; if (maxTextureUnits==0) { InitMultiTex(); } ssgSetCurrentOptions(&options); ssgAddTextureFormat(".png", grLoadPngTexture); grRegisterCustomSGILoader(); grTrack = track; TheScene = new ssgRoot; /* Landscape */ LandAnchor = new ssgBranch; TheScene->addKid(LandAnchor); /* Pit stops walls */ PitsAnchor = new ssgBranch; TheScene->addKid(PitsAnchor); /* Skid Marks */ SkidAnchor = new ssgBranch; TheScene->addKid(SkidAnchor); /* Car shadows */ ShadowAnchor = new ssgBranch; TheScene->addKid(ShadowAnchor); /* Car lights */ CarlightAnchor = new ssgBranch; TheScene->addKid(CarlightAnchor); /* Cars */ CarsAnchor = new ssgBranch; TheScene->addKid(CarsAnchor); /* Smoke */ SmokeAnchor = new ssgBranch; TheScene->addKid(SmokeAnchor); /* Lens Flares */ SunAnchor = new ssgBranch; TheScene->addKid(SunAnchor); initBackground(); grWrldX = (int)(track->max.x - track->min.x + 1); grWrldY = (int)(track->max.y - track->min.y + 1); grWrldZ = (int)(track->max.z - track->min.z + 1); grWrldMaxSize = (int)(MAX(MAX(grWrldX, grWrldY), grWrldZ)); acname = GfParmGetStr(hndl, TRK_SECT_GRAPH, TRK_ATT_3DDESC, "track.ac"); if (strlen(acname) == 0) { return -1; } sprintf(buf, "tracks/%s/%s;data/textures;data/img;.", grTrack->category, grTrack->internalname); ssgTexturePath(buf); sprintf(buf, "tracks/%s/%s", grTrack->category, grTrack->internalname); ssgModelPath(buf); desc = grssgLoadAC3D(acname, NULL); LandAnchor->addKid(desc); return 0; }