Fix pit building issues with SD pit parameters

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@6382 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: 4cb9d7ae3b4fa7f910a99a78a1ecef3fccd82fc8
Former-commit-id: e14670571685cf85e9c006c835ec58171ae05a79
This commit is contained in:
wdbee 2016-03-21 15:25:45 +00:00
parent 38ee0fce04
commit aa5730e559
5 changed files with 112 additions and 86 deletions

View file

@ -205,6 +205,7 @@
#define TRK_ATT_PIT_INDICATOR "pit indicator"
#define TRK_ATT_MAX_PITS "max pits"
#define TRK_ATT_BUILDINGS_START "start buildings"
#define TRK_ATT_BUILDINGS_STOPP "stop buildings"
#define TRK_ATT_PIT_STYLE "pit style"
#define TRK_ATT_ENTRY "entry"
#define TRK_ATT_EXIT "exit"
@ -441,6 +442,7 @@ typedef struct trackSeg
#define TR_PIT 0x00000040 /**< Car pit */
#define TR_PITSTART 0x00000080 /**< Car pit Star */
#define TR_PITEND 0x00000100 /**< Car pit End */
#define TR_PITBUILD 0x00000200 /**< Car pit while buildings */
tdble DoVfactor; /* the factor to use in calculating DoV for this Seg */

View file

