/
ObjectFinder.h
60 lines (49 loc) · 1.21 KB
/
ObjectFinder.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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;
}
};
}