mirror of
https://github.com/mapbase-source/source-sdk-2013.git
synced 2024-12-25 06:15:30 +03:00
Added "autocubemap" utility
This commit is contained in:
parent
264ee2b04f
commit
400d572c03
@ -61,6 +61,7 @@ $Project
|
||||
$File "mapbase\c_func_fake_worldportal.h"
|
||||
$File "mapbase\c_point_glow.cpp"
|
||||
$File "mapbase\c_vgui_text_display.cpp"
|
||||
$File "mapbase\mapbase_autocubemap.cpp"
|
||||
}
|
||||
|
||||
$Folder "HL2 DLL"
|
||||
|
280
sp/src/game/client/mapbase/mapbase_autocubemap.cpp
Normal file
280
sp/src/game/client/mapbase/mapbase_autocubemap.cpp
Normal file
@ -0,0 +1,280 @@
|
||||
//========= Mapbase - https://github.com/mapbase-source/source-sdk-2013 ============//
|
||||
//
|
||||
// Purpose: A utility which automatically generates HDR and LDR cubemaps.
|
||||
// This has the following purposes:
|
||||
//
|
||||
// 1. Allow both HDR and LDR cubemaps to be generated automatically after a map is compiled
|
||||
// 2. Have a way to batch build cubemaps for several levels at once
|
||||
//
|
||||
// Author: Blixibon
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//=============================================================================//
|
||||
|
||||
#include "cbase.h"
|
||||
|
||||
#include "tier0/icommandline.h"
|
||||
#include "igamesystem.h"
|
||||
#include "filesystem.h"
|
||||
#include "utlbuffer.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
extern const char *g_MapName;
|
||||
|
||||
ConVar autocubemap_hdr_do_both( "autocubemap_hdr_do_both", "1" );
|
||||
ConVar autocubemap_hdr_value( "autocubemap_hdr_value", "2" );
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
class CAutoCubemapSystem : public CAutoGameSystem
|
||||
{
|
||||
public:
|
||||
CAutoCubemapSystem() : CAutoGameSystem( "CAutoCubemapSystem" )
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool Init()
|
||||
{
|
||||
const char *pszFile = NULL;
|
||||
if (CommandLine()->CheckParm( "-autocubemap", &pszFile ))
|
||||
{
|
||||
if (!pszFile || pszFile[0] == '\0')
|
||||
{
|
||||
// Assume that we just want to autocubemap the first map we load
|
||||
// (no code here for now)
|
||||
}
|
||||
else
|
||||
{
|
||||
LoadFile( pszFile );
|
||||
}
|
||||
|
||||
// Begin autocubemap with the first level we load
|
||||
m_bAutoCubemapOnFirstLevel = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual void LevelInitPostEntity()
|
||||
{
|
||||
if (m_bAutoCubemapActive)
|
||||
{
|
||||
if (m_bAutoCubemapBuildingCubemaps)
|
||||
{
|
||||
// Check if we need to do the other HDR level
|
||||
if (autocubemap_hdr_do_both.GetBool() && !m_bAutoCubemapDoingBoth)
|
||||
{
|
||||
m_bAutoCubemapBuildingCubemaps = false;
|
||||
m_bAutoCubemapDoingBoth = true;
|
||||
|
||||
// Change the HDR level and restart the map
|
||||
//ConVarRef mat_hdr_level( "mat_hdr_level" );
|
||||
engine->ClientCmd_Unrestricted( VarArgs( "toggle mat_hdr_level 0 %i; restart", autocubemap_hdr_value.GetInt() ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Go to the next map
|
||||
m_bAutoCubemapBuildingCubemaps = false;
|
||||
m_bAutoCubemapDoingBoth = false;
|
||||
|
||||
m_AutoCubemapMapsIndex++;
|
||||
if (m_AutoCubemapMapsIndex < m_AutoCubemapMaps.Count())
|
||||
{
|
||||
engine->ClientCmd_Unrestricted( VarArgs( "map %s", m_AutoCubemapMaps[m_AutoCubemapMapsIndex] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// CUBEMAPPER FINISHED
|
||||
m_AutoCubemapMaps.PurgeAndDeleteElements();
|
||||
m_AutoCubemapMapsIndex = 0;
|
||||
m_bAutoCubemapActive = false;
|
||||
|
||||
Msg( "CUBEMAPPER FINISHED\n" );
|
||||
|
||||
if (autocubemap_hdr_do_both.GetBool())
|
||||
{
|
||||
engine->ClientCmd_Unrestricted( VarArgs( "mat_hdr_level %i", m_iAutoCubemapUserHDRLevel ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Build cubemaps for this map
|
||||
m_bAutoCubemapBuildingCubemaps = true;
|
||||
engine->ClientCmd_Unrestricted( "exec buildcubemaps_prep; buildcubemaps" );
|
||||
}
|
||||
}
|
||||
else if (m_bAutoCubemapOnFirstLevel)
|
||||
{
|
||||
// Start autocubemap now
|
||||
StartAutoCubemap();
|
||||
m_bAutoCubemapOnFirstLevel = false;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
|
||||
void StartAutoCubemap()
|
||||
{
|
||||
if (m_AutoCubemapMaps.Count() <= 0)
|
||||
{
|
||||
//Msg("No maps to cubemap with!\n");
|
||||
//return;
|
||||
|
||||
// Just do this map
|
||||
m_AutoCubemapMaps.AddToTail( strdup( g_MapName ) );
|
||||
}
|
||||
|
||||
if (autocubemap_hdr_do_both.GetBool())
|
||||
{
|
||||
// Save the user's HDR level
|
||||
ConVarRef mat_hdr_level( "mat_hdr_level" );
|
||||
m_iAutoCubemapUserHDRLevel = mat_hdr_level.GetInt();
|
||||
}
|
||||
|
||||
m_bAutoCubemapActive = true;
|
||||
m_AutoCubemapMapsIndex = 0;
|
||||
|
||||
if (FStrEq( m_AutoCubemapMaps[m_AutoCubemapMapsIndex], g_MapName ))
|
||||
{
|
||||
// Build cubemaps right here, right now
|
||||
m_bAutoCubemapBuildingCubemaps = true;
|
||||
engine->ClientCmd_Unrestricted( "exec buildcubemaps_prep; buildcubemaps" );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Go to that map
|
||||
engine->ClientCmd_Unrestricted( VarArgs( "map %s", m_AutoCubemapMaps[m_AutoCubemapMapsIndex] ) );
|
||||
}
|
||||
}
|
||||
|
||||
void LoadFile( const char *pszFile )
|
||||
{
|
||||
KeyValues *pKV = new KeyValues( "AutoCubemap" );
|
||||
|
||||
if ( pKV->LoadFromFile( filesystem, pszFile, NULL ) )
|
||||
{
|
||||
KeyValues *pSubKey = pKV->GetFirstSubKey();
|
||||
|
||||
while ( pSubKey )
|
||||
{
|
||||
m_AutoCubemapMaps.AddToTail( strdup(pSubKey->GetName()) );
|
||||
pSubKey = pSubKey->GetNextKey();
|
||||
}
|
||||
|
||||
Msg( "Initted autocubemap\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
Warning( "Unable to load autocubemap file \"%s\"\n", pszFile );
|
||||
}
|
||||
|
||||
pKV->deleteThis();
|
||||
}
|
||||
|
||||
void Clear()
|
||||
{
|
||||
m_bAutoCubemapActive = false;
|
||||
m_bAutoCubemapBuildingCubemaps = false;
|
||||
m_bAutoCubemapDoingBoth = false;
|
||||
|
||||
m_AutoCubemapMaps.PurgeAndDeleteElements();
|
||||
m_AutoCubemapMapsIndex = 0;
|
||||
}
|
||||
|
||||
void PrintState()
|
||||
{
|
||||
char szCmd[1024] = { 0 };
|
||||
|
||||
if (m_AutoCubemapMaps.Count() > 0)
|
||||
{
|
||||
Q_strncpy( szCmd, "=== CUBEMAPPER MAP LIST ===\n", sizeof( szCmd ) );
|
||||
|
||||
FOR_EACH_VEC( m_AutoCubemapMaps, i )
|
||||
{
|
||||
Q_snprintf( szCmd, sizeof( szCmd ), "%s%s\n", szCmd, m_AutoCubemapMaps[i] );
|
||||
}
|
||||
|
||||
Q_strncat( szCmd, "========================", sizeof( szCmd ), COPY_ALL_CHARACTERS );
|
||||
|
||||
Q_snprintf( szCmd, sizeof( szCmd ), "%s\nNumber of maps: %i (starting at %i)\n", szCmd, m_AutoCubemapMaps.Count(), m_AutoCubemapMapsIndex );
|
||||
}
|
||||
else
|
||||
{
|
||||
Q_strncat( szCmd, "========================\n", sizeof( szCmd ), COPY_ALL_CHARACTERS );
|
||||
Q_strncat( szCmd, "There are no maps selected. Use 'autocubemap_init' to load a map list.\nIf 'autocubemap_start' is executed while no maps are selected, only the current map will have cubemaps generated.\n", sizeof( szCmd ), COPY_ALL_CHARACTERS );
|
||||
Q_strncat( szCmd, "========================\n", sizeof( szCmd ), COPY_ALL_CHARACTERS );
|
||||
}
|
||||
|
||||
Msg( "%s", szCmd );
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
|
||||
bool m_bAutoCubemapActive = false;
|
||||
bool m_bAutoCubemapBuildingCubemaps = false;
|
||||
bool m_bAutoCubemapDoingBoth = false;
|
||||
int m_iAutoCubemapUserHDRLevel; // For setting the user back to the right HDR level when we're finished
|
||||
|
||||
// Start autocubemap with the first level we load (used for launch parameter)
|
||||
bool m_bAutoCubemapOnFirstLevel = false;
|
||||
|
||||
CUtlVector<const char*> m_AutoCubemapMaps;
|
||||
int m_AutoCubemapMapsIndex;
|
||||
};
|
||||
|
||||
CAutoCubemapSystem g_AutoCubemapSystem;
|
||||
|
||||
CON_COMMAND( autocubemap_init, "Inits autocubemap" )
|
||||
{
|
||||
if (gpGlobals->maxClients > 1)
|
||||
{
|
||||
Msg( "Can't run autocubemap in multiplayer\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.ArgC() <= 1)
|
||||
{
|
||||
Msg("Format: autocubemap_init <file name in the 'cfg' folder>\n");
|
||||
return;
|
||||
}
|
||||
|
||||
g_AutoCubemapSystem.LoadFile( args.Arg( 1 ) );
|
||||
}
|
||||
|
||||
CON_COMMAND( autocubemap_print, "Prints current autocubemap information" )
|
||||
{
|
||||
if (gpGlobals->maxClients > 1)
|
||||
{
|
||||
Msg("Can't run autocubemap in multiplayer\n");
|
||||
return;
|
||||
}
|
||||
|
||||
g_AutoCubemapSystem.PrintState();
|
||||
}
|
||||
|
||||
CON_COMMAND( autocubemap_clear, "Clears autocubemap stuff" )
|
||||
{
|
||||
if (gpGlobals->maxClients > 1)
|
||||
{
|
||||
Msg("Can't run autocubemap in multiplayer\n");
|
||||
return;
|
||||
}
|
||||
|
||||
g_AutoCubemapSystem.Clear();
|
||||
}
|
||||
|
||||
CON_COMMAND( autocubemap_start, "Begins the autocubemap (it's recommended to check 'autocubemap_print' before running this command)" )
|
||||
{
|
||||
if (gpGlobals->maxClients > 1)
|
||||
{
|
||||
Msg("Can't run autocubemap in multiplayer\n");
|
||||
return;
|
||||
}
|
||||
|
||||
g_AutoCubemapSystem.StartAutoCubemap();
|
||||
}
|
Loading…
Reference in New Issue
Block a user