diff --git a/build/config_editor.cfg b/build/config_editor.cfg index 1f0c7fee806022c5511574530000145b1211a0c6..8a02e596e8f10929760a7b9cef98d2a6a78508ea 100644 --- a/build/config_editor.cfg +++ b/build/config_editor.cfg @@ -6,6 +6,8 @@ cl_mode_editor 1 r_stats 2 +r_clear_color 1 + hud_draw 0 hud_crosshair 0 hud_rangefinder 0 diff --git a/source/anim/Renderable.cpp b/source/anim/Renderable.cpp index d3a49219136eb34791aa71ed9094576f889f99d8..f58eaae30dc27e8d247ab591ed913ea0ee82702b 100644 --- a/source/anim/Renderable.cpp +++ b/source/anim/Renderable.cpp @@ -20,6 +20,11 @@ UINT XMETHODCALLTYPE CRenderable::getPriorityForStage(X_RENDER_STAGE stage) void XMETHODCALLTYPE CRenderable::renderStage(X_RENDER_STAGE stage, IXRenderableVisibility *pVisibility) { + if(!m_isEnabled) + { + return; + } + CRenderableVisibility *pVis = NULL; if(pVisibility) { diff --git a/source/anim/Renderable.h b/source/anim/Renderable.h index 07f43523d76b1face9182ae1c54183b5d82db62f..6510650ba42342524fcb48acb116fc023d7febfb 100644 --- a/source/anim/Renderable.h +++ b/source/anim/Renderable.h @@ -42,11 +42,18 @@ public: } IXMaterialSystem* getMaterialSystem(); + + void setEnabled(bool set) + { + m_isEnabled = set; + } protected: IGXDevice *m_pDevice = NULL; IXMaterialSystem *m_pMaterialSystem = NULL; ID m_idPlugin = -1; + bool m_isEnabled = true; + CAnimatedModelProvider *m_pAnimatedModelProvider = NULL; CDynamicModelProvider *m_pDynamicModelProvider = NULL; }; diff --git a/source/anim/plugin_main.cpp b/source/anim/plugin_main.cpp index 1766ff3eeeb315a215d49312a2f0d6e08f8ad211..ddfac260134d8351379e579fc3fe2cf000f8114b 100644 --- a/source/anim/plugin_main.cpp +++ b/source/anim/plugin_main.cpp @@ -24,6 +24,32 @@ protected: CDynamicModelProvider *m_pDynamicModelProvider; }; +class CLoadLevelEventListener final: public IEventListener<XEventLevel> +{ +public: + CLoadLevelEventListener(CRenderable *pRenderable): + m_pRenderable(pRenderable) + {} + void onEvent(const XEventLevel *pData) + { + switch(pData->type) + { + case XEventLevel::TYPE_LOAD_BEGIN: + m_pRenderable->setEnabled(false); + break; + case XEventLevel::TYPE_LOAD_END: + m_pRenderable->setEnabled(true); + break; + + default: + break; + } + } + +protected: + CRenderable *m_pRenderable; +}; + class CDSEPlugin: public IXUnknownImplementation<IXPlugin> { public: @@ -34,8 +60,10 @@ public: m_pRenderable = new CRenderable(getID(), m_pAnimatedModelProvider, m_pDynamicModelProvider); m_pUpdatable = new CUpdatable(m_pAnimatedModelProvider, m_pDynamicModelProvider); m_pLevelSizeEventListener = new CLevelSizeEventListener(m_pAnimatedModelProvider, m_pDynamicModelProvider); + m_pLevelLoadEventListener = new CLoadLevelEventListener(m_pRenderable); m_pCore->getEventChannel<XEventLevelSize>(EVENT_LEVEL_GET_SIZE_GUID)->addListener(m_pLevelSizeEventListener); + m_pCore->getEventChannel<XEventLevel>(EVENT_LEVEL_GUID)->addListener(m_pLevelLoadEventListener); } void XMETHODCALLTYPE startup(IXCore *pCore) override @@ -130,6 +158,7 @@ protected: CAnimatedModelProvider *m_pAnimatedModelProvider = NULL; CDynamicModelProvider *m_pDynamicModelProvider = NULL; CLevelSizeEventListener *m_pLevelSizeEventListener = NULL; + CLoadLevelEventListener *m_pLevelLoadEventListener = NULL; }; DECLARE_XPLUGIN(CDSEPlugin); diff --git a/source/core/concmd.cpp b/source/core/concmd.cpp index 32fa000c11be9b6c83f7eba341e8c48a05584ccb..ea874861762619dd796b547bc8dff6eab6f155d4 100644 --- a/source/core/concmd.cpp +++ b/source/core/concmd.cpp @@ -108,6 +108,42 @@ SX_LIB_API XDEPRECATED void Core_0RegisterConcmdClsArg(const char * name, void * Mutex g_conUpdMtx; +class CAlias; +void Core_0RegisterConcmdAlias(const char *name, CAlias *pAlias, const char * desc); +void ConsoleExecInternal(char * cmd); +class CAlias final +{ +public: + CAlias(const char *szName, const char *szDesc): + m_sName(szName), + m_sDesc(szDesc ? szDesc : "") + { + } + + void execute() + { + for(UINT i = 0, l = m_aCommands.size(); i < l; ++i) + { + char *szStr = strdupa(m_aCommands[i].c_str()); + ConsoleExecInternal(szStr); + } + } + void addCommand(const char *str) + { + m_aCommands.push_back(str); + } + + void reg() + { + Core_0RegisterConcmdAlias(m_sName.c_str(), this, m_sDesc.c_str()); + } +private: + String m_sName; + String m_sDesc; + Array<String> m_aCommands; +}; +CAlias *g_pNewAlias = NULL; + void ConsoleExecInternal(char * cmd, char * args) { const AssotiativeArray<String, ConCmd>::Node * pNode; @@ -242,6 +278,12 @@ void ConsoleExecInternal(char * cmd, char * args) } void ConsoleExecInternal(char * cmd) { + if(g_pNewAlias && fstrcmp(cmd, "endalias")) + { + g_pNewAlias->addCommand(cmd); + return; + } + char * space = cmd; while((*++space) && !isspace(*space)); if(*space) @@ -343,6 +385,41 @@ SX_LIB_API XDEPRECATED void Core_0ConsoleExecCmd(const char * format, ...) mem_delete_a(cbuf); } + +void Core_0RegisterConcmdAlias(const char *name, CAlias *pAlias, const char * desc) +{ + String sName(name); + + ConCmd c; + c.type = CMD_CLS; + c.cls = (ConCmdStub*)pAlias; + c.cmd.clscmd = (SXCONCMDCLS)&CAlias::execute; + c.szDesc = NULL; + c.isAlias = true; + if(desc) + { + c.szDesc = new char[strlen(desc) + 1]; + strcpy(c.szDesc, desc); + } + + const AssotiativeArray<String, ConCmd>::Node *pNode; + if(g_mCmds.KeyExists(sName, &pNode)) + { + if(pNode->Val->isAlias) + { + CAlias *ptr = (CAlias*)pNode->Val->cls; + mem_delete(ptr); + } + if(pNode->Val->szDesc) + { + mem_delete_a(pNode->Val->szDesc); + } + } + + g_mCmds[sName] = c; +} + + void echo(int argc, const char ** argv) { for(int i = 1; i < argc; ++i) @@ -620,6 +697,33 @@ void cmd_cmdlist(int argc, const char ** argv) DumpCCommands(); } +void cmd_alias(int argc, const char **argv) +{ + if(argc == 2 || argc == 3) + { + if(g_pNewAlias) + { + printf(COLOR_RED "Cannot create nested alias! Removing previous!\n" COLOR_RESET); + mem_delete(g_pNewAlias); + } + g_pNewAlias = new CAlias(argv[1], argc == 3 ? argv[2] : NULL); + } + else + { + printf(COLOR_GREEN "Usage:\n " COLOR_LGREEN "alias <name> [<description>]" COLOR_GREEN " - Create new alias\n" COLOR_RESET); + } +} +void cmd_endalias() +{ + if(!g_pNewAlias) + { + printf(COLOR_RED "No alias was started!\n" COLOR_RESET); + return; + } + g_pNewAlias->reg(); + g_pNewAlias = NULL; +} + void ConsoleRegisterCmds() { Core_0RegisterConcmdArg("echo", echo, "Echoes all parameters to console"); @@ -631,6 +735,8 @@ void ConsoleRegisterCmds() Core_0RegisterConcmdArg("cvarlist", cmd_cvarlist, "List all CVars"); Core_0RegisterConcmdArg("cmdlist", cmd_cmdlist, "List all Commands"); Core_0RegisterConcmd("perf_dump", cmd_perf_dump, "Show perfMon stats"); + Core_0RegisterConcmdArg("alias", cmd_alias, "Begin alias creation"); + Core_0RegisterConcmd("endalias", cmd_endalias, "End alias creation"); Core_0RegisterCVarInt("con_width", 80, "Ширина окна консоли"); Core_0RegisterCVarInt("con_height", 25, "Высота окна консоли"); diff --git a/source/core/concmd.h b/source/core/concmd.h index 86b5981820aa4baa240fb750ea63f41272f34b0d..d401384970917a799ce3fbcd6ae208e5155ca2e1 100644 --- a/source/core/concmd.h +++ b/source/core/concmd.h @@ -22,14 +22,15 @@ enum ConCmdType struct ConCmd { ConCmdType type; - ConCmdStub * cls; + ConCmdStub *cls; union { - void * cmd; + void *cmd; SXCONCMDCLS clscmd; SXCONCMDCLSARG clscmdarg; } cmd; - char * szDesc; + char *szDesc; + bool isAlias = false; }; bool ConsoleConnect(const char *szName = 0, bool bNewInstance = false); diff --git a/source/game/GameData.cpp b/source/game/GameData.cpp index 5c544c95b381cc2fa2904b483e7cd00e214b2eea..7efb990990460a026b4050e7816afd278ca2dce7 100644 --- a/source/game/GameData.cpp +++ b/source/game/GameData.cpp @@ -1187,6 +1187,8 @@ GameData::GameData(HWND hWnd, bool isGame): } GameData::~GameData() { + EndMap(); + mem_release(g_pAsyncTaskRunner); //mem_delete(g_pRagdoll); mem_delete(g_pEditable); diff --git a/source/render/RenderPipeline.cpp b/source/render/RenderPipeline.cpp index d64a070ba51315f609299f82b1f44d70c9267b3a..5ec47998e7abab30fc736a4948762e064b94bef1 100644 --- a/source/render/RenderPipeline.cpp +++ b/source/render/RenderPipeline.cpp @@ -25,6 +25,8 @@ CRenderPipeline::CRenderPipeline(IGXDevice *pDevice): Core_0RegisterCVarBool("dev_lpv_cubes", false, "Отображать сетку LPV"); Core_0RegisterCVarBool("dev_lpv_points", false, "Отображать VPL при инъекции в LPV"); + Core_0RegisterCVarBool("r_clear_color", false, "Очищать буфер перед выводом кадра"); + Core_0RegisterCVarFloat("hdr_adapted_coef", 0.3f, "Коэфициент привыкания к освещению (0,1] (медлено, быстро)"); Core_0RegisterCVarFloat("hdr_base_value", 0.2f, "Базовое значение для тонмаппинга (0,0.5] (темно, ярко)"); @@ -829,6 +831,8 @@ void CRenderPipeline::renderGBuffer() { IGXContext *pCtx = m_pDevice->getThreadContext(); + static const bool *r_clear_color = GET_PCVAR_BOOL("r_clear_color"); + m_pMaterialSystem->bindRenderPass(m_pRenderPassGBuffer); pCtx->setRasterizerState(NULL); @@ -859,7 +863,7 @@ void CRenderPipeline::renderGBuffer() pCtx->setColorTarget(pColorSurf); //pCtx->clear(GX_CLEAR_COLOR | GX_CLEAR_DEPTH | GX_CLEAR_STENCIL, RENDER_DEFAUL_BACKGROUND_COLOR, 0.0f); - pCtx->clear(GX_CLEAR_DEPTH | GX_CLEAR_STENCIL, RENDER_DEFAUL_BACKGROUND_COLOR, 0.0f); + pCtx->clear(GX_CLEAR_DEPTH | GX_CLEAR_STENCIL | (*r_clear_color ? GX_CLEAR_COLOR : 0), RENDER_DEFAUL_BACKGROUND_COLOR, 0.0f); pCtx->setColorTarget(pNormalSurf, 1); pCtx->setColorTarget(pParamSurf, 2); diff --git a/source/terrax/terrax.cpp b/source/terrax/terrax.cpp index 4f2fe39c99ad29a354f2500ebed4268c60f2d138..26b466eb8d510e7807954cfc08971483a8cb2cc0 100644 --- a/source/terrax/terrax.cpp +++ b/source/terrax/terrax.cpp @@ -896,9 +896,9 @@ int main(int argc, char **argv) mem_delete(pPipeline); mem_release(g_pCameraConstantBuffer); mem_delete(g_pGrid); - mem_delete(g_pUndoManager); //SkyXEngine_Kill(); mem_release(pEngine); + mem_delete(g_pUndoManager); return result; }