import { SteeringBehavior } from '../SteeringBehavior.js';
import { Vector3 } from '../../math/Vector3.js';
const averageDirection = new Vector3();
const direction = new Vector3();
/**
* This steering behavior produces a force that keeps a vehicle’s heading aligned with its neighbors.
*
* @author {@link https://github.com/Mugen87|Mugen87}
* @augments SteeringBehavior
*/
class AlignmentBehavior extends SteeringBehavior {
/**
* Constructs a new alignment behavior.
*/
constructor() {
super();
}
/**
* Calculates the steering force for a single simulation step.
*
* @param {Vehicle} vehicle - The game entity the force is produced for.
* @param {Vector3} force - The force/result vector.
* @param {Number} delta - The time delta.
* @return {Vector3} The force/result vector.
*/
calculate( vehicle, force /*, delta */ ) {
averageDirection.set( 0, 0, 0 );
const neighbors = vehicle.neighbors;
// iterate over all neighbors to calculate the average direction vector
for ( let i = 0, l = neighbors.length; i < l; i ++ ) {
const neighbor = neighbors[ i ];
neighbor.getDirection( direction );
averageDirection.add( direction );
}
if ( neighbors.length > 0 ) {
averageDirection.divideScalar( neighbors.length );
// produce a force to align the vehicle's heading
vehicle.getDirection( direction );
force.subVectors( averageDirection, direction );
}
return force;
}
}
export { AlignmentBehavior };