📄 be_aas_route.c
字号:
cache->reachabilities = (unsigned char *) cache + sizeof(aas_routingcache_t)
+ numtraveltimes * sizeof(unsigned short int);
cache->size = size;
return cache;
} //end of the function AAS_AllocRoutingCache
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_FreeAllClusterAreaCache(void)
{
int i, j;
aas_routingcache_t *cache, *nextcache;
aas_cluster_t *cluster;
//free all cluster cache if existing
if (!aasworld.clusterareacache) return;
//free caches
for (i = 0; i < aasworld.numclusters; i++)
{
cluster = &aasworld.clusters[i];
for (j = 0; j < cluster->numareas; j++)
{
for (cache = aasworld.clusterareacache[i][j]; cache; cache = nextcache)
{
nextcache = cache->next;
AAS_FreeRoutingCache(cache);
} //end for
aasworld.clusterareacache[i][j] = NULL;
} //end for
} //end for
//free the cluster cache array
FreeMemory(aasworld.clusterareacache);
aasworld.clusterareacache = NULL;
} //end of the function AAS_FreeAllClusterAreaCache
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_InitClusterAreaCache(void)
{
int i, size;
char *ptr;
//
for (size = 0, i = 0; i < aasworld.numclusters; i++)
{
size += aasworld.clusters[i].numareas;
} //end for
//two dimensional array with pointers for every cluster to routing cache
//for every area in that cluster
ptr = (char *) GetClearedMemory(
aasworld.numclusters * sizeof(aas_routingcache_t **) +
size * sizeof(aas_routingcache_t *));
aasworld.clusterareacache = (aas_routingcache_t ***) ptr;
ptr += aasworld.numclusters * sizeof(aas_routingcache_t **);
for (i = 0; i < aasworld.numclusters; i++)
{
aasworld.clusterareacache[i] = (aas_routingcache_t **) ptr;
ptr += aasworld.clusters[i].numareas * sizeof(aas_routingcache_t *);
} //end for
} //end of the function AAS_InitClusterAreaCache
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_FreeAllPortalCache(void)
{
int i;
aas_routingcache_t *cache, *nextcache;
//free all portal cache if existing
if (!aasworld.portalcache) return;
//free portal caches
for (i = 0; i < aasworld.numareas; i++)
{
for (cache = aasworld.portalcache[i]; cache; cache = nextcache)
{
nextcache = cache->next;
AAS_FreeRoutingCache(cache);
} //end for
aasworld.portalcache[i] = NULL;
} //end for
FreeMemory(aasworld.portalcache);
aasworld.portalcache = NULL;
} //end of the function AAS_FreeAllPortalCache
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_InitPortalCache(void)
{
//
aasworld.portalcache = (aas_routingcache_t **) GetClearedMemory(
aasworld.numareas * sizeof(aas_routingcache_t *));
} //end of the function AAS_InitPortalCache
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_InitRoutingUpdate(void)
{
int i, maxreachabilityareas;
//free routing update fields if already existing
if (aasworld.areaupdate) FreeMemory(aasworld.areaupdate);
//
maxreachabilityareas = 0;
for (i = 0; i < aasworld.numclusters; i++)
{
if (aasworld.clusters[i].numreachabilityareas > maxreachabilityareas)
{
maxreachabilityareas = aasworld.clusters[i].numreachabilityareas;
} //end if
} //end for
//allocate memory for the routing update fields
aasworld.areaupdate = (aas_routingupdate_t *) GetClearedMemory(
maxreachabilityareas * sizeof(aas_routingupdate_t));
//
if (aasworld.portalupdate) FreeMemory(aasworld.portalupdate);
//allocate memory for the portal update fields
aasworld.portalupdate = (aas_routingupdate_t *) GetClearedMemory(
(aasworld.numportals+1) * sizeof(aas_routingupdate_t));
} //end of the function AAS_InitRoutingUpdate
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
void AAS_CreateAllRoutingCache(void)
{
int i, j, t;
aasworld.initialized = qtrue;
botimport.Print(PRT_MESSAGE, "AAS_CreateAllRoutingCache\n");
for (i = 1; i < aasworld.numareas; i++)
{
if (!AAS_AreaReachability(i)) continue;
for (j = 1; j < aasworld.numareas; j++)
{
if (i == j) continue;
if (!AAS_AreaReachability(j)) continue;
t = AAS_AreaTravelTimeToGoalArea(i, aasworld.areas[i].center, j, TFL_DEFAULT);
//Log_Write("traveltime from %d to %d is %d", i, j, t);
} //end for
} //end for
aasworld.initialized = qfalse;
} //end of the function AAS_CreateAllRoutingCache
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
//the route cache header
//this header is followed by numportalcache + numareacache aas_routingcache_t
//structures that store routing cache
typedef struct routecacheheader_s
{
int ident;
int version;
int numareas;
int numclusters;
int areacrc;
int clustercrc;
int numportalcache;
int numareacache;
} routecacheheader_t;
#define RCID (('C'<<24)+('R'<<16)+('E'<<8)+'M')
#define RCVERSION 2
//void AAS_DecompressVis(byte *in, int numareas, byte *decompressed);
//int AAS_CompressVis(byte *vis, int numareas, byte *dest);
void AAS_WriteRouteCache(void)
{
int i, j, numportalcache, numareacache, totalsize;
aas_routingcache_t *cache;
aas_cluster_t *cluster;
fileHandle_t fp;
char filename[MAX_QPATH];
routecacheheader_t routecacheheader;
numportalcache = 0;
for (i = 0; i < aasworld.numareas; i++)
{
for (cache = aasworld.portalcache[i]; cache; cache = cache->next)
{
numportalcache++;
} //end for
} //end for
numareacache = 0;
for (i = 0; i < aasworld.numclusters; i++)
{
cluster = &aasworld.clusters[i];
for (j = 0; j < cluster->numareas; j++)
{
for (cache = aasworld.clusterareacache[i][j]; cache; cache = cache->next)
{
numareacache++;
} //end for
} //end for
} //end for
// open the file for writing
Com_sprintf(filename, MAX_QPATH, "maps/%s.rcd", aasworld.mapname);
botimport.FS_FOpenFile( filename, &fp, FS_WRITE );
if (!fp)
{
AAS_Error("Unable to open file: %s\n", filename);
return;
} //end if
//create the header
routecacheheader.ident = RCID;
routecacheheader.version = RCVERSION;
routecacheheader.numareas = aasworld.numareas;
routecacheheader.numclusters = aasworld.numclusters;
routecacheheader.areacrc = CRC_ProcessString( (unsigned char *)aasworld.areas, sizeof(aas_area_t) * aasworld.numareas );
routecacheheader.clustercrc = CRC_ProcessString( (unsigned char *)aasworld.clusters, sizeof(aas_cluster_t) * aasworld.numclusters );
routecacheheader.numportalcache = numportalcache;
routecacheheader.numareacache = numareacache;
//write the header
botimport.FS_Write(&routecacheheader, sizeof(routecacheheader_t), fp);
//
totalsize = 0;
//write all the cache
for (i = 0; i < aasworld.numareas; i++)
{
for (cache = aasworld.portalcache[i]; cache; cache = cache->next)
{
botimport.FS_Write(cache, cache->size, fp);
totalsize += cache->size;
} //end for
} //end for
for (i = 0; i < aasworld.numclusters; i++)
{
cluster = &aasworld.clusters[i];
for (j = 0; j < cluster->numareas; j++)
{
for (cache = aasworld.clusterareacache[i][j]; cache; cache = cache->next)
{
botimport.FS_Write(cache, cache->size, fp);
totalsize += cache->size;
} //end for
} //end for
} //end for
// write the visareas
/*
for (i = 0; i < aasworld.numareas; i++)
{
if (!aasworld.areavisibility[i]) {
size = 0;
botimport.FS_Write(&size, sizeof(int), fp);
continue;
}
AAS_DecompressVis( aasworld.areavisibility[i], aasworld.numareas, aasworld.decompressedvis );
size = AAS_CompressVis( aasworld.decompressedvis, aasworld.numareas, aasworld.decompressedvis );
botimport.FS_Write(&size, sizeof(int), fp);
botimport.FS_Write(aasworld.decompressedvis, size, fp);
}
*/
//
botimport.FS_FCloseFile(fp);
botimport.Print(PRT_MESSAGE, "\nroute cache written to %s\n", filename);
botimport.Print(PRT_MESSAGE, "written %d bytes of routing cache\n", totalsize);
} //end of the function AAS_WriteRouteCache
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
aas_routingcache_t *AAS_ReadCache(fileHandle_t fp)
{
int size;
aas_routingcache_t *cache;
botimport.FS_Read(&size, sizeof(size), fp);
cache = (aas_routingcache_t *) GetMemory(size);
cache->size = size;
botimport.FS_Read((unsigned char *)cache + sizeof(size), size - sizeof(size), fp);
cache->reachabilities = (unsigned char *) cache + sizeof(aas_routingcache_t) - sizeof(unsigned short) +
(size - sizeof(aas_routingcache_t) + sizeof(unsigned short)) / 3 * 2;
return cache;
} //end of the function AAS_ReadCache
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
int AAS_ReadRouteCache(void)
{
int i, clusterareanum;//, size;
fileHandle_t fp;
char filename[MAX_QPATH];
routecacheheader_t routecacheheader;
aas_routingcache_t *cache;
Com_sprintf(filename, MAX_QPATH, "maps/%s.rcd", aasworld.mapname);
botimport.FS_FOpenFile( filename, &fp, FS_READ );
if (!fp)
{
return qfalse;
} //end if
botimport.FS_Read(&routecacheheader, sizeof(routecacheheader_t), fp );
if (routecacheheader.ident != RCID)
{
AAS_Error("%s is not a route cache dump\n");
return qfalse;
} //end if
if (routecacheheader.version != RCVERSION)
{
AAS_Error("route cache dump has wrong version %d, should be %d", routecacheheader.version, RCVERSION);
return qfalse;
} //end if
if (routecacheheader.numareas != aasworld.numareas)
{
//AAS_Error("route cache dump has wrong number of areas\n");
return qfalse;
} //end if
if (routecacheheader.numclusters != aasworld.numclusters)
{
//AAS_Error("route cache dump has wrong number of clusters\n");
return qfalse;
} //end if
if (routecacheheader.areacrc !=
CRC_ProcessString( (unsigned char *)aasworld.areas, sizeof(aas_area_t) * aasworld.numareas ))
{
//AAS_Error("route cache dump area CRC incorrect\n");
return qfalse;
} //end if
if (routecacheheader.clustercrc !=
CRC_ProcessString( (unsigned char *)aasworld.clusters, sizeof(aas_cluster_t) * aasworld.numclusters ))
{
//AAS_Error("route cache dump cluster CRC incorrect\n");
return qfalse;
} //end if
//read all the portal cache
for (i = 0; i < routecacheheader.numportalcache; i++)
{
cache = AAS_ReadCache(fp);
cache->next = aasworld.portalcache[cache->areanum];
cache->prev = NULL;
if (aasworld.portalcache[cache->areanum])
aasworld.portalcache[cache->areanum]->prev = cache;
aasworld.portalcache[cache->areanum] = cache;
} //end for
//read all the cluster area cache
for (i = 0; i < routecacheheader.numareacache; i++)
{
cache = AAS_ReadCache(fp);
clusterareanum = AAS_ClusterAreaNum(cache->cluster, cache->areanum);
cache->next = aasworld.clusterareacache[cache->cluster][clusterareanum];
cache->prev = NULL;
if (aasworld.clusterareacache[cache->cluster][clusterareanum])
aasworld.clusterareacache[cache->cluster][clusterareanum]->prev = cache;
aasworld.clusterareacache[cache->cluster][clusterareanum] = cache;
} //end for
// read the visareas
/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -