Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
/*
=======================================================================================================================================
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);
	}
}