Commit 3d51a3b1 authored by D-AIRY's avatar D-AIRY

Cvar change event; fixed skybox size

parent ae91b346
......@@ -6,8 +6,49 @@ See the license in LICENSE
#include "SkyBox.h"
CSkyBox::CSkyBox()
class CRFarCvarListener: public IEventListener<XEventCvarChanged>
{
public:
CRFarCvarListener(IXCore *pCore, CSkyBox *pSkyBox):
m_pCore(pCore),
m_pSkyBox(pSkyBox)
{
}
virtual void onEvent(const XEventCvarChanged *pEvent)
{
static const float *r_far = m_pCore->getPCVarFloat("r_far");
if(pEvent->pCvar == r_far)
{
m_pSkyBox->updateBuffers();
}
}
private:
CSkyBox *m_pSkyBox;
IXCore *m_pCore;
};
//##########################################################################
CSkyBox::CSkyBox(IXCore *pCore):
m_pCore(pCore)
{
m_pRFarCvarListener = new CRFarCvarListener(m_pCore, this);
m_pCore->getEventChannel<XEventCvarChanged>(EVENT_CVAR_CHANGED_GUID)->addListener(m_pRFarCvarListener);
}
CSkyBox::~CSkyBox()
{
m_pCore->getEventChannel<XEventCvarChanged>(EVENT_CVAR_CHANGED_GUID)->removeListener(m_pRFarCvarListener);
mem_delete(m_pRFarCvarListener);
mem_release(m_pSky1);
mem_release(m_pSky2);
mem_release(m_pIndeces);
mem_release(m_pRenderBuffer);
mem_release(m_pVertexDeclarationSkyBox);
}
void CSkyBox::setDevice(IGXDevice *pDevice)
......@@ -25,31 +66,8 @@ void CSkyBox::setDevice(IGXDevice *pDevice)
m_pVertexDeclarationSkyBox = m_pDevice->createVertexDeclaration(layoutskybox);
//! @todo fix that! r_far cvar
float fFar = 5000.0f * 0.57735f;
float X = fFar;
float Y = fFar;
float Z = fFar;
CSkyBoxVertex tmpVertices[] = {
CSkyBoxVertex(X, Y, Z, 1.0f, 1.0f, 1.0f),
CSkyBoxVertex(-X, Y, Z, -1.0f, 1.0f, 1.0f),
CSkyBoxVertex(X, -Y, Z, 1.0f, -1.0f, 1.0f),
CSkyBoxVertex(X, Y, -Z, 1.0f, 1.0f, -1.0f),
CSkyBoxVertex(-X, -Y, Z, -1.0f, -1.0f, 1.0f),
CSkyBoxVertex(X, -Y, -Z, 1.0f, -1.0f, -1.0f),
CSkyBoxVertex(-X, Y, -Z, -1.0f, 1.0f, -1.0f),
CSkyBoxVertex(-X, -Y, -Z, -1.0f, -1.0f, -1.0f)
};
IGXVertexBuffer *pVertices = m_pDevice->createVertexBuffer(8 * sizeof(CSkyBoxVertex), GXBUFFER_USAGE_STATIC, tmpVertices);
m_pRenderBuffer = m_pDevice->createRenderBuffer(1, &pVertices, m_pVertexDeclarationSkyBox);
mem_release(pVertices);
updateBuffers();
WORD indices_tmp[] =
{
4, 1, 0,
......@@ -89,6 +107,36 @@ void CSkyBox::setMaterialSystem(IXMaterialSystem *pMaterialSystem)
m_pVertexShaderHandler = m_pMaterialSystem->registerVertexShader(pFormat, "base/skybox.vs");
}
void CSkyBox::updateBuffers()
{
mem_release(m_pRenderBuffer);
static const float * r_far = m_pCore->getPCVarFloat("r_far");
float fFar = *r_far * 0.57735f;
float X = fFar;
float Y = fFar;
float Z = fFar;
CSkyBoxVertex tmpVertices[] = {
CSkyBoxVertex(X, Y, Z, 1.0f, 1.0f, 1.0f),
CSkyBoxVertex(-X, Y, Z, -1.0f, 1.0f, 1.0f),
CSkyBoxVertex(X, -Y, Z, 1.0f, -1.0f, 1.0f),
CSkyBoxVertex(X, Y, -Z, 1.0f, 1.0f, -1.0f),
CSkyBoxVertex(-X, -Y, Z, -1.0f, -1.0f, 1.0f),
CSkyBoxVertex(X, -Y, -Z, 1.0f, -1.0f, -1.0f),
CSkyBoxVertex(-X, Y, -Z, -1.0f, 1.0f, -1.0f),
CSkyBoxVertex(-X, -Y, -Z, -1.0f, -1.0f, -1.0f)
};
IGXVertexBuffer *pVertices = m_pDevice->createVertexBuffer(8 * sizeof(CSkyBoxVertex), GXBUFFER_USAGE_STATIC, tmpVertices);
m_pRenderBuffer = m_pDevice->createRenderBuffer(1, &pVertices, m_pVertexDeclarationSkyBox);
mem_release(pVertices);
}
void CSkyBox::setTexture(const char *szTexture)
{
......
......@@ -12,10 +12,7 @@ See the license in LICENSE
#include <common/array.h>
#include <common/String.h>
#include <mtrl/IXMaterialSystem.h>
//##########################################################################
#define SXGC_SKYBOX_SIZE 800.f
#include <xcommon/IXCore.h>
//##########################################################################
......@@ -32,13 +29,17 @@ struct CSkyBoxVertex
//##########################################################################
class CRFarCvarListener;
//! скайбокс, куб, на который накалывдается кубическая текстура с изображением неба
class CSkyBox
{
friend class CRFarCvarListener;
public:
SX_ALIGNED_OP_MEM2();
CSkyBox();
CSkyBox(IXCore *pCore);
~CSkyBox();
void setDevice(IGXDevice *pDevice);
void setMaterialSystem(IXMaterialSystem *pMaterialSystem);
......@@ -70,6 +71,10 @@ public:
void update(float fDT);
protected:
void updateBuffers();
IXCore *m_pCore;
//! декларация вершин
IGXVertexDeclaration *m_pVertexDeclarationSkyBox = NULL;
......@@ -104,7 +109,9 @@ protected:
IGXDevice *m_pDevice = NULL;
IXMaterialSystem *m_pMaterialSystem = NULL;
XVertexShaderHandler* m_pVertexShaderHandler = NULL;
XVertexShaderHandler *m_pVertexShaderHandler = NULL;
CRFarCvarListener *m_pRFarCvarListener = NULL;
};
#if 0
......
......@@ -61,7 +61,7 @@ public:
{
m_pCore = pCore;
m_pSkyBox = new CSkyBox();
m_pSkyBox = new CSkyBox(pCore);
m_pRenderable = new CRenderable(getID(), m_pSkyBox);
m_pUpdatable = new CUpdatable(m_pSkyBox);
......
......@@ -28,9 +28,10 @@ CCore::CCore(const char *szName)
{
ConsoleConnect(szName);
ConsoleRegisterCmds();
CvarInitSystem(this);
Core_0RegisterCVarBool("g_time_run", true, "Запущено ли игрвоое время?", FCVAR_NOTIFY);
Core_0RegisterCVarFloat("g_time_speed", 1.f, "Скорость/соотношение течения игрового времени", FCVAR_NOTIFY);
Core_0RegisterCVarBool("g_time_run", true, "Запущено ли игровое время?", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarFloat("g_time_speed", 1.f, "Скорость/соотношение течения игрового времени", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarBool("dbg_config_save", false, "Отладочный вывод процесса сохранения конфига");
Core_0RegisterCVarInt("r_stats", 1, "Показывать ли статистику? 0 - нет, 1 - fps и игровое время, 2 - показать полностью");
......@@ -432,6 +433,23 @@ IXConfig* XMETHODCALLTYPE CCore::newConfig()
return(new CXConfig());
}
const char** XMETHODCALLTYPE CCore::getPCVarString(const char *szName)
{
return(GET_PCVAR_STRING(szName));
}
const int* XMETHODCALLTYPE CCore::getPCVarInt(const char *szName)
{
return(GET_PCVAR_INT(szName));
}
const float* XMETHODCALLTYPE CCore::getPCVarFloat(const char *szName)
{
return(GET_PCVAR_FLOAT(szName));
}
const bool* XMETHODCALLTYPE CCore::getPCVarBool(const char *szName)
{
return(GET_PCVAR_BOOL(szName));
}
//##########################################################################
C SXCORE_API IXCore* XCoreInit(const char *szName)
......
......@@ -45,6 +45,11 @@ public:
IXConfig* XMETHODCALLTYPE CCore::newConfig() override;
const char** XMETHODCALLTYPE getPCVarString(const char *szName) override;
const int* XMETHODCALLTYPE getPCVarInt(const char *szName) override;
const float* XMETHODCALLTYPE getPCVarFloat(const char *szName) override;
const bool* XMETHODCALLTYPE getPCVarBool(const char *szName) override;
protected:
IBaseEventChannel* getEventChannelInternal(const XGUID &guid) override;
......
/***********************************************************
Copyright Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018
Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018
See the license in LICENSE
***********************************************************/
......@@ -36,4 +36,6 @@ bool ConsoleConnect(const char *szName = 0, bool bNewInstance = false);
void ConsoleDisconnect();
void ConsoleRegisterCmds();
void CvarInitSystem(IXCore *pCore);
#endif
......@@ -5,9 +5,11 @@ See the license in LICENSE
***********************************************************/
#include "cvars.h"
#include <xcommon/XEvents.h>
AssotiativeArray<String, CVar> g_mCVars;
AssotiativeArray<String, CVarPtr> g_mCVarPtrs;
IEventChannel<XEventCvarChanged> *g_pNotifyEventChannel = NULL;
SX_LIB_API void Core_0RegisterCVarString(const char * name, const char * value, const char * desc, int flags)
{
......@@ -196,10 +198,18 @@ SX_LIB_API void Core_0SetCVarString(const char * name, const char * value)
cv->value.c = new char[len + 1];
}
strcpy((char*)cv->value.c, value);
if(pNode->Val->flags & FCVAR_NOTIFY)
if(pNode->Val->flags & FCVAR_NOTIFY_OLD)
{
Core_0ConsoleExecCmd("on_%s_change", name);
}
if(pNode->Val->flags & FCVAR_NOTIFY)
{
XEventCvarChanged ev;
ev.type = XEventCvarChanged::TYPE_STRING;
ev.szName = name;
ev.pCvar = &cv->value.c;
g_pNotifyEventChannel->broadcastEvent(&ev);
}
}
}
......@@ -210,10 +220,18 @@ SX_LIB_API void Core_0SetCVarInt(const char * name, int value)
{
CVar * cv = pNode->Val;
cv->value.i = value;
if(pNode->Val->flags & FCVAR_NOTIFY)
if(pNode->Val->flags & FCVAR_NOTIFY_OLD)
{
Core_0ConsoleExecCmd("on_%s_change", name);
}
if(pNode->Val->flags & FCVAR_NOTIFY)
{
XEventCvarChanged ev;
ev.type = XEventCvarChanged::TYPE_INT;
ev.szName = name;
ev.pCvar = &cv->value.i;
g_pNotifyEventChannel->broadcastEvent(&ev);
}
}
}
......@@ -224,10 +242,18 @@ SX_LIB_API void Core_0SetCVarFloat(const char * name, float value)
{
CVar * cv = pNode->Val;
cv->value.f = value;
if(pNode->Val->flags & FCVAR_NOTIFY)
if(pNode->Val->flags & FCVAR_NOTIFY_OLD)
{
Core_0ConsoleExecCmd("on_%s_change", name);
}
if(pNode->Val->flags & FCVAR_NOTIFY)
{
XEventCvarChanged ev;
ev.type = XEventCvarChanged::TYPE_FLOAT;
ev.szName = name;
ev.pCvar = &cv->value.f;
g_pNotifyEventChannel->broadcastEvent(&ev);
}
}
}
......@@ -238,10 +264,18 @@ SX_LIB_API void Core_0SetCVarBool(const char * name, bool value)
{
CVar * cv = pNode->Val;
cv->value.b = value;
if(pNode->Val->flags & FCVAR_NOTIFY)
if(pNode->Val->flags & FCVAR_NOTIFY_OLD)
{
Core_0ConsoleExecCmd("on_%s_change", name);
}
if(pNode->Val->flags & FCVAR_NOTIFY)
{
XEventCvarChanged ev;
ev.type = XEventCvarChanged::TYPE_BOOL;
ev.szName = name;
ev.pCvar = &cv->value.b;
g_pNotifyEventChannel->broadcastEvent(&ev);
}
}
}
......@@ -420,3 +454,8 @@ void DumpCVars()
}
}
}
void CvarInitSystem(IXCore *pCore)
{
g_pNotifyEventChannel = pCore->getEventChannel<XEventCvarChanged>(EVENT_CVAR_CHANGED_GUID);
}
......@@ -498,10 +498,11 @@ __inline void Core_SetOutPtr()
//! Флаги кваров
enum CVAR_FLAG
{
FCVAR_NONE = 0x00, //!< нет
FCVAR_CHEAT = 0x01, //!< Изменение этой переменной с дефолтного значения разрешено только в режиме разработки
FCVAR_READONLY = 0x02, //!< Только для чтения
FCVAR_NOTIFY = 0x04 //!< Оповещать об изменениях
FCVAR_NONE = 0x00, //!< нет
FCVAR_CHEAT = 0x01, //!< Изменение этой переменной с дефолтного значения разрешено только в режиме разработки
FCVAR_READONLY = 0x02, //!< Только для чтения
FCVAR_NOTIFY_OLD = 0x04, //!< Оповещать об изменениях
FCVAR_NOTIFY = 0x08 //!< Оповещать об изменениях
};
//! Регистрирует строковую переменную
......
......@@ -93,13 +93,13 @@ bool XMETHODCALLTYPE CEngine::initGraphics(XWINDOW_OS_HANDLE hWindow, IXEngineCa
LibReport(REPORT_MSG_LEVEL_NOTICE, "LIB input initialized\n");
// init graphics
Core_0RegisterCVarInt("r_win_width", 800, "Размер окна по горизонтали (в пикселях)", FCVAR_NOTIFY);
Core_0RegisterCVarInt("r_win_height", 600, "Размер окна по вертикали (в пикселях)", FCVAR_NOTIFY);
Core_0RegisterCVarBool("r_win_windowed", true, "Режим рендера true - оконный, false - полноэкранный", FCVAR_NOTIFY);
Core_0RegisterCVarBool("r_win_borderless", false, "Режим без рамки", FCVAR_NOTIFY);
Core_0RegisterCVarInt("r_win_width", 800, "Размер окна по горизонтали (в пикселях)", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarInt("r_win_height", 600, "Размер окна по вертикали (в пикселях)", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarBool("r_win_windowed", true, "Режим рендера true - оконный, false - полноэкранный", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarBool("r_win_borderless", false, "Режим без рамки", FCVAR_NOTIFY_OLD);
Core_0RegisterCVarFloat("r_default_fov", SM_PI * 0.25f, "Дефолтный fov в радианах");
Core_0RegisterCVarFloat("r_near", 0.025f, "Ближняя плоскость отсчечения");
Core_0RegisterCVarFloat("r_far", 800, "Дальняя плоскость отсечения (дальность видимости)");
Core_0RegisterCVarFloat("r_near", 0.025f, "Ближняя плоскость отсчечения", FCVAR_NOTIFY);
Core_0RegisterCVarFloat("r_far", 800.0f, "Дальняя плоскость отсечения (дальность видимости)", FCVAR_NOTIFY);
Core_0RegisterCVarInt("r_final_image", DS_RT_SCENELIGHT, "Тип финального (выводимого в окно рендера) изображения из перечисления DS_RT");
......
......@@ -42,6 +42,11 @@ public:
virtual IXConfig* XMETHODCALLTYPE newConfig() = 0;
virtual const char** XMETHODCALLTYPE getPCVarString(const char *szName) = 0;
virtual const int* XMETHODCALLTYPE getPCVarInt(const char *szName) = 0;
virtual const float* XMETHODCALLTYPE getPCVarFloat(const char *szName) = 0;
virtual const bool* XMETHODCALLTYPE getPCVarBool(const char *szName) = 0;
template<typename T> IEventChannel<T> *getEventChannel(const XGUID &guid)
{
return((IEventChannel<T>*)getEventChannelInternal(guid));
......
......@@ -202,4 +202,23 @@ struct XEventModelChanged
IXModel *pModel;
};
// {A816DD94-0F92-48EA-A174-03599963BF84}
#define EVENT_CVAR_CHANGED_GUID DEFINE_XGUID(0xa816dd94, 0xf92, 0x48ea, 0xa1, 0x74, 0x3, 0x59, 0x99, 0x63, 0xbf, 0x84)
class IXModel;
struct XEventCvarChanged
{
enum TYPE
{
TYPE_INT,
TYPE_FLOAT,
TYPE_STRING,
TYPE_BOOL
// ...
} type;
const char *szName;
const void *pCvar;
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment