Esempio n. 1
0
/*
=============
Q3_LoadBSPFile
=============
*/
void	Q3_LoadBSPFile(struct quakefile_s *qf)
{
    dheader_t	*header;

    // load the file header
    //LoadFile(filename, (void **)&header, offset, length);
    //
    LoadQuakeFile(qf, (void **)&header);

    // swap the header
    Q3_SwapBlock( (int *)header, sizeof(*header) );

    if ( header->ident != BSP_IDENT ) {
        Error( "%s is not a 2015 file", qf->filename );
    }
    if ( header->version != BSP_VERSION ) {
        Error( "%s is version %i, not %i", qf->filename, header->version, BSP_VERSION );
    }

    q3_numShaders = Q3_CopyLump( header, LUMP_SHADERS, (void *) &dshaders, sizeof(dshader_t) );
    q3_nummodels = Q3_CopyLump( header, LUMP_MODELS, (void *) &dmodels, sizeof(dmodel_t) );
    q3_numplanes = Q3_CopyLump( header, LUMP_PLANES, (void *) &dplanes, sizeof(dplane_t) );
    q3_numleafs = Q3_CopyLump( header, LUMP_LEAFS, (void *) &dleafs, sizeof(dleaf_t) );
    q3_numnodes = Q3_CopyLump( header, LUMP_NODES, (void *) &dnodes, sizeof(dnode_t) );
    q3_numleafsurfaces = Q3_CopyLump( header, LUMP_LEAFSURFACES, (void *) &dleafsurfaces, sizeof(dleafsurfaces[0]) );
    q3_numleafbrushes = Q3_CopyLump( header, LUMP_LEAFBRUSHES, (void *) &dleafbrushes, sizeof(dleafbrushes[0]) );
    q3_numbrushes = Q3_CopyLump( header, LUMP_BRUSHES, (void *) &dbrushes, sizeof(dbrush_t) );
    q3_numbrushsides = Q3_CopyLump( header, LUMP_BRUSHSIDES, (void *) &dbrushsides, sizeof(dbrushside_t) );
    q3_numDrawVerts = Q3_CopyLump( header, LUMP_DRAWVERTS, (void *) &drawVerts, sizeof(drawVert_t) );
    q3_numDrawSurfaces = Q3_CopyLump( header, LUMP_SURFACES, (void *) &drawSurfaces, sizeof(dsurface_t) );
//	q3_numFogs = Q3_CopyLump( header, LUMP_FOGS, (void *) &dfogs, sizeof(dfog_t) );
    q3_numDrawIndexes = Q3_CopyLump( header, LUMP_DRAWINDEXES, (void *) &drawIndexes, sizeof(drawIndexes[0]) );

    q3_numVisBytes = Q3_CopyLump( header, LUMP_VISIBILITY, (void *) &q3_visBytes, 1 );
    q3_numLightBytes = Q3_CopyLump( header, LUMP_LIGHTMAPS, (void *) &q3_lightBytes, 1 );
    q3_entdatasize = Q3_CopyLump( header, LUMP_ENTITIES, (void *) &dentdata, 1);

//	q3_numGridPoints = Q3_CopyLump( header, LUMP_LIGHTGRID, (void *) &q3_gridData, 8 );

    CountTriangles();

    FreeMemory( header );		// everything has been copied out

    // swap everything
    Q3_SwapBSPFile();

    Q3_FindVisibleBrushSides();

    //Q3_PrintBSPFileSizes();
}
Esempio n. 2
0
bspFile_t *BSP_Load( const char *name ) {
	union {
		int				*i;
		void			*v;
	} buf;
	int				i;
	int				length;
	bspFile_t		*bspFile = NULL;
	int				freeSlot = -1;

#ifndef BSPC
	if ( !name || !name[0] ) {
		Com_Error( ERR_DROP, "BSP_Load: NULL name" );
	}
#endif

	// check if already loaded
	for ( i = 0; i < MAX_BSP_FILES; i++ ) {
		if ( !bsp_loadedFiles[i] ) {
			if ( freeSlot == -1 ) {
				freeSlot = i;
			}
			continue;
		}

		if ( !Q_stricmp( bsp_loadedFiles[i]->name, name ) ) {
			bsp_loadedFiles[i]->references++;
			return bsp_loadedFiles[i];
		}
	}

	if ( freeSlot == -1 ) {
		Com_Error( ERR_DROP, "No free slot to load BSP '%s'", name );
	}

	//
	// load the file
	//
#ifndef BSPC
	length = FS_ReadFile( name, &buf.v );
#else
	length = LoadQuakeFile((quakefile_t *) name, &buf.v);
#endif

	if ( !buf.i ) {
		return NULL;
	}

	//
	// check formats
	//
	for ( i = 0; i < numBspFormats; i++ ) {
		bspFile = bspFormats[i]->loadFunction( bspFormats[i], name, buf.v, length );
		if ( bspFile ) {
			break;
		}
	}

	if ( i == numBspFormats ) {
		int ident = LittleLong( buf.i[0] );
		int version = LittleLong( buf.i[1] );

		Com_Error( ERR_DROP, "Unsupported BSP %s: ident %c%c%c%c, version %d",
				name, ident & 0xff, ( ident >> 8 ) & 0xff, ( ident >> 16 ) & 0xff,
				( ident >> 24 ) & 0xff, version );
	}