/* ============ idAASLocal::DrawArea ============ */ void idAASLocal::DrawArea( int areaNum ) const { int i, numFaces, firstFace; const aasArea_t* area; idReachability* reach; if( !file ) { return; } area = &file->GetArea( areaNum ); numFaces = area->numFaces; firstFace = area->firstFace; for( i = 0; i < numFaces; i++ ) { DrawFace( abs( file->GetFaceIndex( firstFace + i ) ), file->GetFaceIndex( firstFace + i ) < 0 ); } for( reach = area->reach; reach; reach = reach->next ) { DrawReachability( reach ); } }
/* ============ idAASLocal::ShowFlyPath ============ */ void idAASLocal::ShowFlyPath( const idVec3 &origin, int goalAreaNum, const idVec3 &goalOrigin ) const { int i, areaNum, curAreaNum, travelTime; idReachability *reach; idVec3 org, areaCenter; aasPath_t path; if( !file ) { return; } org = origin; areaNum = PointReachableAreaNum( org, DefaultSearchBounds(), AREA_REACHABLE_FLY ); PushPointIntoAreaNum( areaNum, org ); curAreaNum = areaNum; for( i = 0; i < 100; i++ ) { if( !RouteToGoalArea( curAreaNum, org, goalAreaNum, TFL_WALK | TFL_FLY | TFL_AIR, travelTime, &reach ) ) { break; } if( !reach ) { break; } gameRenderWorld->DebugArrow( colorPurple, org, reach->start, 2 ); DrawReachability( reach ); if( reach->toAreaNum == goalAreaNum ) { break; } curAreaNum = reach->toAreaNum; org = reach->end; } if( FlyPathToGoal( path, areaNum, origin, goalAreaNum, goalOrigin, TFL_WALK | TFL_FLY | TFL_AIR ) ) { gameRenderWorld->DebugArrow( colorBlue, origin, path.moveGoal, 2 ); } }
/* ============ idAASLocal::DrawArea ============ */ void idAASLocal::DrawArea( int areaNum ) const { int i, j, numEdges, firstEdge; idVec3 mid, end; const aasArea_t *area; const aasReachability_t *reach; if ( !file ) { return; } area = &file->GetArea( areaNum ); numEdges = area->numEdges; firstEdge = area->firstEdge; mid.Zero(); for ( i = 0; i < numEdges; i++ ) { DrawEdge( abs( file->GetEdgeIndex( firstEdge + i ) ), true ); j = file->GetEdgeIndex( firstEdge + i ); mid += file->GetVertex( file->GetEdge( abs( j ) ).vertexNum[ j < 0 ] ); } mid /= numEdges; end = mid + 5.0f * file->GetSettings().invGravityDir; gameRenderWorld->DebugArrow( colorGreen, mid, end, 1, 0 ); for ( reach = area->reach; reach; reach = reach->next ) { DrawReachability( reach, NULL ); } gameRenderWorld->DrawText( va( "%d", areaNum ), AreaCenter( areaNum ) + idVec3( 0.0f, 0.0f, 4.0f ), 0.1f, colorWhite, gameLocal.GetLocalPlayer()->GetViewAxis(), 1, 0 ); }
/* ============ idAASLocal::ShowManualReachabilities ============ */ void idAASLocal::ShowManualReachabilities() const { for ( int i = 0; i < file->GetNumReachabilityNames(); i++ ) { const aasName_t &name = file->GetReachabilityName( i ); int index = file->FindReachabilityByName( name.name ); if ( index >= 0 ) { DrawReachability( &file->GetReachability( index ), name.name ); } } }
/* ============ idAASLocal::ShowWalkPath ============ */ void idAASLocal::ShowWalkPath( int startAreaNum, const idVec3 &startOrigin, int goalAreaNum, const idVec3 &goalOrigin, int travelFlags, int walkTravelFlags ) const { if ( file == NULL ) { return; } int curAreaNum = startAreaNum; idVec3 org = startOrigin; for ( int i = 0; i < 100; i++ ) { int travelTime; const aasReachability_t *reach; if ( !RouteToGoalArea( curAreaNum, org, goalAreaNum, travelFlags, travelTime, &reach ) ) { break; } if ( !reach ) { break; } gameRenderWorld->DebugArrow( colorGreen, org, reach->GetStart(), 2, 0 ); DrawReachability( reach, NULL ); if ( aas_showAreas.GetBool() ) { DrawArea( curAreaNum ); } if ( reach->toAreaNum == goalAreaNum ) { break; } curAreaNum = reach->toAreaNum; org = reach->GetEnd(); } idAASPath path; if ( !WalkPathToGoal( path, startAreaNum, startOrigin, goalAreaNum, goalOrigin, travelFlags, walkTravelFlags ) ) { return; } gameRenderWorld->DebugArrow( colorBlue, startOrigin, path.moveGoal, 2, 0 ); // idObstacleAvoidance::obstaclePath_t obstaclePath; // idObstacleAvoidance obstacleAvoidance; // botThreadData.BuildObstacleList( obstacleAvoidance, startOrigin, startAreaNum, false ); // obstacleAvoidance.FindPathAroundObstacles( file->GetSettings().boundingBox, file->GetSettings().obstaclePVSRadius, this, startOrigin, path.moveGoal, obstaclePath ); // if ( obstaclePath.firstObstacle != idObstacleAvoidance::OBSTACLE_ID_INVALID ) { // path.moveGoal = obstaclePath.seekPos; // gameRenderWorld->DebugArrow( colorOrange, startOrigin, path.moveGoal, 2, 0 ); // } }
/* ============ idAASLocal::ShowHopPath ============ */ void idAASLocal::ShowHopPath( int startAreaNum, const idVec3 &startOrigin, int goalAreaNum, const idVec3 &goalOrigin, int travelFlags, int walkTravelFlags, const idAASHopPathParms &parms ) const { if ( file == NULL ) { return; } int curAreaNum = startAreaNum; idVec3 org = startOrigin; for ( int i = 0; i < 100; i++ ) { int travelTime; const aasReachability_t *reach; if ( !RouteToGoalArea( curAreaNum, org, goalAreaNum, travelFlags, travelTime, &reach ) ) { break; } if ( !reach ) { break; } gameRenderWorld->DebugArrow( colorGreen, org, reach->GetStart(), 2, 0 ); DrawReachability( reach, NULL ); if ( aas_showAreas.GetBool() ) { DrawArea( curAreaNum ); } if ( reach->toAreaNum == goalAreaNum ) { break; } curAreaNum = reach->toAreaNum; org = reach->GetEnd(); } idAASPath path; if ( WalkPathToGoal( path, startAreaNum, startOrigin, goalAreaNum, goalOrigin, travelFlags, walkTravelFlags ) ) { gameRenderWorld->DebugArrow( colorBlue, startOrigin, path.moveGoal, 2 ); if ( ExtendHopPathToGoal( path, startAreaNum, startOrigin, goalAreaNum, goalOrigin, travelFlags, walkTravelFlags, parms ) ) { gameRenderWorld->DebugArrow( colorCyan, startOrigin, path.moveGoal, 2 ); } } }