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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include "StdAfx.h"
#include "mmgr.h"
#include "Wind.h"
#include "GlobalSynced.h"
#include "Sim/Units/UnitHandler.h"
CR_BIND(CWind, );
CR_REG_METADATA(CWind, (
CR_MEMBER(maxWind),
CR_MEMBER(minWind),
CR_MEMBER(curWind),
CR_MEMBER(curStrength),
CR_MEMBER(curDir),
CR_MEMBER(newWind),
CR_MEMBER(oldWind),
CR_MEMBER(status),
CR_RESERVED(12)
));
CWind wind;
CWind::CWind()
{
curDir=float3(1,0,0);
curStrength=0;
curWind=float3(0,0,0);
newWind=curWind;
oldWind=curWind;
maxWind=100;
minWind=0;
status=0;
}
CWind::~CWind()
{
}
void CWind::LoadWind(float min, float max)
{
minWind = min;
maxWind = max;
curWind = float3(minWind,0,0);
}
void CWind::Update()
{
if(status==0){
oldWind=curWind;
float ns=gs->randFloat()*(maxWind-minWind)+minWind;
float nd=gs->randFloat()*2*PI;
newWind=float3(sin(nd)*ns,0,cos(nd)*ns);
// TODO: decouple
uh->UpdateWind(newWind.x, newWind.z, newWind.Length());
status++;
} else if(status <= 900) {
float mod=status/900.0f;
curStrength = oldWind.Length()*(1.0-mod)+newWind.Length()*mod; // strength changes ~ mod
curWind=oldWind*(1.0-mod)+newWind*mod; // dir changes ~ arctan (mod)
curWind.SafeNormalize();
curDir=curWind;
curWind *= curStrength;
status++;
} else if(status > 900) {
status=0;
} else {
status++;
}
}
|