1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "IGroundDecalDrawer.h"
#include "Rendering/Env/Decals/GroundDecalHandler.h"
#include "Rendering/Env/Decals/DecalsDrawerGL4.h"
#include "System/Config/ConfigHandler.h"
#include "System/Exceptions.h"
#include "System/SafeUtil.h"
#include "System/Log/ILog.h"
CONFIG(int, GroundDecals).defaultValue(3).headlessValue(0).description("Controls whether ground decals underneath buildings and ground scars from explosions will be rendered. Values >1 define how long such decals will stay.");
static NullGroundDecalDrawer nullDecalDrawer;
IGroundDecalDrawer* IGroundDecalDrawer::singleton = &nullDecalDrawer;
int IGroundDecalDrawer::decalLevel = 0;
static IGroundDecalDrawer* GetInstance()
{
IGroundDecalDrawer* instance = &nullDecalDrawer;
if (!IGroundDecalDrawer::GetDrawDecals()) {
LOG_L(L_INFO, "Loaded DecalsDrawer: %s", "off");
return instance;
}
#if 0
try {
instance = new CDecalsDrawerGL4();
LOG_L(L_INFO, "Loaded DecalsDrawer: %s", "GL4");
} catch(const unsupported_error& ex) {
LOG_L(L_ERROR, "IGroundDecalDrawer loading failed: %s", ex.what());
} catch(const opengl_error& ex) {
LOG_L(L_ERROR, "IGroundDecalDrawer loading failed: %s", ex.what());
}
#endif
if (instance == &nullDecalDrawer) {
instance = new CGroundDecalHandler();
LOG_L(L_INFO, "Loaded DecalsDrawer: %s", "Legacy");
}
return instance;
}
void IGroundDecalDrawer::Init()
{
decalLevel = configHandler->GetInt("GroundDecals");
FreeInstance();
singleton = GetInstance();
}
void IGroundDecalDrawer::FreeInstance()
{
if (singleton != &nullDecalDrawer)
spring::SafeDelete(singleton);
}
void IGroundDecalDrawer::SetDrawDecals(bool v)
{
if (v) {
decalLevel = std::abs(decalLevel);
} else {
decalLevel = -std::abs(decalLevel);
}
if (groundDecals == &nullDecalDrawer) {
groundDecals = GetInstance();
}
groundDecals->OnDecalLevelChanged();
}
|