1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#include "StdAfx.h"
#include "HoverMoveMath.h"
#include "Map/ReadMap.h"
#include "Sim/Objects/SolidObject.h"
#include "Map/Ground.h"
CR_BIND_DERIVED(CHoverMoveMath, CMoveMath, );
const float HOVERING_HEIGHT = 5;
bool CHoverMoveMath::noWaterMove;
/*
Calculate speed-multiplier for given height and slope data.
*/
float CHoverMoveMath::SpeedMod(const MoveData& moveData, float height, float slope)
{
//On water?
if(height < 0){
if(noWaterMove)
return 0.0f;
return 1.0f;
}
//Too slope?
if(slope > moveData.maxSlope)
return 0.0f;
//Slope-mod
return 1 / (1 + slope * moveData.slopeMod);
}
float CHoverMoveMath::SpeedMod(const MoveData& moveData, float height, float slope,float moveSlope)
{
//On water?
if(height < 0)
return 1.0f;
//Too slope?
if(slope*moveSlope > moveData.maxSlope)
return 0.0f;
//Slope-mod
return 1 / (1 + std::max(0.0f,slope*moveSlope) * moveData.slopeMod);
}
/*
Gives a position slightly over ground and water level.
*/
float CHoverMoveMath::yLevel(int xSquare, int zSquare)
{
return ground->GetHeight(xSquare*SQUARE_SIZE, zSquare*SQUARE_SIZE) + 10;
}
float CHoverMoveMath::yLevel(const float3& pos)
{
return ground->GetHeight(pos.x, pos.z) + 10;
}
|