diff --git a/NEWS b/NEWS index b43ced4f0..2a3bbb39d 100644 --- a/NEWS +++ b/NEWS @@ -53,6 +53,8 @@ DFHack v0.34.11-r4 - outsideOnly: make raw-specified buildings impossible to build inside - resume: A plugin to help display and resume suspended constructions conveniently - stocks: An improved stocks display screen. + - rendermax: a heap of rendering experiments. Including one that does lighting. + Internals: - Core: there is now a per-save dfhack.init file for when the save is loaded, and another for when it is unloaded - EventManager: fixed job completion detection, fixed removal of TICK events, added EQUIPMENT_CHANGE event diff --git a/plugins/rendermax/renderer_light.cpp b/plugins/rendermax/renderer_light.cpp index fb5bd8f0e..1af05f176 100644 --- a/plugins/rendermax/renderer_light.cpp +++ b/plugins/rendermax/renderer_light.cpp @@ -105,7 +105,6 @@ lightingEngineViewscreen::lightingEngineViewscreen(renderer_light* target):light { reinit(); defaultSettings(); - loadSettings(); int numTreads=tthread::thread::hardware_concurrency(); if(numTreads==0)numTreads=1; threading.start(numTreads); @@ -240,6 +239,11 @@ void lightingEngineViewscreen::clear() } void lightingEngineViewscreen::calculate() { + if(lightMap.size()!=myRenderer->lightGrid.size()) + { + reinit(); + myRenderer->invalidate(); + } rect2d vp=getMapViewport(); const rgbf dim(levelDim,levelDim,levelDim); lightMap.assign(lightMap.size(),rgbf(1,1,1)); @@ -1035,8 +1039,7 @@ lightThread::lightThread( lightThreadDispatch& dispatch ):dispatch(dispatch),isD } lightThread::~lightThread() { - if(myThread) - delete myThread; + delete myThread; } void lightThread::run() diff --git a/plugins/rendermax/renderer_light.hpp b/plugins/rendermax/renderer_light.hpp index 0e3d2c986..5e768c27d 100644 --- a/plugins/rendermax/renderer_light.hpp +++ b/plugins/rendermax/renderer_light.hpp @@ -67,7 +67,7 @@ private: void reinitLightGrid(int w,int h) { tthread::lock_guard guard(dataMutex); - lightGrid.resize(w*h); + lightGrid.resize(w*h,rgbf(1,1,1)); } void reinitLightGrid() { diff --git a/plugins/rendermax/rendermax.cpp b/plugins/rendermax/rendermax.cpp index c5fe90a66..8cfe463bd 100644 --- a/plugins/rendermax/rendermax.cpp +++ b/plugins/rendermax/rendermax.cpp @@ -279,7 +279,41 @@ DFHACK_PLUGIN_LUA_COMMANDS { DFHACK_LUA_END }; +static void enable_hooks(bool enable) +{ + INTERPOSE_HOOK(dwarmode_render_hook,render).apply(enable); + INTERPOSE_HOOK(dungeon_render_hook,render).apply(enable); + if(enable && engine) + { + engine->loadSettings(); + } +} + +DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event event) +{ + switch(event) + { + case SC_VIEWSCREEN_CHANGED: + { + CoreSuspendClaimer suspender; + if(current_mode==MODE_LIGHT) + { + engine->clear(); + } + } + break; + case SC_WORLD_LOADED: + enable_hooks(true); + break; + case SC_WORLD_UNLOADED: + enable_hooks(false); + break; + default: + break; + } + return CR_OK; +} static command_result rendermax(color_ostream &out, vector & parameters) @@ -361,8 +395,9 @@ static command_result rendermax(color_ostream &out, vector & parameters renderer_light *myRender=new renderer_light(df::global::enabler->renderer); installNew(myRender,MODE_LIGHT); engine=new lightingEngineViewscreen(myRender); - INTERPOSE_HOOK(dwarmode_render_hook,render).apply(true); - INTERPOSE_HOOK(dungeon_render_hook,render).apply(true); + + if (Core::getInstance().isWorldLoaded()) + plugin_onstatechange(out, SC_WORLD_LOADED); } else if(current_mode==MODE_LIGHT && parameters.size()>1) { @@ -417,15 +452,3 @@ DFhackCExport command_result plugin_shutdown(color_ostream &) removeOld(); return CR_OK; } -DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event event) -{ - if(event==SC_VIEWSCREEN_CHANGED) - { - CoreSuspendClaimer suspender; - if(current_mode==MODE_LIGHT) - { - engine->clear(); - } - } - return CR_OK; -} \ No newline at end of file