/*
enginecallback.h - actual engine callbacks
Copyright (C) 2010 Uncle Mike

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
*/

#ifndef ENGINECALLBACKS_H
#define ENGINECALLBACKS_H

// built-in memory manager
#define MALLOC( x )		(*g_engfuncs.pfnMemAlloc)( x, __FILE__, __LINE__ )
#define CALLOC( x, y )	(*g_engfuncs.pfnMemAlloc)((x) * (y), __FILE__, __LINE__ )
#define FREE( x )		(*g_engfuncs.pfnMemFree)( x, __FILE__, __LINE__ )

// screen handlers
#define PIC_Width		(*g_engfuncs.pfnPIC_Width)
#define PIC_Height		(*g_engfuncs.pfnPIC_Height)
#define PIC_EnableScissor	(*g_engfuncs.pfnPIC_EnableScissor)
#define PIC_DisableScissor	(*g_engfuncs.pfnPIC_DisableScissor)
#define FillRGBA		(*g_engfuncs.pfnFillRGBA)
#define GetScreenInfo	(*g_engfuncs.pfnGetScreenInfo)
#define GetGameInfo		(*g_engfuncs.pfnGetGameInfo)
#define CheckGameDll	(*g_engfuncs.pfnCheckGameDll)

#define PIC_SetGamma( x, y )	(*g_engfuncs.pfnProcessImage)( x, y, -1, -1 )
#define PIC_Remap( x, y, z )	(*g_engfuncs.pfnProcessImage)( x, -1.0f, y, z )

#define DRAW_LOGO		(*g_engfuncs.pfnDrawLogo)
#define PRECACHE_LOGO( x )	(*g_engfuncs.pfnDrawLogo)( x, 0, 0, 0, 0 )
#define GetLogoWidth	(*g_engfuncs.pfnGetLogoWidth)
#define GetLogoHeight	(*g_engfuncs.pfnGetLogoHeight)
#define GetLogoLength	(*g_engfuncs.pfnGetLogoLength)

inline HIMAGE PIC_Load( const char *szPicName, long flags = 0 )
{
	return g_engfuncs.pfnPIC_Load( szPicName, NULL, 0, flags );
}

inline HIMAGE PIC_Load( const char *szPicName, const byte *ucRawImage, long ulRawImageSize, long flags = 0 )
{
	return g_engfuncs.pfnPIC_Load( szPicName, ucRawImage, ulRawImageSize, flags );
}

#define PIC_Free		(*g_engfuncs.pfnPIC_Free)
#define PLAY_SOUND		(*g_engfuncs.pfnPlayLocalSound)
#define CVAR_REGISTER	(*g_engfuncs.pfnRegisterVariable)
#define CVAR_SET_FLOAT	(*g_engfuncs.pfnCvarSetValue)
#define CVAR_GET_FLOAT	(*g_engfuncs.pfnGetCvarFloat)
#define CVAR_GET_STRING	(*g_engfuncs.pfnGetCvarString)
#define CVAR_SET_STRING	(*g_engfuncs.pfnCvarSetString)
#define CLIENT_COMMAND	(*g_engfuncs.pfnClientCmd)
#define CLIENT_JOIN		(*g_engfuncs.pfnClientJoin)

#define GET_MENU_EDICT	(*g_engfuncs.pfnGetPlayerModel)
#define ENGINE_SET_MODEL	(*g_engfuncs.pfnSetModel)
#define R_ClearScene	(*g_engfuncs.pfnClearScene)
#define R_AddEntity		(*g_engfuncs.CL_CreateVisibleEntity)
#define R_RenderFrame	(*g_engfuncs.pfnRenderScene)

#define LOAD_FILE		(*g_engfuncs.COM_LoadFile)
#define FILE_EXISTS( file )	(*g_engfuncs.pfnFileExists)( file, FALSE )
#define FREE_FILE		(*g_engfuncs.COM_FreeFile)
#define GET_GAME_DIR	(*g_engfuncs.pfnGetGameDir)
#define HOST_ERROR		(*g_engfuncs.pfnHostError)
#define COM_ParseFile	(*g_engfuncs.COM_ParseFile)
#define KEY_SetDest		(*g_engfuncs.pfnSetKeyDest)
#define KEY_ClearStates	(*g_engfuncs.pfnKeyClearStates)
#define KEY_KeynumToString	(*g_engfuncs.pfnKeynumToString)
#define KEY_GetBinding	(*g_engfuncs.pfnKeyGetBinding)
#define KEY_SetBinding	(*g_engfuncs.pfnKeySetBinding)
#define KEY_IsDown		(*g_engfuncs.pfnKeyIsDown)
#define KEY_GetOverstrike	(*g_engfuncs.pfnKeyGetOverstrikeMode)
#define KEY_SetOverstrike	(*g_engfuncs.pfnKeySetOverstrikeMode)
#define Key_GetState	(*g_engfuncs.pfnKeyGetState)
#define SET_CURSOR		(*g_engfuncs.pfnSetCursor)
	
