Jump to content
The Dark Mod Forums

DarkRadiant 2.12.0 pre-release test


Recommended Posts

Here's the DR 2.12.0pre3 build for every interested mapper to test.

For more things that have changed or fixed, see the list below.

Download Windows Portable x64: https://drive.google.com/file/d/1QVbtqQzRYGOKmnvi27Fcx5IfEZXcKLGe/view?usp=sharing
Download Windows Installer x64: https://drive.google.com/file/d/1MYIE1MwLpE5MOnHA1aqFj4YTegeLNyhG/view?usp=sharing

Linux folks need to compile this stuff from source, instructions for various distributions are on the wiki.

If you happen to run into a crash, please record a crashdump: How to record a crashdump

Changes since 2.11.0 can be seen on the Bugtracker changelog, here's the summary:

#5566: Material stages with alpha test are incorrectly rendered as translucent
#5572: Material Editor
#5576: ASE importer needs to handle shared vertices with different normals
#5552: Better support for stage transform keywords in idTech4 materials
#108: Ambients don't light sides facing away
#5571: Table lookup evaluation is not producing the same results as in the engine
#426: Added script as "same origin clone manager tool"
#2132: 3D grid feature
#5546: Attached light radii are the wrong colour if "Override light volume colour" is active
#289: ESC to close dialogs with Cancel
#5556: Add missing image dimension reads to Quake 3 legacy brush parser
#1709: Show light_radius on 'other' entities
#5541: Customisable GUI layout ("Dockable")
#5534: Opening the Create Entity dialog a second time will present an empty tree view
#994: Show attached (light) entities
#5530: "Toggle 16x16 grid" function in the Particle Editor broken
#5527: UI Manager cleanup
#5524: Add portal_sky filter to default filters
#4644: Use of BITMAP field in ASE differs from TDM
#5518: Newly added or imported items don't use the location of previously selected item
#5460: Newly drawn brushes don't use height of previous selection with "Show Size Info" switched off
#4846: Rotation widget does not re-center on selected object
#5267: Duplicating model and moving with Alt-arrow results in pivot on original model when trying to rotate afterwards
#5465: Brushes with no visible surface towards orthoview "camera" are invisible in orthoview
#4735: Can't select one-sided models in certain 2D views
#5266: Twosided models can only be selected from one side
#4791: Copy model/entity/prefab paths to clipboard

Changes since 2.12.0pre2:

Switched Matrix algorithms to Eigen library
#5589: Material Editor: Add Reload Images button to reload the textures of the selected shader
#5590: ASE import failure loading models/darkmod/nature/flowers/flowers_patch_01.ase
#5586: Crash at shutdown when Dockable layout is active
#5585: Extend MaterialManager scripting interfaces by editing methods
#5572: Add context menu option "Open in Material Editor" to MediaBrowser tree

Thanks for testing, as always!

  • Like 2
  • Thanks 1
Link to comment
Share on other sites

4 hours ago, greebo said:

@OrbWeaver it just occurred to me that I forgot to merge the most recent commits to your master branch. I'll do that for the next pre-release.

Be warned, there is another disappearing objects bug I discovered today, according to git bisect this was introduced in e71c0c156d9bd1c5862bd709ed47a18df2d710c8 (which is odd because this was supposed to improve safety, but I guess I made some mistake in the logic). If I can't figure out what's wrong I'll just revert this and the commit it was intended to fix (returning Matrix::getIdentity() by value instead of reference).

Link to comment
Share on other sites

2 hours ago, OrbWeaver said:

Be warned, there is another disappearing objects bug I discovered today, according to git bisect this was introduced in e71c0c156d9bd1c5862bd709ed47a18df2d710c8 (which is odd because this was supposed to improve safety, but I guess I made some mistake in the logic). If I can't figure out what's wrong I'll just revert this and the commit it was intended to fix (returning Matrix::getIdentity() by value instead of reference).

Hopefully now fixed in b68926f4dd9344c61a1c3505f2bbf6288db2074b

Link to comment
Share on other sites

16 hours ago, greebo said:

Be sure to sync back at some point, since I had to rename math::near to math::isNear due to some stupid preprocessor #define of "near".

