[iortcw] 383/497: All: Fix writing route cache on 64 bit and big endian system

Simon McVittie smcv at debian.org
Fri Sep 8 10:37:32 UTC 2017


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to annotated tag 1.42d
in repository iortcw.

commit dfc63776c02c5b1ae4e5a214ae14fe9b55d1d678
Author: Zack Middleton <zturtleman at gmail.com>
Date:   Thu Jul 30 21:00:08 2015 -0500

    All: Fix writing route cache on 64 bit and big endian system
    
    I haven't actually tested it on big endian though.
---
 MP/code/botlib/be_aas_route.c | 80 ++++++++++++++++++++++++++++++-----------
 SP/code/botlib/be_aas_route.c | 83 +++++++++++++++++++++++++++++++------------
 2 files changed, 120 insertions(+), 43 deletions(-)

diff --git a/MP/code/botlib/be_aas_route.c b/MP/code/botlib/be_aas_route.c
index 6c64a3c..8ebd72c 100644
--- a/MP/code/botlib/be_aas_route.c
+++ b/MP/code/botlib/be_aas_route.c
@@ -882,6 +882,43 @@ void AAS_CreateAllRoutingCache( void ) {
 // Returns:				-
 // Changes Globals:		-
 //===========================================================================
+void AAS_WriteCache( fileHandle_t fp, aas_routingcache_t *nativecache ) {
+	int i, size, numtraveltimes;
+	aas_routingcache_32_t *cache;
+	unsigned char *cache_reachabilities;
+
+	size = nativecache->size + sizeof (aas_routingcache_32_t) - sizeof (aas_routingcache_t);
+
+	cache = GetClearedMemory( size );
+	cache->size = LittleLong( size );
+	cache->time = LittleFloat( nativecache->time );
+	cache->cluster = LittleLong( nativecache->cluster );
+	cache->areanum = LittleLong( nativecache->areanum );
+	cache->origin[0] = LittleFloat( nativecache->origin[0] );
+	cache->origin[1] = LittleFloat( nativecache->origin[1] );
+	cache->origin[2] = LittleFloat( nativecache->origin[2] );
+	cache->starttraveltime = LittleFloat( nativecache->starttraveltime );
+	cache->travelflags = LittleLong( nativecache->travelflags );
+
+	numtraveltimes = ( size - sizeof( aas_routingcache_32_t ) ) / 3;
+	for ( i = 0; i < numtraveltimes; i++ ) {
+		cache->traveltimes[i] = LittleShort( nativecache->traveltimes[i] );
+	}
+
+	cache_reachabilities = (unsigned char *) cache + sizeof( aas_routingcache_32_t ) + numtraveltimes * sizeof (cache->traveltimes[0]);
+	for ( i = 0; i < numtraveltimes; i++ ) {
+		cache_reachabilities[i] = nativecache->reachabilities[i];
+	}
+
+	botimport.FS_Write( cache, size, fp );
+	FreeMemory( cache );
+} //end of the function AAS_WriteCache
+//===========================================================================
+//
+// Parameter:			-
+// Returns:				-
+// Changes Globals:		-
+//===========================================================================
 unsigned short CRC_ProcessString( unsigned char *data, int length );
 
 //the route cache header
@@ -914,11 +951,7 @@ void AAS_WriteRouteCache( void ) {
 	char filename[MAX_QPATH];
 	routecacheheader_t routecacheheader;
 	byte *buf;
-
-	// ZTM FIXME: route cache created here will not work on 32 bit systems, so just don't save it for now.
-	if ( sizeof ( intptr_t ) != 4 ) {
-		return;
-	}
+	vec3_t waypoint;
 
 	buf = (byte *) GetClearedMemory( ( *aasworld ).numareas * 2 * sizeof( byte ) );   // in case it ends up bigger than the decompressedvis, which is rare but possible
 
@@ -950,15 +983,15 @@ void AAS_WriteRouteCache( void ) {
 		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.reachcrc = CRC_ProcessString( (unsigned char *)( *aasworld ).reachability, sizeof( aas_reachability_t ) * ( *aasworld ).reachabilitysize );
-	routecacheheader.numportalcache = numportalcache;
-	routecacheheader.numareacache = numareacache;
+	routecacheheader.ident = LittleLong( RCID );
+	routecacheheader.version = LittleLong( RCVERSION );
+	routecacheheader.numareas = LittleLong( ( *aasworld ).numareas );
+	routecacheheader.numclusters = LittleLong( ( *aasworld ).numclusters );
+	routecacheheader.areacrc = LittleLong( CRC_ProcessString( (unsigned char *)( *aasworld ).areas, sizeof( aas_area_t ) * ( *aasworld ).numareas ) );
+	routecacheheader.clustercrc = LittleLong( CRC_ProcessString( (unsigned char *)( *aasworld ).clusters, sizeof( aas_cluster_t ) * ( *aasworld ).numclusters ) );
+	routecacheheader.reachcrc = LittleLong( CRC_ProcessString( (unsigned char *)( *aasworld ).reachability, sizeof( aas_reachability_t ) * ( *aasworld ).reachabilitysize ) );
+	routecacheheader.numportalcache = LittleLong( numportalcache );
+	routecacheheader.numareacache = LittleLong( numareacache );
 	//write the header
 	botimport.FS_Write( &routecacheheader, sizeof( routecacheheader_t ), fp );
 	//write all the cache
@@ -966,7 +999,7 @@ void AAS_WriteRouteCache( void ) {
 	{
 		for ( cache = ( *aasworld ).portalcache[i]; cache; cache = cache->next )
 		{
-			botimport.FS_Write( cache, cache->size, fp );
+			AAS_WriteCache( fp, cache );
 		} //end for
 	} //end for
 	for ( i = 0; i < ( *aasworld ).numclusters; i++ )
@@ -976,7 +1009,7 @@ void AAS_WriteRouteCache( void ) {
 		{
 			for ( cache = ( *aasworld ).clusterareacache[i][j]; cache; cache = cache->next )
 			{
-				botimport.FS_Write( cache, cache->size, fp );
+				AAS_WriteCache( fp, cache );
 			} //end for
 		} //end for
 	} //end for
@@ -984,17 +1017,24 @@ void AAS_WriteRouteCache( void ) {
 	for ( i = 0; i < ( *aasworld ).numareas; i++ )
 	{
 		if ( !( *aasworld ).areavisibility[i] ) {
-			size = 0;
+			size = LittleLong( 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, buf );
+		LL( size );
 		botimport.FS_Write( &size, sizeof( int ), fp );
+		LL( size ); // convert back to native endian
 		botimport.FS_Write( buf, size, fp );
 	}
 	// write the waypoints
-	botimport.FS_Write( ( *aasworld ).areawaypoints, sizeof( vec3_t ) * ( *aasworld ).numareas, fp );
+	for ( i = 0; i < ( *aasworld ).numareas; i++ ) {
+		waypoint[0] = LittleFloat( ( *aasworld ).areawaypoints[i][0] );
+		waypoint[1] = LittleFloat( ( *aasworld ).areawaypoints[i][1] );
+		waypoint[2] = LittleFloat( ( *aasworld ).areawaypoints[i][2] );
+		botimport.FS_Write( waypoint, sizeof( vec3_t ), fp );
+	}
 	//
 	botimport.FS_FCloseFile( fp );
 	botimport.Print( PRT_MESSAGE, "\nroute cache written to %s\n", filename );
@@ -1048,9 +1088,9 @@ aas_routingcache_t *AAS_ReadCache( fileHandle_t fp ) {
 
 	// copy reachabilities to native structure, free original cache
 	if ( sizeof (intptr_t) != 4 ) {
-		for ( i = 0; i < numtraveltimes; i++ ) {
-			cache_reachabilities = (unsigned char *) cache + sizeof( aas_routingcache_32_t ) + numtraveltimes * sizeof (cache->traveltimes[0]);
+		cache_reachabilities = (unsigned char *) cache + sizeof( aas_routingcache_32_t ) + numtraveltimes * sizeof (cache->traveltimes[0]);
 
+		for ( i = 0; i < numtraveltimes; i++ ) {
 			nativecache->reachabilities[i] = cache_reachabilities[i];
 		}
 
diff --git a/SP/code/botlib/be_aas_route.c b/SP/code/botlib/be_aas_route.c
index 31580e3..4c88493 100644
--- a/SP/code/botlib/be_aas_route.c
+++ b/SP/code/botlib/be_aas_route.c
@@ -883,6 +883,43 @@ void AAS_CreateAllRoutingCache( void ) {
 // Returns:				-
 // Changes Globals:		-
 //===========================================================================
+void AAS_WriteCache( fileHandle_t fp, aas_routingcache_t *nativecache ) {
+	int i, size, numtraveltimes;
+	aas_routingcache_32_t *cache;
+	unsigned char *cache_reachabilities;
+
+	size = nativecache->size + sizeof (aas_routingcache_32_t) - sizeof (aas_routingcache_t);
+
+	cache = GetClearedMemory( size );
+	cache->size = LittleLong( size );
+	cache->time = LittleFloat( nativecache->time );
+	cache->cluster = LittleLong( nativecache->cluster );
+	cache->areanum = LittleLong( nativecache->areanum );
+	cache->origin[0] = LittleFloat( nativecache->origin[0] );
+	cache->origin[1] = LittleFloat( nativecache->origin[1] );
+	cache->origin[2] = LittleFloat( nativecache->origin[2] );
+	cache->starttraveltime = LittleFloat( nativecache->starttraveltime );
+	cache->travelflags = LittleLong( nativecache->travelflags );
+
+	numtraveltimes = ( size - sizeof( aas_routingcache_32_t ) ) / 3;
+	for ( i = 0; i < numtraveltimes; i++ ) {
+		cache->traveltimes[i] = LittleShort( nativecache->traveltimes[i] );
+	}
+
+	cache_reachabilities = (unsigned char *) cache + sizeof( aas_routingcache_32_t ) + numtraveltimes * sizeof (cache->traveltimes[0]);
+	for ( i = 0; i < numtraveltimes; i++ ) {
+		cache_reachabilities[i] = nativecache->reachabilities[i];
+	}
+
+	botimport.FS_Write( cache, size, fp );
+	FreeMemory( cache );
+} //end of the function AAS_WriteCache
+//===========================================================================
+//
+// Parameter:			-
+// Returns:				-
+// Changes Globals:		-
+//===========================================================================
 unsigned short CRC_ProcessString( unsigned char *data, int length );
 
 //the route cache header
@@ -915,11 +952,7 @@ void AAS_WriteRouteCache( void ) {
 	char filename[MAX_QPATH];
 	routecacheheader_t routecacheheader;
 	byte *buf;
-
-	// ZTM FIXME: route cache created here will not work on 32 bit systems, so just don't save it for now.
-	if ( sizeof ( intptr_t ) != 4 ) {
-		return;
-	}
+	vec3_t waypoint;
 
 	buf = (byte *) GetClearedMemory( ( *aasworld ).numareas * 2 * sizeof( byte ) );   // in case it ends up bigger than the decompressedvis, which is rare but possible
 
@@ -951,15 +984,15 @@ void AAS_WriteRouteCache( void ) {
 		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.reachcrc = CRC_ProcessString( (unsigned char *)( *aasworld ).reachability, sizeof( aas_reachability_t ) * ( *aasworld ).reachabilitysize );
-	routecacheheader.numportalcache = numportalcache;
-	routecacheheader.numareacache = numareacache;
+	routecacheheader.ident = LittleLong( RCID );
+	routecacheheader.version = LittleLong( RCVERSION );
+	routecacheheader.numareas = LittleLong( ( *aasworld ).numareas );
+	routecacheheader.numclusters = LittleLong( ( *aasworld ).numclusters );
+	routecacheheader.areacrc = LittleLong( CRC_ProcessString( (unsigned char *)( *aasworld ).areas, sizeof( aas_area_t ) * ( *aasworld ).numareas ) );
+	routecacheheader.clustercrc = LittleLong( CRC_ProcessString( (unsigned char *)( *aasworld ).clusters, sizeof( aas_cluster_t ) * ( *aasworld ).numclusters ) );
+	routecacheheader.reachcrc = LittleLong( CRC_ProcessString( (unsigned char *)( *aasworld ).reachability, sizeof( aas_reachability_t ) * ( *aasworld ).reachabilitysize ) );
+	routecacheheader.numportalcache = LittleLong( numportalcache );
+	routecacheheader.numareacache = LittleLong( numareacache );
 	//write the header
 	botimport.FS_Write( &routecacheheader, sizeof( routecacheheader_t ), fp );
 	//write all the cache
@@ -967,7 +1000,7 @@ void AAS_WriteRouteCache( void ) {
 	{
 		for ( cache = ( *aasworld ).portalcache[i]; cache; cache = cache->next )
 		{
-			botimport.FS_Write( cache, cache->size, fp );
+			AAS_WriteCache( fp, cache );
 		} //end for
 	} //end for
 	for ( i = 0; i < ( *aasworld ).numclusters; i++ )
@@ -977,7 +1010,7 @@ void AAS_WriteRouteCache( void ) {
 		{
 			for ( cache = ( *aasworld ).clusterareacache[i][j]; cache; cache = cache->next )
 			{
-				botimport.FS_Write( cache, cache->size, fp );
+				AAS_WriteCache( fp, cache );
 			} //end for
 		} //end for
 	} //end for
@@ -985,17 +1018,24 @@ void AAS_WriteRouteCache( void ) {
 	for ( i = 0; i < ( *aasworld ).numareas; i++ )
 	{
 		if ( !( *aasworld ).areavisibility[i] ) {
-			size = 0;
+			size = LittleLong( 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, buf );
+		LL( size );
 		botimport.FS_Write( &size, sizeof( int ), fp );
+		LL( size ); // convert back to native endian
 		botimport.FS_Write( buf, size, fp );
 	}
 	// write the waypoints
-	botimport.FS_Write( ( *aasworld ).areawaypoints, sizeof( vec3_t ) * ( *aasworld ).numareas, fp );
+	for ( i = 0; i < ( *aasworld ).numareas; i++ ) {
+		waypoint[0] = LittleFloat( ( *aasworld ).areawaypoints[i][0] );
+		waypoint[1] = LittleFloat( ( *aasworld ).areawaypoints[i][1] );
+		waypoint[2] = LittleFloat( ( *aasworld ).areawaypoints[i][2] );
+		botimport.FS_Write( waypoint, sizeof( vec3_t ), fp );
+	}
 	//
 	botimport.FS_FCloseFile( fp );
 	botimport.Print( PRT_MESSAGE, "\nroute cache written to %s\n", filename );
@@ -1049,9 +1089,9 @@ aas_routingcache_t *AAS_ReadCache( fileHandle_t fp ) {
 
 	// copy reachabilities to native structure, free original cache
 	if ( sizeof (intptr_t) != 4 ) {
-		for ( i = 0; i < numtraveltimes; i++ ) {
-			cache_reachabilities = (unsigned char *) cache + sizeof( aas_routingcache_32_t ) + numtraveltimes * sizeof (cache->traveltimes[0]);
+		cache_reachabilities = (unsigned char *) cache + sizeof( aas_routingcache_32_t ) + numtraveltimes * sizeof (cache->traveltimes[0]);
 
+		for ( i = 0; i < numtraveltimes; i++ ) {
 			nativecache->reachabilities[i] = cache_reachabilities[i];
 		}
 
@@ -1079,9 +1119,6 @@ int AAS_ReadRouteCache( void ) {
 		return qfalse;
 	} //end if
 	botimport.FS_Read( &routecacheheader, sizeof( routecacheheader_t ), fp );
-
-	// GJD: route cache data MUST be written on a PC because I've not altered the writing code.
-
 	routecacheheader.areacrc = LittleLong( routecacheheader.areacrc );
 	routecacheheader.clustercrc = LittleLong( routecacheheader.clustercrc );
 	routecacheheader.ident = LittleLong( routecacheheader.ident );

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git



More information about the Pkg-games-commits mailing list