View Issue Details

IDProjectCategoryView StatusLast Update
0005309DarkRadiantRendererpublic18.08.2020 20:02
Reporterorbweaver Assigned Toorbweaver  
PrioritynormalSeverityminorReproducibilityhave not tried
Status assignedResolutionopen 
Product Version2.8.0 
Summary0005309: Creating a model entity creates a "phantom light" near the world origin
Description1. Create a textured floor brush at the world origin (with upper surface at Z=0, and X and Y dimensions extending a reasonable distance).
2. Choose Create Entity and add a simple entity (e.g. atdm:moveable_barrel_01). The location of the entity does not matter.
3. Enter lighting preview mode.

Observe that the floor brush is now lit with a light which does not exist in the map and cannot be selected or edited. The light persists for the session, but is gone if the map is reloaded in a new session.

Hypothesis: this is something to do with the entity preview widget, maybe? A light is needed to show the preview and perhaps this light is remaining in the internal scene after the widget has closed.
TagsNo tags attached.




11.08.2020 20:14

developer   ~0012727

Confirmed that the phantom light is caused by the model preview.

In ModelPreview::setupSceneGraph() we create a local scene graph with a light node, but LightNode::onInsertIntoScene() always inserts the new node into the GlobalRenderSystem (since there is no other render system to insert it into).

Since the ModelPreview is persistent (for performance reasons we don't create a new dialog for each EntityClassChooser operation, but maintain a single dialog which is hidden and shown on demand), the LightNode is never destroyed and the singleton GlobalRenderSystem maintains the light for the rest of the session.

This could be worked around by adding extra function calls to create and destroy this light node (or manually attach/detach it from the render system) each time the model preview is shown, but it really highlights the limitations of this global light list. A better long term solution is to remove the global light list and have lights submitted from the active scenegraph using RenderableCollector.


18.08.2020 20:02

developer   ~0012744

Another manifestation of the same bug: toggling any filter, even without the model preview visible (or ever having been shown), also creates the phantom light! The call trace is as follows:

    frame #0: 0x00005555559f0c3d darkradiant`render::OpenGLRenderSystem::attachLight(this=0x000055555655f630, light=0x000055555791c1c0) at OpenGLRenderSystem.cpp:405
    frame 0000001: 0x000055555582f160 darkradiant`entity::LightNode::onInsertIntoScene(this=0x000055555791c1c0, root=0x000055555780d180) at LightNode.cpp:92
    frame 0000002: 0x0000555555a04945 darkradiant`scene::SceneGraph::insert(this=0x0000555557890560, node=std::__shared_ptr<scene::INode, 4>::element_type @ 0x000055555791d7a8) at SceneGraph.cpp:126
    frame 0000003: 0x00007ffff51dde95`scene::InstanceSubgraphWalker::pre(this=0x00007fffffffc9a0, node=std::__shared_ptr<scene::INode, 4>::element_type @ 0x000055555791d7a8) at InstanceWalkers.cpp:17
    frame 0000004: 0x00007ffff51efb6a`scene::Node::traverse(this=0x000055555791c1c0, visitor=0x00007fffffffc9a0) at Node.cpp:234
    frame 0000005: 0x00007ffff51efe8f`scene::Node::onChildAdded(this=0x000055555780d180, child=std::__shared_ptr<scene::INode, 4>::element_type @ 0x000055555791d7a8) at Node.cpp:276
    frame 0000006: 0x00007ffff51e082f`scene::TraversableNodeSet::append(this=0x000055555780d1b0, node=std::__shared_ptr<scene::INode, 4>::element_type @ 0x000055555791d7a8) at TraversableNodeSet.cpp:116
    frame 0000007: 0x00007ffff51ef743`scene::Node::addChildNode(this=0x000055555780d180, node=std::__shared_ptr<scene::INode, 4>::element_type @ 0x000055555791d7a8) at Node.cpp:175
    frame #8: 0x00007ffff4ecaca1`wxutil::ModelPreview::setupSceneGraph(this=0x00005555574a63e0) at ModelPreview.cpp:110
    frame 0000009: 0x00007ffff4ef2425`wxutil::RenderPreview::getScene(this=0x00005555574a63e0) at RenderPreview.cpp:263
  * frame 0000010: 0x00007ffff4ef1e8e`wxutil::RenderPreview::filtersChanged(this=0x00005555574a63e0) at RenderPreview.cpp:171

The simple act of calling filtersChanged(), which happens in response to any filter being activated or deactivated, re-initialises the lighting in the preview scene and attaches the preview light to the shader system. The end result is that lighting can visibly change in response to toggling a filter.

Issue History

Date Modified Username Field Change
26.07.2020 20:28 orbweaver New Issue
26.07.2020 20:28 orbweaver Status new => assigned
26.07.2020 20:28 orbweaver Assigned To => orbweaver
11.08.2020 20:14 orbweaver Note Added: 0012727
18.08.2020 20:02 orbweaver Note Added: 0012744