God damn macros. I had to workaround a similar problem with the Xlib header (which, annoyingly, seems to get included by wxWidgets into almost our entire codebase, even though wxWidgets is supposed to abstract away the lower-level functionality). Apparently the self-centered halfwits who wrote Xlib.h decided it was perfectly fine to spam the global namespace with un-prefixed macros like Bool, Success, Status etc, because obviously nobody else would ever be likely to use such terms in their own code.

Link to comment
Share on other sites

Same here with the Windows.h headers - they are infamous for their #defines polluting the namespaces. They are leaking through wxWidgets too. It's possible to turn those off by #define NOMINMAX and such, but it's obviously not happening, so we have min, max, near and far.

Link to comment
Share on other sites

I've merged your latest changes into a maintenance branch, but there's now a reproducible crash which occurs immediately when I enter lighting preview mode (even in an empty map). I can't make much sense of the stack trace, it seems to be crashing when trying to update the window title, but down at the bottom it looks like shutdownModules() has been called for some reason.

I haven't done a Git bisect to establish exactly which commit introduced the crash, but it goes away if I switch back to my unmerged master branch so it has definitely been introduced recently (and there weren't any merge conflicts, so I don't think it's a bad merge). Has anything changed in the rendering code which might trigger such an unexpected application shutdown?

