- Added an enum for the values a Trace callback function can return.
- Added a userdata parameter to pass to the Trace callback function. SVN r4200 (trunk)
This commit is contained in:
parent
c54ea7f6b7
commit
dcf50ab6cb
3 changed files with 55 additions and 28 deletions
|
|
@ -48,7 +48,8 @@ struct FTraceInfo
|
|||
sector_t *CurSector;
|
||||
fixed_t MaxDist;
|
||||
fixed_t EnterDist;
|
||||
bool (*TraceCallback)(FTraceResults &res);
|
||||
ETraceStatus (*TraceCallback)(FTraceResults &res, void *data);
|
||||
void *TraceCallbackData;
|
||||
DWORD TraceFlags;
|
||||
int inshootthrough;
|
||||
|
||||
|
|
@ -71,7 +72,7 @@ bool Trace (fixed_t x, fixed_t y, fixed_t z, sector_t *sector,
|
|||
fixed_t vx, fixed_t vy, fixed_t vz, fixed_t maxDist,
|
||||
DWORD actorMask, DWORD wallMask, AActor *ignore,
|
||||
FTraceResults &res,
|
||||
DWORD flags, bool (*callback)(FTraceResults &res))
|
||||
DWORD flags, ETraceStatus (*callback)(FTraceResults &res, void *), void *callbackdata)
|
||||
{
|
||||
int ptflags;
|
||||
FTraceInfo inf;
|
||||
|
|
@ -91,6 +92,7 @@ bool Trace (fixed_t x, fixed_t y, fixed_t z, sector_t *sector,
|
|||
inf.MaxDist = maxDist;
|
||||
inf.EnterDist = 0;
|
||||
inf.TraceCallback = callback;
|
||||
inf.TraceCallbackData = callbackdata;
|
||||
inf.TraceFlags = flags;
|
||||
inf.Results = &res;
|
||||
inf.inshootthrough = true;
|
||||
|
|
@ -506,7 +508,13 @@ cont:
|
|||
|
||||
if (TraceCallback != NULL)
|
||||
{
|
||||
if (!TraceCallback (*Results)) return false;
|
||||
switch (TraceCallback(*Results, TraceCallbackData))
|
||||
{
|
||||
case TRACE_Stop: return false;
|
||||
case TRACE_Abort: Results->HitType = TRACE_HitNone; return false;
|
||||
case TRACE_Skip: Results->HitType = TRACE_HitNone; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -515,8 +523,7 @@ cont:
|
|||
}
|
||||
|
||||
// Encountered an actor
|
||||
if (!(in->d.thing->flags & ActorMask) ||
|
||||
in->d.thing == IgnoreThis)
|
||||
if (!(in->d.thing->flags & ActorMask) || in->d.thing == IgnoreThis)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
@ -583,13 +590,19 @@ cont:
|
|||
// the trace hit a 3D-floor before the thing.
|
||||
// Calculate an intersection and abort.
|
||||
Results->Sector = §ors[CurSector->sectornum];
|
||||
if (!CheckSectorPlane(CurSector, Results->HitType==TRACE_HitFloor))
|
||||
if (!CheckSectorPlane(CurSector, Results->HitType == TRACE_HitFloor))
|
||||
{
|
||||
Results->HitType=TRACE_HitNone;
|
||||
Results->HitType = TRACE_HitNone;
|
||||
}
|
||||
if (TraceCallback != NULL)
|
||||
{
|
||||
return TraceCallback (*Results);
|
||||
switch (TraceCallback(*Results, TraceCallbackData))
|
||||
{
|
||||
case TRACE_Continue: return true;
|
||||
case TRACE_Stop: return false;
|
||||
case TRACE_Abort: Results->HitType = TRACE_HitNone; return false;
|
||||
case TRACE_Skip: Results->HitType = TRACE_HitNone; return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -608,7 +621,13 @@ cont1:
|
|||
|
||||
if (TraceCallback != NULL)
|
||||
{
|
||||
if (!TraceCallback (*Results)) return false;
|
||||
switch (TraceCallback(*Results, TraceCallbackData))
|
||||
{
|
||||
case TRACE_Stop: return false;
|
||||
case TRACE_Abort: Results->HitType = TRACE_HitNone; return false;
|
||||
case TRACE_Skip: Results->HitType = TRACE_HitNone; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue