void AAS_FloodAreas(vec3_t origin) { int areanum, cluster, *done; done = (int *) GetClearedMemory(aasworld.numareas * sizeof(int)); areanum = AAS_PointAreaNum(origin); cluster = AAS_AreaCluster(areanum); AAS_FloodAreas_r(areanum, cluster, done); }
/* ======================================================================================================================================= AAS_FloodAreas_r ======================================================================================================================================= */ void AAS_FloodAreas_r(int areanum, int cluster, int *done) { int nextareanum, i, facenum; aas_area_t *area; aas_face_t *face; aas_areasettings_t *settings; aas_reachability_t *reach; AAS_ShowAreaPolygons(areanum, 1, qtrue); // pointer to the convex area area = &aasworld.areas[areanum]; settings = &aasworld.areasettings[areanum]; // walk through the faces of the area for (i = 0; i < area->numfaces; i++) { facenum = abs(aasworld.faceindex[area->firstface + i]); face = &aasworld.faces[facenum]; if (face->frontarea == areanum) { nextareanum = face->backarea; } else { nextareanum = face->frontarea; } if (!nextareanum) { continue; } if (done[nextareanum]) { continue; } done[nextareanum] = qtrue; if (aasworld.areasettings[nextareanum].contents & AREACONTENTS_VIEWPORTAL) { continue; } if (AAS_AreaCluster(nextareanum) != cluster) { continue; } AAS_FloodAreas_r(nextareanum, cluster, done); } for (i = 0; i < settings->numreachableareas; i++) { reach = &aasworld.reachability[settings->firstreachablearea + i]; nextareanum = reach->areanum; if (!nextareanum) { continue; } if (done[nextareanum]) { continue; } done[nextareanum] = qtrue; if (aasworld.areasettings[nextareanum].contents & AREACONTENTS_VIEWPORTAL) { continue; } if (AAS_AreaCluster(nextareanum) != cluster) { continue; } /* if ((reach->traveltype & TRAVELTYPE_MASK) == TRAVEL_WALKOFFLEDGE) { AAS_DebugLine(reach->start, reach->end, 1); } */ AAS_FloodAreas_r(nextareanum, cluster, done); } }