Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
VisualSensor.cpp
Go to the documentation of this file.
1
2
4
10
11namespace Divide {
12using namespace AI;
13
15 : Sensor(parentEntity, SensorType::VISUAL_SENSOR)
16{
17}
18
20{
21 for (NodeContainerMap::value_type& container : _nodeContainerMap) {
22 container.second.clear();
23 }
24 _nodeContainerMap.clear();
25 _nodePositionsMap.clear();
26}
27
29
30 NodeContainerMap::iterator container = _nodeContainerMap.find(containerID);
31
32 assert(node);
33
34 if (container != std::end(_nodeContainerMap)) {
35 const auto result = insert(container->second, node->getGUID(), node);
36 if (!result.second) {
37 Console::errorfn(LOCALE_STR("AI_DUPLICATE_SENSOR_INPUT_ERROR"));
38 }
39 } else {
40 insert(_nodeContainerMap[containerID],
41 node->getGUID(),
42 node);
43
44 }
45
46 NodePositions& positions = _nodePositionsMap[containerID];
47 insert(positions,
48 node->getGUID(),
50}
51
52void VisualSensor::unfollowSceneGraphNode(const U32 containerID, const I64 nodeGUID) {
53 DIVIDE_ASSERT(nodeGUID != 0,
54 "VisualSensor error: Invalid node GUID specified for "
55 "unfollow function");
56 NodeContainerMap::iterator container = _nodeContainerMap.find(containerID);
57 if (container != std::end(_nodeContainerMap)) {
58 const NodeContainer::iterator nodeEntry = container->second.find(nodeGUID);
59 if (nodeEntry != std::end(container->second)) {
60
61 container->second.erase(nodeEntry);
62 NodePositions& positions = _nodePositionsMap[containerID];
63 const NodePositions::iterator it = positions.find(nodeGUID);
64 if (it != std::end(positions)) {
65 positions.erase(it);
66 }
67 }
68 }
69}
70
71void VisualSensor::update( [[maybe_unused]] const U64 deltaTimeUS) {
72 for (const NodeContainerMap::value_type& container : _nodeContainerMap) {
73 NodePositions& positions = _nodePositionsMap[container.first];
74 for (const NodeContainer::value_type& entry : container.second) {
75 SceneGraphNode* sgn(entry.second);
76 if (sgn) {
77 positions[entry.first] = sgn->get<TransformComponent>()->getWorldPosition();
78 }
79 }
80 }
81}
82
84 NodeContainerMap::iterator container = _nodeContainerMap.find(containerID);
85 if (container != std::end(_nodeContainerMap)) {
86 NodePositions& positions = _nodePositionsMap[container->first];
87 NPC* const unit = _parentEntity->getUnitRef();
88 if (unit) {
89 const vec3<F32>& currentPosition = unit->getCurrentPosition();
90 I64 currentNearest = positions.begin()->first;
91 F32 currentDistanceSq = F32_MAX;
92 for (const NodePositions::value_type& entry : positions) {
93 const F32 temp = currentPosition.distanceSquared(entry.second);
94 if (temp < currentDistanceSq) {
95 currentDistanceSq = temp;
96 currentNearest = entry.first;
97 }
98 }
99 if (currentNearest != 0) {
100 const NodeContainer::const_iterator nodeEntry =
101 container->second.find(currentNearest);
102 if (nodeEntry != std::end(container->second)) {
103 return nodeEntry->second;
104 }
105 }
106 }
107 }
108
109 return nullptr;
110}
111
112F32 VisualSensor::getDistanceToNodeSq(const U32 containerID, const I64 nodeGUID) {
114 nodeGUID != 0,
115 "VisualSensor error: Invalid node GUID specified for distance request");
116 NPC* const unit = _parentEntity->getUnitRef();
117 if (unit) {
118 return unit->getCurrentPosition().distanceSquared(
119 getNodePosition(containerID, nodeGUID));
120 }
121
122 return F32_MAX;
123}
124
125vec3<F32> VisualSensor::getNodePosition(const U32 containerID, const I64 nodeGUID) {
127 nodeGUID != 0,
128 "VisualSensor error: Invalid node GUID specified for position request");
129 const NodeContainerMap::iterator container = _nodeContainerMap.find(containerID);
130 if (container != std::end(_nodeContainerMap)) {
131 NodePositions& positions = _nodePositionsMap[container->first];
132 const NodePositions::iterator it = positions.find(nodeGUID);
133 if (it != std::end(positions)) {
134 return it->second;
135 }
136 }
137
138 return vec3<F32>( F32_MAX );
139}
140
141} // namespace Divide
#define LOCALE_STR(X)
Definition: Localization.h:91
#define DIVIDE_ASSERT(...)
Based on OgreCrowd.
Definition: AIEntity.h:60
NPC * getUnitRef() const noexcept
Definition: AIEntity.h:90
AIEntity * _parentEntity
Definition: Sensor.h:63
VisualSensor(AIEntity *parentEntity)
NodePositionsMap _nodePositionsMap
Definition: VisualSensor.h:80
SceneGraphNode * findClosestNode(U32 containerID)
vec3< F32 > getNodePosition(U32 containerID, I64 nodeGUID)
F32 getDistanceToNodeSq(U32 containerID, I64 nodeGUID)
NodeContainerMap _nodeContainerMap
Definition: VisualSensor.h:79
void unfollowSceneGraphNode(U32 containerID, I64 nodeGUID)
void followSceneGraphNode(U32 containerID, SceneGraphNode *node)
void update(U64 deltaTimeUS) override
FORCE_INLINE I64 getGUID() const noexcept
Definition: GUIDWrapper.h:51
NPC base class. Every character in the game is an NPC by default except the Player.
Definition: NPC.h:46
FORCE_INLINE T * get() const
Returns a pointer to a specific component. Returns null if the SGN does not have the component reques...
vec3< F32 > getWorldPosition() const
Return the position.
const vec3< F32 > & getCurrentPosition() const
Definition: Unit.h:88
T distanceSquared(const vec3 &v) const noexcept
compute the vector's squared distance to another specified vector
hashMap< I64, vec3< F32 > > NodePositions
SGN GUID, Last position.
Definition: VisualSensor.h:49
SensorType
Definition: Sensor.h:39
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
void insert(eastl::vector< T, A1 > &target, const eastl::vector< T, A2 > &source)
Definition: Vector.h:97
constexpr F32 F32_MAX
int64_t I64
uint32_t U32
Project const SceneEntry & entry
Definition: DefaultScene.h:41
uint64_t U64
static NO_INLINE void errorfn(const char *format, T &&... args)