mirror of https://github.com/axmolengine/axmol.git
160 lines
5.2 KiB
C
160 lines
5.2 KiB
C
|
//
|
||
|
// 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
|