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
							 |