From 40da5562a8a77664f867cde7fd04c5e1eacbd067 Mon Sep 17 00:00:00 2001 From: codereader Date: Sat, 26 Sep 2020 07:04:34 +0200 Subject: [PATCH] #5338: Move ObjectFinder to separate file --- radiant/camera/CamWnd.cpp | 54 +++-------------------- radiant/camera/ObjectFinder.h | 60 ++++++++++++++++++++++++++ tools/msvc/DarkRadiant.vcxproj | 1 + tools/msvc/DarkRadiant.vcxproj.filters | 3 ++ 4 files changed, 71 insertions(+), 47 deletions(-) create mode 100644 radiant/camera/ObjectFinder.h diff --git a/radiant/camera/CamWnd.cpp b/radiant/camera/CamWnd.cpp index 9dce30a136..82414ade23 100644 --- a/radiant/camera/CamWnd.cpp +++ b/radiant/camera/CamWnd.cpp @@ -28,6 +28,7 @@ #include "selection/Device.h" #include "selection/SelectionTest.h" #include "FloorHeightWalker.h" +#include "ObjectFinder.h" #include "debugging/debugging.h" #include "debugging/gl.h" @@ -48,53 +49,10 @@ namespace const char* const FAR_CLIP_DISABLED_TEXT = N_(" (currently disabled in preferences)"); } -class ObjectFinder : - public scene::NodeVisitor -{ - scene::INodePtr _node; - SelectionTest& _selectionTest; - - // To store the best intersection candidate - SelectionIntersection _bestIntersection; -public: - // Constructor - ObjectFinder(SelectionTest& test) : - _selectionTest(test) - {} - - // Return the found node - const scene::INodePtr& getNode() const { - return _node; - } - - // The visitor function - bool pre(const scene::INodePtr& node) { - // Check if the node is filtered - if (node->visible()) { - SelectionTestablePtr selectionTestable = Node_getSelectionTestable(node); - - if (selectionTestable != NULL) { - bool occluded; - selection::OccludeSelector selector(_bestIntersection, occluded); - selectionTestable->testSelect(selector, _selectionTest); - - if (occluded) { - _node = node; - } - } - } - else { - return false; // don't traverse filtered nodes - } - - return true; - } -}; - inline Vector2 windowvector_for_widget_centre(wxutil::GLWidget& widget) { wxSize size = widget.GetSize(); - return Vector2(static_cast(size.GetWidth() / 2), static_cast(size.GetHeight() / 2)); + return Vector2(static_cast(size.GetWidth() / 2), static_cast(size.GetHeight() / 2)); } // ---------- CamWnd Implementation -------------------------------------------------- @@ -425,12 +383,14 @@ int CamWnd::getId() return _id; } -void CamWnd::jumpToObject(SelectionTest& selectionTest) { +void CamWnd::jumpToObject(SelectionTest& selectionTest) +{ // Find a suitable target node - ObjectFinder finder(selectionTest); + camera::ObjectFinder finder(selectionTest); GlobalSceneGraph().root()->traverse(finder); - if (finder.getNode() != NULL) { + if (finder.getNode()) + { // A node has been found, get the bounding box AABB found = finder.getNode()->worldAABB(); diff --git a/radiant/camera/ObjectFinder.h b/radiant/camera/ObjectFinder.h new file mode 100644 index 0000000000..ca4ab07056 --- /dev/null +++ b/radiant/camera/ObjectFinder.h @@ -0,0 +1,60 @@ +#pragma once + +#include "inode.h" +#include "iselectiontest.h" +#include "selection/OccludeSelector.h" + +namespace camera +{ + +class ObjectFinder : + public scene::NodeVisitor +{ +private: + scene::INodePtr _node; + SelectionTest& _selectionTest; + + // To store the best intersection candidate + SelectionIntersection _bestIntersection; + +public: + // Constructor + ObjectFinder(SelectionTest& test) : + _selectionTest(test) + {} + + const scene::INodePtr& getNode() const + { + return _node; + } + + // The visitor function + bool pre(const scene::INodePtr& node) + { + // Check if the node is filtered + if (node->visible()) + { + auto selectionTestable = Node_getSelectionTestable(node); + + if (selectionTestable) + { + bool occluded; + selection::OccludeSelector selector(_bestIntersection, occluded); + selectionTestable->testSelect(selector, _selectionTest); + + if (occluded) + { + _node = node; + } + } + } + else + { + return false; // don't traverse filtered nodes + } + + return true; + } +}; + +} diff --git a/tools/msvc/DarkRadiant.vcxproj b/tools/msvc/DarkRadiant.vcxproj index 98ba3fa430..44593104f6 100644 --- a/tools/msvc/DarkRadiant.vcxproj +++ b/tools/msvc/DarkRadiant.vcxproj @@ -376,6 +376,7 @@ + diff --git a/tools/msvc/DarkRadiant.vcxproj.filters b/tools/msvc/DarkRadiant.vcxproj.filters index 3fe6f5291e..f54293cc99 100644 --- a/tools/msvc/DarkRadiant.vcxproj.filters +++ b/tools/msvc/DarkRadiant.vcxproj.filters @@ -1314,6 +1314,9 @@ src\camera + + src\camera +