public override void updateExecution(float timeElapsed) { base.updateExecution(timeElapsed); if (timeElapsed <= 0f) { return; } var mParams = missile.parameters as SSpaceMissileVisualParameters; var target = missile.target; // make visual direction "lean into" velocity Vector3 axis; float angle; OpenTKHelper.neededRotationAxisAngle(missile.visualDirection, missile.velocity.Normalized(), out axis, out angle); float abs = Math.Abs(angle); if (abs > mParams.pursuitVisualRotationRate && abs > 0f) { angle = angle / abs * mParams.pursuitVisualRotationRate; } Quaternion quat = Quaternion.FromAxisAngle(axis, angle); missile.visualDirection = Vector3.Transform(missile.visualDirection, quat); missile.visualSmokeAmmount = missile.velocity.LengthFast / mParams.pursuitMaxVelocity; }