#define Cmd_AddCommand	(*g_engfuncs.pfnAddCommand)
#define Cmd_RemoveCommand	(*g_engfuncs.pfnDelCommand)
#define CMD_ARGC		(*g_engfuncs.pfnCmdArgc)
#define CMD_ARGV		(*g_engfuncs.pfnCmdArgv)
#define Con_Printf		(*g_engfuncs.Con_Printf)
#define Con_NPrintf		(*g_engfuncs.Con_NPrintf)

#define GET_GAMES_LIST	(*g_engfuncs.pfnGetGamesList)
#define BACKGROUND_TRACK	(*g_engfuncs.pfnPlayBackgroundTrack)
#define SHELL_EXECUTE	(*g_engfuncs.pfnShellExecute)
#define HOST_WRITECONFIG	(*g_engfuncs.pfnWriteServerConfig)
#define HOST_CHANGEGAME	(*g_engfuncs.pfnChangeInstance)
#define CHECK_MAP_LIST	(*g_engfuncs.pfnCreateMapsList)
#define HOST_ENDGAME	(*g_engfuncs.pfnHostEndGame)
#define GET_CLIPBOARD	(*g_engfuncs.pfnGetClipboardData)
#define FS_SEARCH		(*g_engfuncs.pfnGetFilesList)
#define MAP_IS_VALID	(*g_engfuncs.pfnIsMapValid)

#define GET_SAVE_COMMENT	(*g_engfuncs.pfnGetSaveComment)
#define GET_DEMO_COMMENT	(*g_engfuncs.pfnGetDemoComment)

#define CL_IsActive()	(g_engfuncs.pfnClientInGame() && !CVAR_GET_FLOAT( "cl_background" ))

inline void PIC_Set( HIMAGE hPic, int r, int g, int b )
{
	g_engfuncs.pfnPIC_Set( hPic, r, g, b, 255 );
}

inline void PIC_Set( HIMAGE hPic, int r, int g, int b, int a )
{
	g_engfuncs.pfnPIC_Set( hPic, r, g, b, a );
}

inline void PIC_Draw( int x, int y, const wrect_t *prc )
{
	g_engfuncs.pfnPIC_Draw( x, y, -1, -1, prc );
}

inline void PIC_Draw( int x, int y, int width, int height )
{
	g_engfuncs.pfnPIC_Draw( x, y, width, height, NULL );
}

inline void PIC_Draw( int x, int y, int width, int height, const wrect_t *prc )
{
	g_engfuncs.pfnPIC_Draw( x, y, width, height, prc );
}

inline void PIC_DrawTrans( int x, int y, const wrect_t *prc )
{
	g_engfuncs.pfnPIC_DrawTrans( x, y, -1, -1, prc );
}

inline void PIC_DrawTrans( int x, int y, int width, int height )
{
	g_engfuncs.pfnPIC_DrawTrans( x, y, width, height, NULL );
}

inline void PIC_DrawTrans( int x, int y, int width, int height, const wrect_t *prc )
{
	g_engfuncs.pfnPIC_DrawTrans( x, y, width, height, prc );
}

inline void PIC_DrawHoles( int x, int y, const wrect_t *prc )
{
	g_engfuncs.pfnPIC_DrawHoles( x, y, -1, -1, prc );
}

inline void SPR_DrawHoles( int x, int y, int width, int height )
{
	g_engfuncs.pfnPIC_DrawHoles( x, y, width, height, NULL );
}

inline void PIC_DrawAdditive( int x, int y, int width, int height )
{
	g_engfuncs.pfnPIC_DrawAdditive( x, y, width, height, NULL );
}

inline void PIC_DrawAdditive( int x, int y, const wrect_t *prc )
{
	g_engfuncs.pfnPIC_DrawAdditive( x, y, -1, -1, prc );
}

inline void PIC_DrawAdditive( int x, int y, int w, int h, const wrect_t *prc )
{
	g_engfuncs.pfnPIC_DrawAdditive( x, y, w, h, prc );
}

inline void TextMessageSetColor( int r, int g, int b, int alpha = 255 )
{
	g_engfuncs.pfnDrawSetTextColor( r, g, b, alpha );
}

#define TextMessageDrawChar	(*g_engfuncs.pfnDrawCharacter)
#define DrawConsoleString	(*g_engfuncs.pfnDrawConsoleString)
#define GetConsoleStringSize	(*g_engfuncs.pfnDrawConsoleStringLen)
#define ConsoleSetColor	(*g_engfuncs.pfnSetConsoleDefaultColor)

#define RANDOM_LONG		(*g_engfuncs.pfnRandomLong)
#define RANDOM_FLOAT	(*g_engfuncs.pfnRandomFloat)

#define COMPARE_FILE_TIME	(*g_engfuncs.pfnCompareFileTime)
#define VID_GET_MODE	(*g_engfuncs.pfnGetModeString)

#endif//ENGINECALLBACKS_H