123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- //
- // Copyright (c) 2009-2010 Mikko Mononen memon@inside.org
- //
- // This software is provided 'as-is', without any express or implied
- // warranty. In no event will the authors be held liable for any damages
- // arising from the use of this software.
- // Permission is granted to anyone to use this software for any purpose,
- // including commercial applications, and to alter it and redistribute it
- // freely, subject to the following restrictions:
- // 1. The origin of this software must not be misrepresented; you must not
- // claim that you wrote the original software. If you use this software
- // in a product, an acknowledgment in the product documentation would be
- // appreciated but is not required.
- // 2. Altered source versions must be plainly marked as such, and must not be
- // misrepresented as being the original software.
- // 3. This notice may not be removed or altered from any source distribution.
- //
- #ifndef DETOUROBSTACLEAVOIDANCE_H
- #define DETOUROBSTACLEAVOIDANCE_H
- struct dtObstacleCircle
- {
- float p[3]; ///< Position of the obstacle
- float vel[3]; ///< Velocity of the obstacle
- float dvel[3]; ///< Velocity of the obstacle
- float rad; ///< Radius of the obstacle
- float dp[3], np[3]; ///< Use for side selection during sampling.
- };
- struct dtObstacleSegment
- {
- float p[3], q[3]; ///< End points of the obstacle segment
- bool touch;
- };
- class dtObstacleAvoidanceDebugData
- {
- public:
- dtObstacleAvoidanceDebugData();
- ~dtObstacleAvoidanceDebugData();
-
- bool init(const int maxSamples);
- void reset();
- void addSample(const float* vel, const float ssize, const float pen,
- const float vpen, const float vcpen, const float spen, const float tpen);
-
- void normalizeSamples();
-
- inline int getSampleCount() const { return m_nsamples; }
- inline const float* getSampleVelocity(const int i) const { return &m_vel[i*3]; }
- inline float getSampleSize(const int i) const { return m_ssize[i]; }
- inline float getSamplePenalty(const int i) const { return m_pen[i]; }
- inline float getSampleDesiredVelocityPenalty(const int i) const { return m_vpen[i]; }
- inline float getSampleCurrentVelocityPenalty(const int i) const { return m_vcpen[i]; }
- inline float getSamplePreferredSidePenalty(const int i) const { return m_spen[i]; }
- inline float getSampleCollisionTimePenalty(const int i) const { return m_tpen[i]; }
- private:
- // Explicitly disabled copy constructor and copy assignment operator.
- dtObstacleAvoidanceDebugData(const dtObstacleAvoidanceDebugData&);
- dtObstacleAvoidanceDebugData& operator=(const dtObstacleAvoidanceDebugData&);
- int m_nsamples;
- int m_maxSamples;
- float* m_vel;
- float* m_ssize;
- float* m_pen;
- float* m_vpen;
- float* m_vcpen;
- float* m_spen;
- float* m_tpen;
- };
- dtObstacleAvoidanceDebugData* dtAllocObstacleAvoidanceDebugData();
- void dtFreeObstacleAvoidanceDebugData(dtObstacleAvoidanceDebugData* ptr);
- static const int DT_MAX_PATTERN_DIVS = 32; ///< Max numver of adaptive divs.
- static const int DT_MAX_PATTERN_RINGS = 4; ///< Max number of adaptive rings.
- struct dtObstacleAvoidanceParams
- {
- float velBias;
- float weightDesVel;
- float weightCurVel;
- float weightSide;
- float weightToi;
- float horizTime;
- unsigned char gridSize; ///< grid
- unsigned char adaptiveDivs; ///< adaptive
- unsigned char adaptiveRings; ///< adaptive
- unsigned char adaptiveDepth; ///< adaptive
- };
- class dtObstacleAvoidanceQuery
- {
- public:
- dtObstacleAvoidanceQuery();
- ~dtObstacleAvoidanceQuery();
-
- bool init(const int maxCircles, const int maxSegments);
-
- void reset();
- void addCircle(const float* pos, const float rad,
- const float* vel, const float* dvel);
-
- void addSegment(const float* p, const float* q);
- int sampleVelocityGrid(const float* pos, const float rad, const float vmax,
- const float* vel, const float* dvel, float* nvel,
- const dtObstacleAvoidanceParams* params,
- dtObstacleAvoidanceDebugData* debug = 0);
- int sampleVelocityAdaptive(const float* pos, const float rad, const float vmax,
- const float* vel, const float* dvel, float* nvel,
- const dtObstacleAvoidanceParams* params,
- dtObstacleAvoidanceDebugData* debug = 0);
-
- inline int getObstacleCircleCount() const { return m_ncircles; }
- const dtObstacleCircle* getObstacleCircle(const int i) { return &m_circles[i]; }
- inline int getObstacleSegmentCount() const { return m_nsegments; }
- const dtObstacleSegment* getObstacleSegment(const int i) { return &m_segments[i]; }
- private:
- // Explicitly disabled copy constructor and copy assignment operator.
- dtObstacleAvoidanceQuery(const dtObstacleAvoidanceQuery&);
- dtObstacleAvoidanceQuery& operator=(const dtObstacleAvoidanceQuery&);
- void prepare(const float* pos, const float* dvel);
- float processSample(const float* vcand, const float cs,
- const float* pos, const float rad,
- const float* vel, const float* dvel,
- const float minPenalty,
- dtObstacleAvoidanceDebugData* debug);
- dtObstacleAvoidanceParams m_params;
- float m_invHorizTime;
- float m_vmax;
- float m_invVmax;
- int m_maxCircles;
- dtObstacleCircle* m_circles;
- int m_ncircles;
- int m_maxSegments;
- dtObstacleSegment* m_segments;
- int m_nsegments;
- };
- dtObstacleAvoidanceQuery* dtAllocObstacleAvoidanceQuery();
- void dtFreeObstacleAvoidanceQuery(dtObstacleAvoidanceQuery* ptr);
- #endif // DETOUROBSTACLEAVOIDANCE_H
|