mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-23 05:19:18 -06:00
Move findNodeNearTarget function from path to pathnavigator
To reduce conflicts between wisdome installation branch and master
This commit is contained in:
@@ -80,6 +80,13 @@ public:
|
||||
|
||||
const std::vector<SceneGraphNode*>& relevantNodes();
|
||||
|
||||
/**
|
||||
* Find a node close to the given node. Closeness is determined by a factor times
|
||||
* the bounding sphere of the object
|
||||
* \return pointer to the SGN if one was found, nullptr otherwise
|
||||
*/
|
||||
static SceneGraphNode* findNodeNearTarget(const SceneGraphNode* node);
|
||||
|
||||
/**
|
||||
* \return The Lua library that contains all Lua functions available to affect the
|
||||
* path navigation
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
#include <openspace/rendering/renderable.h>
|
||||
#include <openspace/scene/scenegraphnode.h>
|
||||
#include <openspace/query/query.h>
|
||||
#include <openspace/util/collisionhelper.h>
|
||||
#include <openspace/util/universalhelpers.h>
|
||||
#include <ghoul/logging/logmanager.h>
|
||||
#include <ghoul/misc/interpolator.h>
|
||||
@@ -440,50 +439,14 @@ Waypoint waypointFromCamera() {
|
||||
return Waypoint{ pos, rot, node };
|
||||
}
|
||||
|
||||
SceneGraphNode* findNodeNearTarget(const SceneGraphNode* node) {
|
||||
const std::vector<SceneGraphNode*>& relevantNodes =
|
||||
global::navigationHandler->pathNavigator().relevantNodes();
|
||||
|
||||
for (SceneGraphNode* n : relevantNodes) {
|
||||
bool isSame = (n->identifier() == node->identifier());
|
||||
// If the nodes are in the very same position, they are probably representing
|
||||
// the same object
|
||||
isSame |=
|
||||
glm::distance(n->worldPosition(), node->worldPosition()) < LengthEpsilon;
|
||||
|
||||
if (isSame) {
|
||||
continue;
|
||||
}
|
||||
|
||||
constexpr float proximityRadiusFactor = 3.f;
|
||||
|
||||
const float bs = static_cast<float>(n->boundingSphere());
|
||||
const float proximityRadius = proximityRadiusFactor * bs;
|
||||
const glm::dvec3 posInModelCoords =
|
||||
glm::inverse(n->modelTransform()) * glm::dvec4(node->worldPosition(), 1.0);
|
||||
|
||||
bool isClose = collision::isPointInsideSphere(
|
||||
posInModelCoords,
|
||||
glm::dvec3(0.0, 0.0, 0.0),
|
||||
proximityRadius
|
||||
);
|
||||
|
||||
if (isClose) {
|
||||
return n;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Compute a target position close to the specified target node, using knowledge of
|
||||
// the start point and a desired distance from the node's center
|
||||
glm::dvec3 computeGoodStepDirection(const SceneGraphNode* targetNode,
|
||||
const Waypoint& startPoint)
|
||||
{
|
||||
const glm::dvec3 nodePos = targetNode->worldPosition();
|
||||
const SceneGraphNode* closeNode = findNodeNearTarget(targetNode);
|
||||
const SceneGraphNode* sun = sceneGraphNode(SunIdentifier);
|
||||
const SceneGraphNode* closeNode = PathNavigator::findNodeNearTarget(targetNode);
|
||||
|
||||
// @TODO (2021-07-09, emmbr): Not nice to depend on a specific scene graph node,
|
||||
// as it might not exist. Ideally, each SGN could know about their preferred
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <openspace/scene/scenegraphnode.h>
|
||||
#include <openspace/scripting/lualibrary.h>
|
||||
#include <openspace/scripting/scriptengine.h>
|
||||
#include <openspace/util/collisionhelper.h>
|
||||
#include <openspace/util/timemanager.h>
|
||||
#include <openspace/util/updatestructures.h>
|
||||
#include <ghoul/filesystem/file.h>
|
||||
@@ -497,6 +498,44 @@ void PathNavigator::findRelevantNodes() {
|
||||
_relevantNodes = resultingNodes;
|
||||
}
|
||||
|
||||
|
||||
SceneGraphNode* PathNavigator::findNodeNearTarget(const SceneGraphNode* node) {
|
||||
constexpr float LengthEpsilon = 1e-5f;
|
||||
const std::vector<SceneGraphNode*>& relNodes =
|
||||
global::navigationHandler->pathNavigator().relevantNodes();
|
||||
|
||||
for (SceneGraphNode* n : relNodes) {
|
||||
bool isSame = (n->identifier() == node->identifier());
|
||||
// If the nodes are in the very same position, they are probably representing
|
||||
// the same object
|
||||
isSame |=
|
||||
glm::distance(n->worldPosition(), node->worldPosition()) < LengthEpsilon;
|
||||
|
||||
if (isSame) {
|
||||
continue;
|
||||
}
|
||||
|
||||
constexpr float proximityRadiusFactor = 3.f;
|
||||
|
||||
const float bs = static_cast<float>(n->boundingSphere());
|
||||
const float proximityRadius = proximityRadiusFactor * bs;
|
||||
const glm::dvec3 posInModelCoords =
|
||||
glm::inverse(n->modelTransform()) * glm::dvec4(node->worldPosition(), 1.0);
|
||||
|
||||
bool isClose = collision::isPointInsideSphere(
|
||||
posInModelCoords,
|
||||
glm::dvec3(0.0, 0.0, 0.0),
|
||||
proximityRadius
|
||||
);
|
||||
|
||||
if (isClose) {
|
||||
return n;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void PathNavigator::removeRollRotation(CameraPose& pose, double deltaTime) {
|
||||
const glm::dvec3 anchorPos = anchor()->worldPosition();
|
||||
const glm::dvec3 cameraDir = glm::normalize(
|
||||
|
||||
Reference in New Issue
Block a user