First bunch of endian fixes... At least bsp loading doesn't crash&burn anymore :)

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1989 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Mark Olsen 2006-02-22 02:38:48 +00:00
parent 9cc160d7fb
commit 2abfd728bf
3 changed files with 23 additions and 17 deletions

View file

@ -230,19 +230,19 @@ bsp_t *BSP_LoadModel(cluster_t *cluster, char *gamedir, char *bspname)
header = (dheader_t*)data; header = (dheader_t*)data;
if (data[0] != 29) if (data[0] != 29)
{ {
Sys_Printf(cluster, "BSP not version 29\n", bspname, gamedir);
free(data); free(data);
Sys_Printf(cluster, "BSP not version 29\n", bspname, gamedir);
return NULL; return NULL;
} }
planes = (dplane_t*)(data+header->lumps[LUMP_PLANES].fileofs); planes = (dplane_t*)(data+LittleLong(header->lumps[LUMP_PLANES].fileofs));
nodes = (dnode_t*)(data+header->lumps[LUMP_NODES].fileofs); nodes = (dnode_t*)(data+LittleLong(header->lumps[LUMP_NODES].fileofs));
leaf = (dleaf_t*)(data+header->lumps[LUMP_LEAFS].fileofs); leaf = (dleaf_t*)(data+LittleLong(header->lumps[LUMP_LEAFS].fileofs));
numnodes = header->lumps[LUMP_NODES].filelen/sizeof(dnode_t); numnodes = LittleLong(header->lumps[LUMP_NODES].filelen)/sizeof(dnode_t);
numleafs = header->lumps[LUMP_LEAFS].filelen/sizeof(dleaf_t); numleafs = LittleLong(header->lumps[LUMP_LEAFS].filelen)/sizeof(dleaf_t);
bsp = malloc(sizeof(bsp_t) + sizeof(node_t)*numnodes + header->lumps[LUMP_VISIBILITY].filelen + sizeof(unsigned char *)*numleafs); bsp = malloc(sizeof(bsp_t) + sizeof(node_t)*numnodes + LittleLong(header->lumps[LUMP_VISIBILITY].filelen) + sizeof(unsigned char *)*numleafs);
if (bsp) if (bsp)
{ {
bsp->fullchecksum = 0; bsp->fullchecksum = 0;
@ -252,7 +252,7 @@ bsp_t *BSP_LoadModel(cluster_t *cluster, char *gamedir, char *bspname)
if (i == LUMP_ENTITIES) if (i == LUMP_ENTITIES)
continue; //entities never appear in any checksums continue; //entities never appear in any checksums
chksum = Com_BlockChecksum(data + header->lumps[i].fileofs, header->lumps[i].filelen); chksum = Com_BlockChecksum(data + LittleLong(header->lumps[i].fileofs), LittleLong(header->lumps[i].filelen));
bsp->fullchecksum ^= chksum; bsp->fullchecksum ^= chksum;
if (i == LUMP_VISIBILITY || i == LUMP_LEAFS || i == LUMP_NODES) if (i == LUMP_VISIBILITY || i == LUMP_LEAFS || i == LUMP_NODES)
continue; continue;
@ -266,14 +266,14 @@ bsp_t *BSP_LoadModel(cluster_t *cluster, char *gamedir, char *bspname)
for (i = 0; i < numnodes; i++) for (i = 0; i < numnodes; i++)
{ {
bsp->nodes[i].child[0] = nodes[i].children[0]; bsp->nodes[i].child[0] = LittleShort(nodes[i].children[0]);
bsp->nodes[i].child[1] = nodes[i].children[1]; bsp->nodes[i].child[1] = LittleShort(nodes[i].children[1]);
bsp->nodes[i].planedist = planes[nodes[i].planenum].dist; bsp->nodes[i].planedist = planes[LittleLong(nodes[i].planenum)].dist;
bsp->nodes[i].planen[0] = planes[nodes[i].planenum].normal[0]; bsp->nodes[i].planen[0] = planes[LittleLong(nodes[i].planenum)].normal[0];
bsp->nodes[i].planen[1] = planes[nodes[i].planenum].normal[1]; bsp->nodes[i].planen[1] = planes[LittleLong(nodes[i].planenum)].normal[1];
bsp->nodes[i].planen[2] = planes[nodes[i].planenum].normal[2]; bsp->nodes[i].planen[2] = planes[LittleLong(nodes[i].planenum)].normal[2];
} }
memcpy(bsp->pvslump, data+header->lumps[LUMP_VISIBILITY].fileofs, header->lumps[LUMP_VISIBILITY].filelen); memcpy(bsp->pvslump, data+LittleLong(header->lumps[LUMP_VISIBILITY].fileofs), LittleLong(header->lumps[LUMP_VISIBILITY].filelen));
for (i = 0; i < numleafs; i++) for (i = 0; i < numleafs; i++)
{ {

View file

@ -1251,7 +1251,7 @@ void ParseMessage(sv_t *tv, char *buffer, int length, int to, int mask)
if (i) if (i)
SendClientCommand(tv, "modellist %i %i\n", tv->clservercount, i); SendClientCommand(tv, "modellist %i %i\n", tv->clservercount, i);
else else
SendClientCommand(tv, "prespawn %i 0 %i\n", tv->clservercount, BSP_Checksum(tv->bsp)); SendClientCommand(tv, "prespawn %i 0 %i\n", tv->clservercount, LittleLong(BSP_Checksum(tv->bsp)));
} }
break; break;
case svc_soundlist: case svc_soundlist:

View file

@ -17,7 +17,13 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#ifdef __GNUC__
#define LittleLong(x) ({ typeof(x) _x = (x); _x = (((unsigned char *)&_x)[0]|(((unsigned char *)&_x)[1]<<8)|(((unsigned char *)&_x)[2]<<16)|(((unsigned char *)&_x)[3]<<24)); _x; })
#define LittleShort(x) ({ typeof(x) _x = (x); _x = (((unsigned char *)&_x)[0]|(((unsigned char *)&_x)[1]<<8)); _x; })
#else
#define LittleLong(x) (x)
#define LittleShort(x) (x)
#endif
//each server that we are connected to has it's own state. //each server that we are connected to has it's own state.
//it should be easy enough to use one thread per server. //it should be easy enough to use one thread per server.