This repository has been archived on 2022-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
Xash3DArchive/common/bsplib/bsplib.c

158 lines
4.2 KiB
C

//=======================================================================
// Copyright XashXT Group 2008 ©
// bsplib.c - bsp level creator
//=======================================================================
#include "bsplib.h"
byte *checkermate_dds;
size_t checkermate_dds_size;
char path[MAX_SYSPATH];
uint bsp_parms;
file_t *bsplog;
cvar_t *bsplib_compress_bsp;
dll_info_t physic_dll = { "physic.dll", NULL, "CreateAPI", NULL, NULL, false, sizeof(physic_exp_t) };
physic_exp_t *pe;
void BSP_PrintLog( const char *pMsg )
{
if( !enable_log ) return;
if( !bsplog ) bsplog = FS_Open( va("maps/%s.log", gs_filename ), "wb" );
FS_Print( bsplog, pMsg );
}
static void AddCollision( void* handle, const void* buffer, size_t size )
{
if((dcollisiondatasize + size) > MAX_MAP_COLLISION )
Sys_Error( "MAX_MAP_COLLISION limit exceeded\n" );
Mem_Copy( dcollision + dcollisiondatasize, (void *)buffer, size );
dcollisiondatasize += size;
}
void ProcessCollisionTree( void )
{
if( !physic_dll.link ) return;
dcollisiondatasize = 0;
pe->WriteCollisionLump( NULL, AddCollision );
}
void Init_PhysicsLibrary( void )
{
static physic_imp_t pi;
launch_t CreatePhysic;
pi.api_size = sizeof(physic_imp_t);
Sys_LoadLibrary( &physic_dll );
if( physic_dll.link )
{
CreatePhysic = (void *)physic_dll.main;
pe = CreatePhysic( &com, &pi ); // sys_error not overrided
pe->Init(); // initialize phys callback
}
else Mem_Set( &pe, 0, sizeof( pe ));
}
void Free_PhysicLibrary( void )
{
if( physic_dll.link )
{
pe->Shutdown();
Mem_Set( &pe, 0, sizeof( pe ));
}
Sys_FreeLibrary( &physic_dll );
}
bool PrepareBSPModel( const char *dir, const char *name )
{
int numshaders;
bsp_parms = 0;
bsplog = NULL;
// get global parms
if( FS_CheckParm( "-vis" )) bsp_parms |= BSPLIB_MAKEVIS;
if( FS_CheckParm( "-qrad" )) bsp_parms |= BSPLIB_MAKEQ2RAD;
if( FS_CheckParm( "-hlrad" )) bsp_parms |= BSPLIB_MAKEHLRAD;
if( FS_CheckParm( "-full" )) bsp_parms |= BSPLIB_FULLCOMPILE;
if( FS_CheckParm( "-onlyents" )) bsp_parms |= BSPLIB_ONLYENTS;
if( FS_CheckParm( "-info" )) bsp_parms |= BSPLIB_SHOWINFO;
// famous q1 "notexture" image: purple-black checkerboard
checkermate_dds = FS_LoadInternal( "checkerboard.dds", &checkermate_dds_size );
Image_Init( NULL, IL_ALLOW_OVERWRITE|IL_IGNORE_MIPS );
bsplib_compress_bsp = Cvar_Get( "bsp_compress", "0", CVAR_SYSTEMINFO, "compress bsp lumps" );
// merge parms
if( bsp_parms & BSPLIB_ONLYENTS )
{
bsp_parms = (BSPLIB_ONLYENTS|BSPLIB_MAKEBSP);
}
else
{
if( bsp_parms & BSPLIB_MAKEQ2RAD && bsp_parms & BSPLIB_MAKEHLRAD )
{
MsgDev( D_WARN, "both type 'hlrad' and 'qrad' specified\ndefaulting to 'qrad'\n" );
bsp_parms &= ~BSPLIB_MAKEHLRAD;
}
if( bsp_parms & BSPLIB_FULLCOMPILE )
{
if((bsp_parms & BSPLIB_MAKEVIS) && (bsp_parms & (BSPLIB_MAKEQ2RAD|BSPLIB_MAKEHLRAD)))
{
bsp_parms |= BSPLIB_MAKEBSP; // rebuild bsp file for final compile
bsp_parms |= BSPLIB_DELETE_TEMP;
}
}
if(!(bsp_parms & (BSPLIB_MAKEVIS|BSPLIB_MAKEQ2RAD|BSPLIB_MAKEHLRAD)))
{
// -vis -light or -rad not specified, just create a .bsp
bsp_parms |= BSPLIB_MAKEBSP;
}
}
FS_LoadGameInfo( "gameinfo.txt" ); // same as normal gamemode
Init_PhysicsLibrary();
enable_log = true;
numshaders = LoadShaderInfo();
Msg( "%5i shaderInfo\n", numshaders );
return true;
}
bool CompileBSPModel ( void )
{
// now run specified utils
if( bsp_parms & BSPLIB_MAKEBSP )
WbspMain();
if( bsp_parms & BSPLIB_MAKEVIS )
WvisMain();
if( bsp_parms & (BSPLIB_MAKEQ2RAD|BSPLIB_MAKEHLRAD))
WradMain();
if( bsp_parms & BSPLIB_SHOWINFO )
PrintBSPFileSizes();
Free_PhysicLibrary();
// close log before deleting temporaries
enable_log = false;
if( bsplog ) FS_Close( bsplog );
bsplog = NULL;
if( bsp_parms & BSPLIB_DELETE_TEMP )
{
// delete all temporary files after final compile
com.sprintf( path, "%s/maps/%s.prt", com.GameInfo->gamedir, gs_filename );
FS_Delete( path );
com.sprintf( path, "%s/maps/%s.lin", com.GameInfo->gamedir, gs_filename );
FS_Delete( path );
com.sprintf( path, "%s/maps/%s.log", com.GameInfo->gamedir, gs_filename );
FS_Delete( path );
}
return true;
}