92 lines
2.1 KiB
C++
92 lines
2.1 KiB
C++
/*
|
||
* © Copyright 2014 – Urheberrechtshinweis
|
||
* Alle Rechte vorbehalten / All Rights Reserved
|
||
*
|
||
* Programmcode ist urheberrechtlich geschuetzt.
|
||
* Das Urheberrecht liegt, soweit nicht ausdruecklich anders gekennzeichnet, bei Frank Ebner.
|
||
* Keine Verwendung ohne explizite Genehmigung.
|
||
* (vgl. § 106 ff UrhG / § 97 UrhG)
|
||
*/
|
||
|
||
#ifndef NAVMESHWALKPARAMS_H
|
||
#define NAVMESHWALKPARAMS_H
|
||
|
||
#include "../../geo/Heading.h"
|
||
#include "../NavMeshLocation.h"
|
||
#include "../NavMeshType.h"
|
||
|
||
namespace NM {
|
||
|
||
/** configure pedestrian StepSizes */
|
||
struct StepSizes {
|
||
|
||
float stepSizeFloor_m = NAN;
|
||
float stepSizeStair_m = NAN;
|
||
|
||
bool isValid() const {
|
||
return (stepSizeFloor_m==stepSizeFloor_m) && (stepSizeStair_m==stepSizeStair_m);
|
||
}
|
||
|
||
template <typename Tria> float inMeter(const int steps, const NavMeshLocation<Tria>& start) const {
|
||
|
||
Assert::isTrue(isValid(), "invalid step-sizes given");
|
||
Assert::isNotNull(start.tria, "no starting triangle given");
|
||
|
||
if (start.tria->getType() == (int) NM::NavMeshType::STAIR_SKEWED) {
|
||
return stepSizeStair_m * steps;
|
||
} else {
|
||
return stepSizeFloor_m * steps;
|
||
}
|
||
|
||
// if (start.tria->isPlain()) {
|
||
// return stepSizeFloor_m * steps;
|
||
// } else {
|
||
// return stepSizeStair_m * steps;
|
||
// }
|
||
|
||
}
|
||
|
||
};
|
||
|
||
/** configure walking from -> to */
|
||
template <typename Tria> struct NavMeshWalkParams {
|
||
|
||
/** walk starts here (pos/tria) */
|
||
NavMeshLocation<Tria> start;
|
||
|
||
/** direction to walk to */
|
||
Heading heading;
|
||
|
||
/** number of steps to walk */
|
||
int numSteps;
|
||
|
||
/** configuration for pedestrian's step-sizes */
|
||
StepSizes stepSizes;
|
||
|
||
|
||
/** empty ctor */
|
||
NavMeshWalkParams() : heading(0) {;}
|
||
|
||
/** get the to-be-walked distance (steps vs. current location [stair/floor/..]) */
|
||
float getToBeWalkedDistance() const {
|
||
if (_toBeWalkedDistance != _toBeWalkedDistance) {
|
||
_toBeWalkedDistance = stepSizes.inMeter(numSteps, start);
|
||
}
|
||
return _toBeWalkedDistance;
|
||
}
|
||
|
||
void check() const {
|
||
Assert::isFalse(numSteps == 0, "num Steps = 0 is currently not supported. must be >= 1");
|
||
}
|
||
|
||
private:
|
||
|
||
// precalc
|
||
mutable float _toBeWalkedDistance = NAN;
|
||
|
||
};
|
||
|
||
}
|
||
|
||
#endif // NAVMESHWALKPARAMS_H
|