libgobject-2.0.so.0![Unknown/Just-In-Time compiled code] (Unknown Source:0)
libgobject-2.0.so.0!g_signal_emit_valist (Unknown Source:0)
libgobject-2.0.so.0!g_signal_emit (Unknown Source:0)
libgobject-2.0.so.0![Unknown/Just-In-Time compiled code] (Unknown Source:0)
libgobject-2.0.so.0!g_object_notify (Unknown Source:0)
libgtk-3.so.0![Unknown/Just-In-Time compiled code] (Unknown Source:0)
libgobject-2.0.so.0!g_closure_invoke (Unknown Source:0)
libgobject-2.0.so.0![Unknown/Just-In-Time compiled code] (Unknown Source:0)
libgobject-2.0.so.0!g_signal_emit_valist (Unknown Source:0)
libgobject-2.0.so.0!g_signal_emit (Unknown Source:0)
libgobject-2.0.so.0![Unknown/Just-In-Time compiled code] (Unknown Source:0)
libgobject-2.0.so.0!g_object_notify_by_pspec (Unknown Source:0)
libwx_gtk3u_core-3.0.so.0!wxTopLevelWindowGTK::SetTitle(wxTopLevelWindowGTK * const this,  title) (buffer.h:157)
ui::MainFrame::updateTitle(ui::MainFrame * const this) (/home/mdm/Development/DarkRadiant/radiant/ui/mainframe/MainFrame.cpp:323)
sigc::bound_mem_functor0<void, ui::MainFrame>::operator()(const sigc::bound_mem_functor0<void, ui::MainFrame> * const this) (/usr/include/sigc++-2.0/sigc++/functors/mem_fun.h:1991)
sigc::adaptor_functor<sigc::bound_mem_functor0<void, ui::MainFrame> >::operator()(const sigc::adaptor_functor<sigc::bound_mem_functor0<void, ui::MainFrame> > * const this) (/usr/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h:256)
sigc::internal::slot_call<sigc::bound_mem_functor0<void, ui::MainFrame>, void>::call_it(sigc::internal::slot_rep * rep) (/usr/include/sigc++-2.0/sigc++/functors/slot.h:483)
sigc::internal::signal_emit0<void, sigc::nil>::emit(sigc::internal::signal_impl * impl) (/usr/include/sigc++-2.0/sigc++/signal.h:798)
sigc::signal0<void, sigc::nil>::emit(const sigc::signal0<void, sigc::nil> * const this) (/usr/include/sigc++-2.0/sigc++/signal.h:2804)
libradiantcore.so!map::Map::setModified(map::Map * const this, bool modifiedFlag) (/home/mdm/Development/DarkRadiant/radiantcore/map/Map.cpp:265)
libradiantcore.so!map::MapResource::onMapChanged(map::MapResource * const this) (/home/mdm/Development/DarkRadiant/radiantcore/map/MapResource.cpp:255)
libradiantcore.so!std::__invoke_impl<void, void (map::MapResource::*&)(), map::MapResource*&>(void (map::MapResource::*&)(map::MapResource * const) __f, map::MapResource *& __t) (/usr/include/c++/9/bits/invoke.h:73)
libradiantcore.so!std::__invoke<void (map::MapResource::*&)(), map::MapResource*&>(void (map::MapResource::*&)(map::MapResource * const) __fn) (/usr/include/c++/9/bits/invoke.h:95)
libradiantcore.so!std::_Bind<void (map::MapResource::*(map::MapResource*))()>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>)(std::_Bind<void (map::MapResource::*(map::MapResource*))()> * const this, std::tuple<> && __args) (/usr/include/c++/9/functional:400)
libradiantcore.so!std::_Bind<void (map::MapResource::*(map::MapResource*))()>::operator()<, void>()(std::_Bind<void (map::MapResource::*(map::MapResource*))()> * const this) (/usr/include/c++/9/functional:484)
libradiantcore.so!std::_Function_handler<void (), std::_Bind<void (map::MapResource::*(map::MapResource*))()> >::_M_invoke(std::_Any_data const&)(const std::_Any_data & __functor) (/usr/include/c++/9/bits/std_function.h:300)
std::function<void ()>::operator()() const(const std::function<void()> * const this) (/usr/include/c++/9/bits/std_function.h:688)
UndoFileChangeTracker::clear(UndoFileChangeTracker * const this) (/home/mdm/Development/DarkRadiant/libs/UndoFileChangeTracker.h:56)
libradiantcore.so!undo::UndoSystem::<lambda(IUndoSystem::Tracker&)>::operator()(IUndoSystem::Tracker &) const(const undo::UndoSystem::<lambda(IUndoSystem::Tracker&)> * const __closure, IUndoSystem::Tracker & tracker) (/home/mdm/Development/DarkRadiant/radiantcore/undo/UndoSystem.cpp:331)
libradiantcore.so!std::_Function_handler<void(IUndoSystem::Tracker&), undo::UndoSystem::trackersClear() const::<lambda(IUndoSystem::Tracker&)> >::_M_invoke(const std::_Any_data &, IUndoSystem::Tracker &)(const std::_Any_data & __functor,  __args#0) (/usr/include/c++/9/bits/std_function.h:300)
libradiantcore.so!std::function<void (IUndoSystem::Tracker&)>::operator()(IUndoSystem::Tracker&) const(const std::function<void(IUndoSystem::Tracker&)> * const this,  __args#0) (/usr/include/c++/9/bits/std_function.h:688)
libradiantcore.so!undo::UndoSystem::<lambda(IUndoSystem::Tracker*)>::operator()(IUndoSystem::Tracker *) const(const undo::UndoSystem::<lambda(IUndoSystem::Tracker*)> * const __closure, IUndoSystem::Tracker * tracker) (/home/mdm/Development/DarkRadiant/radiantcore/undo/UndoSystem.cpp:325)
libradiantcore.so!std::for_each<std::_Rb_tree_const_iterator<IUndoSystem::Tracker*>, undo::UndoSystem::foreachTracker(const std::function<void(IUndoSystem::Tracker&)>&) const::<lambda(IUndoSystem::Tracker*)> >(std::_Rb_tree_const_iterator<IUndoSystem::Tracker*>, std::_Rb_tree_const_iterator<IUndoSystem::Tracker*>, undo::UndoSystem::<lambda(IUndoSystem::Tracker*)>)(std::_Rb_tree_const_iterator<IUndoSystem::Tracker*> __first, std::_Rb_tree_const_iterator<IUndoSystem::Tracker*> __last, undo::UndoSystem::<lambda(IUndoSystem::Tracker*)> __f) (/usr/include/c++/9/bits/stl_algo.h:3876)
libradiantcore.so!undo::UndoSystem::foreachTracker(std::function<void (IUndoSystem::Tracker&)> const&) const(const undo::UndoSystem * const this, const std::function<void(IUndoSystem::Tracker&)> & functor) (/home/mdm/Development/DarkRadiant/radiantcore/undo/UndoSystem.cpp:326)
libradiantcore.so!undo::UndoSystem::trackersClear(const undo::UndoSystem * const this) (/home/mdm/Development/DarkRadiant/radiantcore/undo/UndoSystem.cpp:331)
libradiantcore.so!undo::UndoSystem::clear(undo::UndoSystem * const this) (/home/mdm/Development/DarkRadiant/radiantcore/undo/UndoSystem.cpp:172)
libradiantcore.so!undo::UndoSystem::onMapEvent(undo::UndoSystem * const this, IMap::MapEvent ev) (/home/mdm/Development/DarkRadiant/radiantcore/undo/UndoSystem.cpp:260)
libradiantcore.so!sigc::bound_mem_functor1<void, undo::UndoSystem, IMap::MapEvent>::operator()(const sigc::bound_mem_functor1<void, undo::UndoSystem, IMap::MapEvent> * const this, sigc::type_trait_take_t _A_a1) (/usr/include/sigc++-2.0/sigc++/functors/mem_fun.h:2066)
libradiantcore.so!sigc::adaptor_functor<sigc::bound_mem_functor1<void, undo::UndoSystem, IMap::MapEvent> >::operator()<IMap::MapEvent const&>(const sigc::adaptor_functor<sigc::bound_mem_functor1<void, undo::UndoSystem, IMap::MapEvent> > * const this, const IMap::MapEvent & _A_arg1) (/usr/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h:89)
libradiantcore.so!sigc::internal::slot_call<sigc::bound_mem_functor1<void, undo::UndoSystem, IMap::MapEvent>, void, IMap::MapEvent>::call_it(sigc::internal::slot_rep * rep,  a_#0) (/usr/include/sigc++-2.0/sigc++/functors/slot.h:451)
libradiantcore.so!sigc::internal::signal_emit1<void, IMap::MapEvent, sigc::nil>::emit(sigc::internal::signal_impl * impl, sigc::type_trait_take_t _A_a1) (/usr/include/sigc++-2.0/sigc++/signal.h:1045)
libradiantcore.so!sigc::signal1<void, IMap::MapEvent, sigc::nil>::emit(const sigc::signal1<void, IMap::MapEvent, sigc::nil> * const this, sigc::type_trait_take_t _A_a1) (/usr/include/sigc++-2.0/sigc++/signal.h:2955)
libradiantcore.so!map::Map::emitMapEvent(map::Map * const this, IMap::MapEvent ev) (/home/mdm/Development/DarkRadiant/radiantcore/map/Map.cpp:926)
libradiantcore.so!map::Map::freeMap(map::Map * const this) (/home/mdm/Development/DarkRadiant/radiantcore/map/Map.cpp:247)
libradiantcore.so!sigc::bound_mem_functor0<void, map::Map>::operator()(const sigc::bound_mem_functor0<void, map::Map> * const this) (/usr/include/sigc++-2.0/sigc++/functors/mem_fun.h:1991)
libradiantcore.so!sigc::adaptor_functor<sigc::bound_mem_functor0<void, map::Map> >::operator()(const sigc::adaptor_functor<sigc::bound_mem_functor0<void, map::Map> > * const this) (/usr/include/sigc++-2.0/sigc++/adaptors/adaptor_trait.h:256)
libradiantcore.so!sigc::internal::slot_call<sigc::bound_mem_functor0<void, map::Map>, void>::call_it(sigc::internal::slot_rep * rep) (/usr/include/sigc++-2.0/sigc++/functors/slot.h:483)
sigc::internal::signal_emit0<void, sigc::nil>::emit(sigc::internal::signal_impl * impl) (/usr/include/sigc++-2.0/sigc++/signal.h:798)
sigc::signal0<void, sigc::nil>::emit(const sigc::signal0<void, sigc::nil> * const this) (/usr/include/sigc++-2.0/sigc++/signal.h:2804)
libradiantcore.so!module::ModuleRegistry::shutdownModules(module::ModuleRegistry * const this) (/home/mdm/Development/DarkRadiant/radiantcore/modulesystem/ModuleRegistry.cpp:203)
RadiantApp::OnExit(RadiantApp * const this) (/home/mdm/Development/DarkRadiant/radiant/RadiantApp.cpp:148)
libwx_baseu-3.0.so.0!CallOnExit::~CallOnExit(CallOnExit * const this) (app.h:439)
libwx_baseu-3.0.so.0!wxEntry( argc, wxChar ** argv) (init.cpp:501)
main(int argc, char ** argv) (/home/mdm/Development/DarkRadiant/radiant/main.cpp:7)

 

Link to comment
Share on other sites

It's maybe caused by one of the debug openGL assertNoErrors calls which are shutting down the app. I'll have to investigate.

Another possibility would be the changes to the depth fill GLSL program, maybe they are not compiling.

Link to comment
Share on other sites

On DR 2.12pre2, whenever I close down DR my PC hangs a short while. DR also no longer remembers my changes to things such as what filters are enabled/disabled from the previous session.

Can't try DR 2.11 or earlier versions because they abort startup during the splash screen at "Modules initialised". My 2.11 log is as follows:darkradiant.log

Link to comment
Share on other sites

I assume the crash is the one I fixed in #5586. About not being able to go back, that's not something I expected - I can open 2.11.0 after having started the newer versions just fine.

The log is really short, maybe some of your DLLs in the folder are mismatching? Can you extract a portable 2.11.0 and start the instance from a different location?

I'll upload a new build with the crash fix in the meantime. edit: new build (pre3) uploaded.

Link to comment
Share on other sites

Thanks, I can confirm that:

  • DR 2.12pre3 no longer makes my PC hang after shutting down DR, and DR now remembers my filters from the previous session
  • redownloading and replacing my DR 2.11 portable install allows it to start again
  • Like 1
Link to comment
Share on other sites

Just to mention a couple of notable renderer changes which users might not have noticed in the lengthy change log, and which should hopefully make the preview renderer slightly less useless.

Attached lights are now rendered as actual light sources, so you can see what is actually being lit by those torches and fireplaces (currently only attachments built into the entityDef are shown, there is not yet support for adding your own attachments with explicit spawnargs).

attachlight.thumb.jpg.7e087cc27ff7a0e754d4aa60b939476d.jpg

Ambient lights now render correctly as non-directional, and light up all sides of brushes not just those facing the light. Also visible in this image is the removal of an extra 2x scale factor for light brightness, which was causing lights to appear far too bright and completely burned out around the light origin.

ambientlight.thumb.jpg.9b6229a967167b4de2b955d065d4db93.jpg

  • Like 1
Link to comment
Share on other sites

2 minutes ago, OrbWeaver said:

Just to mention a couple of notable renderer changes which users might not have noticed in the lengthy change log, and which should hopefully make the preview renderer slightly less useless.

Attached lights are now rendered as actual light sources, so you can see what is actually being lit by those torches and fireplaces (currently only attachments built into the entityDef are shown, there is not yet support for adding your own attachments with explicit spawnargs).

 

Ambient lights now render correctly as non-directional, and light up all sides of brushes not just those facing the light. Also visible in this image is the removal of an extra 2x scale factor for light brightness, which was causing lights to appear far too bright and completely burned out around the light origin.

 

Thanks for adding these highly necessary changes to the lighting preview. I've already used this to make this image for the "So what are you working on?" thread, stating that it's a new DR feature:

Spoiler

MERZNWS.jpg

The main problem that's holding me back from using this feature more regularly is the performance. I was getting 2500ms per frame for this view, with the rest of the map hidden, on an Intel i5-9400F with Intel UHD 630 that rarely goes under 40 FPS in TDM FMs - even though the lights cast no shadows. Showing this view ingame (from the void with lights enabled) would be very demanding too, of course.

Link to comment
Share on other sites

5 minutes ago, Dragofer said:

The main problem that's holding me back from using this feature more regularly is the performance. I was getting 2500ms per frame for this view, with the rest of the map hidden, on an Intel i5-9400F with Intel UHD 630 that rarely goes under 40 FPS in TDM FMs - even though the lights cast no shadows. Showing this view ingame (from the void with lights enabled) would be very demanding too, of course.

That's rather expected unfortunately. The DR renderer is nowhere near as optimised as the real game renderer, and the only culling we have is very crude (view frustum and far clip plane, that's it).

Occasionally I've looked at it in a performance profiler and there aren't any obvious low-hanging fruits, just various operations which take up a few percent here and there but can't easily be avoided. The last thing I noticed was that brushes are quite slow to render due to using old GL APIs rather than proper vertex buffers, but even that was only about 20% of the time and improving it (while a good idea) would not reduce it to 0.

Link to comment
Share on other sites

On 4/20/2021 at 9:21 PM, OrbWeaver said:

The last thing I noticed was that brushes are quite slow to render due to using old GL APIs rather than proper vertex buffers, but even that was only about 20% of the time and improving it (while a good idea) would not reduce it to 0.

That sounds like something that'd be helpful more generally, even without lighting preview enabled. Large maps can easily have ten thousand brushes or more, more or less mandating the use of layers for good performance.

 

By the way, wasn't there a possibility to use arrow keys for moving the camera? I remember being able to both scroll the mouse wheel and holding down an arrow key for quickly getting between various sections of my maps, but the arrow keys don't do anything for me anymore in one of the recent versions.

Link to comment
Share on other sites

47 minutes ago, Dragofer said:

By the way, wasn't there a possibility to use arrow keys for moving the camera? I remember being able to both scroll the mouse wheel and holding down an arrow key for quickly getting between various sections of my maps, but the arrow keys don't do anything for me anymore in one of the recent versions.

I experienced that problem the other day, and I think it was solved by switching to a different tab in the properties widget. Possibly the arrow keys were being swallowed up by the Textures panel or something.

Link to comment
Share on other sites

5 hours ago, OrbWeaver said:

I experienced that problem the other day, and I think it was solved by switching to a different tab in the properties widget. Possibly the arrow keys were being swallowed up by the Textures panel or something.

Hm, I've been clicking all over the place in DR but it never gave me the ability to move the camera with my arrow keys. In fact, it doesn't work in DR 2.5 or 2.7 either, so it seems this may have coincided with recent DR versions, rather than being caused by them.

Edit: well, wiping my AppData/Roaming/DarkRadiant folder has solved it. Here are the former contents of that folder  no_arrow_keys.zip - the arrow keys broke sometime either in 2.11 or 2.12.

Link to comment
Share on other sites

  • 2 weeks later...

I'm seeing something weird with the Material Editor on Linux. It seems from the thumbnail icons that the images for a material are loaded correctly, but all I see in the preview window is a "shader not found" cube. It does not appear to be a problem with render previews in general because the preview in the model selector is working fine. But I don't know if I'm doing something wrong or if it's a problem with my installation in some way.

mateditor.png.af45988ed1a94cd63c683aa4613705e2.png

Link to comment
Share on other sites

Hm, I guess the resource models are missing, you're likely seeing the "model not found" NullModel in the preview. There's a new folder install/resources/ in the source tree that needs to be copied to the runtime data path, like the XRC files and the scripts. I probably missed to adjust the CMakeLists.txt to copy these over to the install location.

Link to comment
Share on other sites

5 hours ago, greebo said:

Hm, I guess the resource models are missing, you're likely seeing the "model not found" NullModel in the preview. There's a new folder install/resources/ in the source tree that needs to be copied to the runtime data path, like the XRC files and the scripts. I probably missed to adjust the CMakeLists.txt to copy these over to the install location.

That makes sense. I'll have a look tonight to see if the CMake script needs updating.

  • Thanks 1
Link to comment
Share on other sites

Yes that was exactly the problem. With the resources correctly installed the editor preview works perfectly. I will push out a new Ubuntu release.

I like the new preview mechanism — having a rotating object, background and configurable light is very convenient. Perhaps we could use this same preview for the regular model chooser.

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent Status Updates

    • Petike the Taffer  »  DeTeEff

      I've updated the articles for your FMs and your author category at the wiki. Your newer nickname (DeTeEff) now comes first, and the one in parentheses is your older nickname (Fieldmedic). Just to avoid confusing people who played your FMs years ago and remember your older nickname. I've added a wiki article for your latest FM, Who Watches the Watcher?, as part of my current updating efforts. Unless I overlooked something, you have five different FMs so far.
      · 0 replies
    • Petike the Taffer

      I've finally managed to log in to The Dark Mod Wiki. I'm back in the saddle and before the holidays start in full, I'll be adding a few new FM articles and doing other updates. Written in Stone is already done.
      · 4 replies
    • nbohr1more

      TDM 15th Anniversary Contest is now active! Please declare your participation: https://forums.thedarkmod.com/index.php?/topic/22413-the-dark-mod-15th-anniversary-contest-entry-thread/
       
      · 0 replies
    • JackFarmer

      @TheUnbeholden
      You cannot receive PMs. Could you please be so kind and check your mailbox if it is full (or maybe you switched off the function)?
      · 1 reply
    • OrbWeaver

      I like the new frob highlight but it would nice if it was less "flickery" while moving over objects (especially barred metal doors).
      · 4 replies
×
×
  • Create New...