@ -1297,6 +1297,7 @@ ReadTrack3(tTrack *theTrack, void *TrackHandle, tRoadCam **camList, int ext)
tTrackSeg *pitExitSeg = NULL;
tTrackSeg *pitStart = NULL;
tTrackSeg *pitBuildingsStart = NULL;
tTrackSeg *pitBuildingsEnd = NULL;
tTrackSeg *pitEnd = NULL;
tTrackSeg *curPitSeg = NULL;
tTrackPitInfo *pits;
@ -1399,6 +1400,23 @@ ReadTrack3(tTrack *theTrack, void *TrackHandle, tRoadCam **camList, int ext)
}
}
segName = GfParmGetStr(TrackHandle, TRK_SECT_MAIN, TRK_ATT_BUILDINGS_STOPP, NULL);
if (segName != 0) {
pitBuildingsEnd = theTrack->seg;
found = 0;
for(i = 0; i < theTrack->nseg; i++) {
if (!strcmp(segName, pitBuildingsEnd->name)) {
found = 1;
break;
}
pitBuildingsEnd = pitBuildingsEnd->prev;
}
if (!found) {
pitBuildingsEnd = NULL;
}
}
segName = GfParmGetStr(TrackHandle, TRK_SECT_MAIN, TRK_ATT_PIT_END, NULL);
if (segName != 0) {
pitEnd = theTrack->seg->next;
@ -1441,21 +1459,22 @@ ReadTrack3(tTrack *theTrack, void *TrackHandle, tRoadCam **camList, int ext)
if (found && (strcmp(pitType, TRK_VAL_PIT_TYPE_SIDE) == 0)) {
pits->type = TR_PIT_ON_TRACK_SIDE;
pits->nPitSeg = 0;
if (pitStart->lgfromstart > pitEnd->lgfromstart) {
pits->nPitSeg = (int)((theTrack->length - pitStart->lgfromstart +
pitEnd->lgfromstart + pitEnd->length + pits->len / 2.0) / pits->len);
if (pitBuildingsStart == NULL)
pitBuildingsStart = pits->pitStart;
if (pitBuildingsEnd == NULL)
pitBuildingsEnd = pits->pitEnd;
if (pitBuildingsStart->lgfromstart > pitBuildingsEnd->lgfromstart) {
pits->nPitSeg = (int)((theTrack->length - pitBuildingsStart->lgfromstart +
pitBuildingsEnd->lgfromstart + pitBuildingsEnd->length + pits->len / 2.0) / pits->len);
} else {
pits->nPitSeg = (int)((- pitStart->lgfromstart + pitEnd->lgfromstart +
pitEnd->length + pits->len / 2.0) / pits->len);
pits->nPitSeg = (int)((- pitBuildingsStart->lgfromstart + pitBuildingsEnd->lgfromstart +
pitBuildingsEnd->length + pits->len / 2.0) / pits->len);
}
pits->nMaxPits = MIN(pits->nPitSeg,(int)GfParmGetNum(TrackHandle, path2, TRK_ATT_MAX_PITS, (char*)NULL, (tdble) pits->nPitSeg));
pits->driversPits = (tTrackOwnPit*)calloc(pits->nPitSeg, sizeof(tTrackOwnPit));
//GfOut("pits->nPitSeg: %d\n",pits->nPitSeg);
//GfOut("pits->nMaxPits: %d\n",pits->nMaxPits);
//mSeg = pits->pitStart->prev;
if (pitBuildingsStart == NULL)
pitBuildingsStart = pits->pitStart;
mSeg = pitBuildingsStart->prev;
changeSeg = 1;
toStart = 0;
@ -1512,22 +1531,7 @@ ReadTrack3(tTrack *theTrack, void *TrackHandle, tRoadCam **camList, int ext)
for (mSeg = pitStart->prev; mSeg != pitEnd->next->next; mSeg = mSeg->next) {
curSeg2 = NULL;
switch(pits->side) {
case TR_RGT:
curSeg = mSeg->rside;
curSeg2 = curSeg->rside;
if ((mSeg != pitBuildingsStart->prev) && (mSeg != pitEnd->next)) {
mSeg->barrier[0]->style = TR_PITBUILDING;
}
break;
case TR_LFT:
curSeg = mSeg->lside;
curSeg2 = curSeg->lside;
if ((mSeg != pitBuildingsStart->prev) && (mSeg != pitEnd->next)) {
mSeg->barrier[1]->style = TR_PITBUILDING;
}
break;
}
if ((mSeg != pitStart->prev) && (mSeg != pitEnd->next)) {
curSeg->raceInfo |= TR_PIT | TR_SPEEDLIMIT;
if (curSeg2) {
@ -1548,18 +1552,20 @@ ReadTrack3(tTrack *theTrack, void *TrackHandle, tRoadCam **camList, int ext)
}
for (mSeg = pitBuildingsStart; mSeg != pitEnd; mSeg = mSeg->next) {
for (mSeg = pitBuildingsStart; mSeg != pitBuildingsEnd; mSeg = mSeg->next) {
curSeg2 = NULL;
switch(pits->side) {
case TR_RGT:
curSeg = mSeg->rside;
curSeg2 = curSeg->rside;
mSeg->barrier[0]->style = TR_PITBUILDING;
curSeg2->raceInfo |= TR_PITBUILD;
break;
case TR_LFT:
curSeg = mSeg->lside;
curSeg2 = curSeg->lside;
mSeg->barrier[1]->style = TR_PITBUILDING;
curSeg2->raceInfo |= TR_PITBUILD;
break;
}
}

View file

@ -69,6 +69,7 @@ static tTrackSeg *pitEntrySeg = NULL;
static tTrackSeg *pitExitSeg = NULL;
static tTrackSeg *pitStart = NULL;
static tTrackSeg *pitBuildingsStart = NULL;
static tTrackSeg *pitBuildingsEnd = NULL;
static tTrackSeg *pitEnd = NULL;
static tTrackPitInfo *pits = NULL;
@ -787,6 +788,7 @@ static bool InitPits(tTrack *theTrack, void *TrackHandle) {
pitExitSeg = NULL;
pitStart = NULL;
pitBuildingsStart = NULL;
pitBuildingsEnd = NULL;
pitEnd = NULL;
//Search for the pit section in the track XML file
@ -878,6 +880,25 @@ static bool InitPits(tTrack *theTrack, void *TrackHandle) {
}
GfOut("PitBuildingStart: %s\n", pitBuildingsStart->name);
//Search for pit buildings end
segName = GfParmGetStrNC(TrackHandle, path2, TRK_ATT_BUILDINGS_STOPP, NULL);
if (segName != 0) {
/* Search backward the last segment with that name */
pitBuildingsEnd = theTrack->seg; /* last track segment */
found = false;
for(i = 0; i < theTrack->nseg; i++) {
if (!strcmp(segName, pitBuildingsEnd->name)) {
found = true;
break;
}
pitBuildingsEnd = pitBuildingsEnd->prev;
}
if (!found) {
pitBuildingsEnd = NULL;
}
}
GfOut("PitBuildungsEnd: %s\n", pitBuildingsEnd->name);
//Search for pits end
segName = GfParmGetStrNC(TrackHandle, path2, TRK_ATT_END, NULL);
if (segName != 0) {
@ -918,7 +939,7 @@ static bool InitPits(tTrack *theTrack, void *TrackHandle) {
pitExitSeg->raceInfo |= TR_PITEXIT;
pits->len = GfParmGetNum(TrackHandle, path2, TRK_ATT_LEN, (char*)NULL, 15.0);
pits->width = GfParmGetNum(TrackHandle, path2, TRK_ATT_WIDTH, (char*)NULL, 5.0);
pits->pitindicator = GfParmGetNum(TrackHandle, path2, TRK_ATT_PIT_INDICATOR, (char*)NULL, 0.0);
pits->pitindicator = (int) GfParmGetNum(TrackHandle, path2, TRK_ATT_PIT_INDICATOR, (char*)NULL, 0.0);
found = true;
} else {
found = false;
@ -950,18 +971,21 @@ static void AddPitDoors(tTrack *theTrack, void *TrackHandle, bool found) {
case TR_PIT_ON_TRACK_SIDE:
{//dummy for eliminating warnings of locally declared variables cross-jumping with cases
pits->nPitSeg = 0;
if (pitStart->lgfromstart > pitEnd->lgfromstart) {
pits->nPitSeg = (int)((theTrack->length - pitStart->lgfromstart
+ pitEnd->lgfromstart + pitEnd->length + pits->len / 2.0) / pits->len);
if (pitBuildingsStart == NULL)
pitBuildingsStart = pitStart;
if (pitBuildingsEnd == NULL)
pitBuildingsEnd = pitEnd;
if (pitBuildingsStart->lgfromstart > pitBuildingsEnd->lgfromstart) {
pits->nPitSeg = (int)((theTrack->length - pitBuildingsStart->lgfromstart
+ pitBuildingsEnd->lgfromstart + pitBuildingsEnd->length + pits->len / 2.0) / pits->len);
} else {
pits->nPitSeg = (int)((pitEnd->lgfromstart + pitEnd->length
- pitStart->lgfromstart + pits->len / 2.0) / pits->len);
pits->nPitSeg = (int)((pitEnd->lgfromstart + pitBuildingsEnd->length
- pitBuildingsStart->lgfromstart + pits->len / 2.0) / pits->len);
}
pits->nMaxPits = MIN(pits->nPitSeg,(int)GfParmGetNum(TrackHandle, path2, TRK_ATT_MAX_PITS, (char*)NULL, (tdble) pits->nPitSeg));
pits->driversPits = (tTrackOwnPit*)calloc(pits->nPitSeg, sizeof(tTrackOwnPit));
if (pitBuildingsStart == NULL)
pitBuildingsStart = pitStart;
mSeg = pitBuildingsStart->prev;
//mSeg = mSeg->next;
@ -1056,24 +1080,6 @@ static void AddPitDoors(tTrack *theTrack, void *TrackHandle, bool found) {
for (mSeg = pitStart->prev; mSeg != pitEnd->next->next; mSeg = mSeg->next) {
curSeg = curSeg2 = NULL;
switch(pits->side) {
case TR_RGT:
curSeg = mSeg->rside;
curSeg2 = curSeg->rside;
if ((mSeg != pitBuildingsStart->prev) && (mSeg != pitEnd->next)) {
mSeg->barrier[0]->style = TR_PITBUILDING;
}
break;
case TR_LFT:
curSeg = mSeg->lside;
curSeg2 = curSeg->lside;
if ((mSeg != pitBuildingsStart->prev) && (mSeg != pitEnd->next)) {
mSeg->barrier[1]->style = TR_PITBUILDING;
}
break;
}//switch pits->side
if ((mSeg != pitStart->prev) && (mSeg != pitEnd->next)) {
if (curSeg) {
curSeg->raceInfo |= TR_PIT | TR_SPEEDLIMIT;
@ -1110,7 +1116,7 @@ static void AddPitDoors(tTrack *theTrack, void *TrackHandle, bool found) {
}//switch pits->type
}//if found
for (mSeg = pitBuildingsStart; mSeg != pitEnd; mSeg = mSeg->next) {
for (mSeg = pitBuildingsStart; mSeg != pitBuildingsEnd; mSeg = mSeg->next) {
curSeg2 = NULL;
switch(pits->side) {
@ -1118,12 +1124,16 @@ static void AddPitDoors(tTrack *theTrack, void *TrackHandle, bool found) {
curSeg = mSeg->rside;
curSeg2 = curSeg->rside;
mSeg->barrier[0]->style = TR_PITBUILDING;
curSeg2->raceInfo |= TR_PITBUILD;
GfLogDebug("%s: mSeg->barrier[0]->style = TR_PITBUILDING\n",mSeg->name);
break;
case TR_LFT:
curSeg = mSeg->lside;
curSeg2 = curSeg->lside;
mSeg->barrier[1]->style = TR_PITBUILDING;
curSeg2->raceInfo |= TR_PITBUILD;
GfLogDebug("%s: mSeg->barrier[1]->style = TR_PITBUILDING\n",mSeg->name);
break;
}//switch pits->side
}//for mSeg

View file

@ -81,6 +81,7 @@ static tTrackSeg *pitEntrySeg = NULL;
static tTrackSeg *pitExitSeg = NULL;
static tTrackSeg *pitStart = NULL;
static tTrackSeg *pitBuildingsStart = NULL;
static tTrackSeg *pitBuildingsEnd = NULL;
static tTrackSeg *pitEnd = NULL;
static tTrackPitInfo *pits = NULL;
@ -811,6 +812,7 @@ static bool InitPits(tTrack *theTrack, void *TrackHandle) {
pitExitSeg = NULL;
pitStart = NULL;
pitBuildingsStart = NULL;
pitBuildingsEnd = NULL;
pitEnd = NULL;
//Search for the pit section in the track XML file
@ -902,6 +904,25 @@ static bool InitPits(tTrack *theTrack, void *TrackHandle) {
}
GfOut("PitBuildingStart: %s\n", pitBuildingsStart->name);
//Search for pit buildings end
segName = GfParmGetStrNC(TrackHandle, path2, TRK_ATT_BUILDINGS_STOPP, NULL);
if (segName != 0) {
/* Search backward the last segment with that name */
pitBuildingsEnd = theTrack->seg; /* last track segment */
found = false;
for(i = 0; i < theTrack->nseg; i++) {
if (!strcmp(segName, pitBuildingsEnd->name)) {
found = true;
break;
}
pitBuildingsEnd = pitBuildingsEnd->prev;
}
if (!found) {
pitBuildingsEnd = NULL;
}
}
GfOut("PitBuildungsEnd: %s\n", pitBuildingsEnd->name);
//Search for pits end
segName = GfParmGetStrNC(TrackHandle, path2, TRK_ATT_END, NULL);
if (segName != 0)
@ -950,7 +971,7 @@ static bool InitPits(tTrack *theTrack, void *TrackHandle) {
pitExitSeg->raceInfo |= TR_PITEXIT;
pits->len = GfParmGetNum(TrackHandle, path2, TRK_ATT_LEN, (char*)NULL, 15.0);
pits->width = GfParmGetNum(TrackHandle, path2, TRK_ATT_WIDTH, (char*)NULL, 5.0);
pits->pitindicator = GfParmGetNum(TrackHandle, path2, TRK_ATT_PIT_INDICATOR, (char*)NULL, 0.0);
pits->pitindicator = (int) GfParmGetNum(TrackHandle, path2, TRK_ATT_PIT_INDICATOR, (char*)NULL, 0.0);
found = true;
} else
{
@ -983,20 +1004,23 @@ static void AddPitDoors(tTrack *theTrack, void *TrackHandle, bool found) {
case TR_PIT_ON_TRACK_SIDE:
{//dummy for eliminating warnings of locally declared variables cross-jumping with cases
pits->nPitSeg = 0;
if (pitStart->lgfromstart > pitEnd->lgfromstart) {
pits->nPitSeg = (int)((theTrack->length - pitStart->lgfromstart
+ pitEnd->lgfromstart + pitEnd->length + pits->len / 2.0) / pits->len);
if (pitBuildingsStart == NULL)
pitBuildingsStart = pitStart;
if (pitBuildingsEnd == NULL)
pitBuildingsEnd = pitEnd;
if (pitBuildingsStart->lgfromstart > pitBuildingsEnd->lgfromstart) {
pits->nPitSeg = (int)((theTrack->length - pitBuildingsStart->lgfromstart
+ pitBuildingsEnd->lgfromstart + pitBuildingsEnd->length + pits->len / 2.0) / pits->len);
} else {
pits->nPitSeg = (int)((pitEnd->lgfromstart + pitEnd->length
- pitStart->lgfromstart + pits->len / 2.0) / pits->len);
pits->nPitSeg = (int)((pitBuildingsEnd->lgfromstart + pitBuildingsEnd->length
- pitBuildingsStart->lgfromstart + pits->len / 2.0) / pits->len);
}
pits->nMaxPits = MIN(pits->nPitSeg,(int)GfParmGetNum(TrackHandle, path2, TRK_ATT_MAX_PITS, (char*)NULL, (tdble) pits->nPitSeg));
pits->driversPits = (tTrackOwnPit*)calloc(pits->nPitSeg, sizeof(tTrackOwnPit));
if (pitBuildingsStart == NULL)
pitBuildingsStart = pitStart;
mSeg = pitBuildingsStart->prev;
//mSeg = mSeg->next;
bool changeSeg = true;
tdble offset = 0;
@ -1089,24 +1113,6 @@ static void AddPitDoors(tTrack *theTrack, void *TrackHandle, bool found) {
for (mSeg = pitStart->prev; mSeg != pitEnd->next->next; mSeg = mSeg->next) {
curSeg = curSeg2 = NULL;
switch(pits->side) {
case TR_RGT:
curSeg = mSeg->rside;
curSeg2 = curSeg->rside;
if ((mSeg != pitBuildingsStart->prev) && (mSeg != pitEnd->next)) {
mSeg->barrier[0]->style = TR_PITBUILDING;
}
break;
case TR_LFT:
curSeg = mSeg->lside;
curSeg2 = curSeg->lside;
if ((mSeg != pitBuildingsStart->prev) && (mSeg != pitEnd->next)) {
mSeg->barrier[1]->style = TR_PITBUILDING;
}
break;
}//switch pits->side
if ((mSeg != pitStart->prev) && (mSeg != pitEnd->next)) {
if (curSeg) {
curSeg->raceInfo |= TR_PIT | TR_SPEEDLIMIT;
@ -1143,7 +1149,7 @@ static void AddPitDoors(tTrack *theTrack, void *TrackHandle, bool found) {
}//switch pits->type
}//if found
for (mSeg = pitBuildingsStart; mSeg != pitEnd; mSeg = mSeg->next) {
for (mSeg = pitBuildingsStart; mSeg != pitBuildingsEnd; mSeg = mSeg->next) {
curSeg2 = NULL;
switch(pits->side) {
@ -1151,12 +1157,14 @@ static void AddPitDoors(tTrack *theTrack, void *TrackHandle, bool found) {
curSeg = mSeg->rside;
curSeg2 = curSeg->rside;
mSeg->barrier[0]->style = TR_PITBUILDING;
curSeg2->raceInfo |= TR_PITBUILD;
break;
case TR_LFT:
curSeg = mSeg->lside;
curSeg2 = curSeg->lside;
mSeg->barrier[1]->style = TR_PITBUILDING;
curSeg2->raceInfo |= TR_PITBUILD;
break;
}//switch pits->side
}//for mSeg
@ -1245,7 +1253,7 @@ CreateSegRing(void *TrackHandle, tTrack *theTrack, tTrackSeg *start, tTrackSeg *
yl = width;
xr = GfParmGetNum(TrackHandle, TRK_SECT_MAIN, TRK_ATT_START_X, (char*)NULL, 0.0);
yr = GfParmGetNum(TrackHandle, TRK_SECT_MAIN, TRK_ATT_START_Y, (char*)NULL, 0.0);
alf = GfParmGetNum(TrackHandle, TRK_SECT_MAIN, TRK_ATT_START_BEARING, 0, FLOAT_DEG2RAD(0.0));
alf = GfParmGetNum(TrackHandle, TRK_SECT_MAIN, TRK_ATT_START_BEARING, 0, FLOAT_DEG2RAD(0.0f));
xr += wi2 * sin(alf);
xl = xr - width * sin(alf);
yr -= wi2 * cos(alf);

View file

@ -1721,7 +1721,7 @@ InitScene(tTrack *Track, void *TrackHandle, int bump)
runninglentgh = 0;
sprintf(sname, "B%dRt", j);
for (i = 0, mseg = Track->seg->next; i < Track->nseg; i++, mseg = mseg->next) {
if ((mseg->rside != NULL) && (mseg->rside->raceInfo & TR_PIT)) {
if ((mseg->rside != NULL) && (mseg->rside->raceInfo & TR_PITBUILD)) {
startNeeded = 1;
runninglentgh = 0;
NEWDISPLIST(0, sname, i);