mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-19 22:23:51 +00:00
Down gravity
This commit is contained in:
parent
18a139cd66
commit
e4251be529
5 changed files with 46 additions and 1123 deletions
|
@ -148,6 +148,7 @@ namespace MWWorld
|
||||||
if(it->first == "player"){
|
if(it->first == "player"){
|
||||||
|
|
||||||
coord = playerphysics->ps.origin;
|
coord = playerphysics->ps.origin;
|
||||||
|
//std::cout << "ZCoord: " << coord.z << "\n";
|
||||||
//std::cout << "Coord" << coord << "\n";
|
//std::cout << "Coord" << coord << "\n";
|
||||||
//coord = Ogre::Vector3(coord.x, coord.z, coord.y); //x, z, -y
|
//coord = Ogre::Vector3(coord.x, coord.z, coord.y); //x, z, -y
|
||||||
|
|
||||||
|
|
|
@ -178,7 +178,7 @@ bool PM_SlideMove( bool gravity )
|
||||||
float into;
|
float into;
|
||||||
Ogre::Vector3 endVelocity;
|
Ogre::Vector3 endVelocity;
|
||||||
Ogre::Vector3 endClipVelocity;
|
Ogre::Vector3 endClipVelocity;
|
||||||
|
std::cout << "Slide move\n";
|
||||||
numbumps = 4;
|
numbumps = 4;
|
||||||
|
|
||||||
// primal_velocity = pm->ps->velocity
|
// primal_velocity = pm->ps->velocity
|
||||||
|
@ -191,14 +191,14 @@ bool PM_SlideMove( bool gravity )
|
||||||
//VectorCopy( pm->ps->velocity, endVelocity );
|
//VectorCopy( pm->ps->velocity, endVelocity );
|
||||||
endVelocity = pm->ps.velocity;
|
endVelocity = pm->ps.velocity;
|
||||||
//endVelocity[2] -= pm->ps->gravity * pml.frametime;
|
//endVelocity[2] -= pm->ps->gravity * pml.frametime;
|
||||||
endVelocity.y -= pm->ps.gravity * pml.frametime;
|
endVelocity.z -= pm->ps.gravity * pml.frametime;
|
||||||
|
|
||||||
// pm->ps->velocity = avg(pm->ps->velocity.z, endVelocity.z)
|
// pm->ps->velocity = avg(pm->ps->velocity.z, endVelocity.z)
|
||||||
//pm->ps->velocity[2] = ( pm->ps->velocity[2] + endVelocity[2] ) * 0.5;
|
//pm->ps->velocity[2] = ( pm->ps->velocity[2] + endVelocity[2] ) * 0.5;
|
||||||
pm->ps.velocity.y= (pm->ps.velocity.y + endVelocity.y) * 0.5f;
|
pm->ps.velocity.z= (pm->ps.velocity.z + endVelocity.z) * 0.5f;
|
||||||
|
|
||||||
//primal_velocity[2] = endVelocity[2];
|
//primal_velocity[2] = endVelocity[2];
|
||||||
primal_velocity.y = endVelocity.y;
|
primal_velocity.z = endVelocity.z;
|
||||||
|
|
||||||
if ( pml.groundPlane )
|
if ( pml.groundPlane )
|
||||||
// slide along the ground plane
|
// slide along the ground plane
|
||||||
|
@ -239,7 +239,7 @@ bool PM_SlideMove( bool gravity )
|
||||||
{
|
{
|
||||||
// entity is completely trapped in another solid
|
// entity is completely trapped in another solid
|
||||||
//pm->ps->velocity[2] = 0; // don't build up falling damage, but allow sideways acceleration
|
//pm->ps->velocity[2] = 0; // don't build up falling damage, but allow sideways acceleration
|
||||||
pm->ps.velocity.y = 0;
|
pm->ps.velocity.z = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,10 +427,11 @@ int PM_StepSlideMove( bool gravity )
|
||||||
if ( PM_SlideMove( gravity ) == false )
|
if ( PM_SlideMove( gravity ) == false )
|
||||||
return 1; // we got exactly where we wanted to go first try
|
return 1; // we got exactly where we wanted to go first try
|
||||||
|
|
||||||
|
std::cout << "Step Slide move\n";
|
||||||
// down = start_o - vec3(0, 0, STEPSIZE)
|
// down = start_o - vec3(0, 0, STEPSIZE)
|
||||||
//VectorCopy(start_o, down);
|
//VectorCopy(start_o, down);
|
||||||
down = start_o;
|
down = start_o;
|
||||||
down.y -= STEPSIZE;
|
down.z -= STEPSIZE;
|
||||||
|
|
||||||
//pm->trace (&trace, start_o, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask);
|
//pm->trace (&trace, start_o, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask);
|
||||||
//tracefunc(&trace, start_o, down, , 0, pml.scene);
|
//tracefunc(&trace, start_o, down, , 0, pml.scene);
|
||||||
|
@ -439,11 +440,11 @@ int PM_StepSlideMove( bool gravity )
|
||||||
|
|
||||||
// up = vec3(0, 0, 1)
|
// up = vec3(0, 0, 1)
|
||||||
//VectorSet(up, 0, 0, 1);
|
//VectorSet(up, 0, 0, 1);
|
||||||
up = Ogre::Vector3(0.0f, 1.0f, 0.0f);
|
up = Ogre::Vector3(0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
// never step up when you still have up velocity
|
// never step up when you still have up velocity
|
||||||
//if ( pm->ps->velocity[2] > 0 && (trace.fraction == 1.0 || DotProduct(trace.plane.normal, up) < 0.7))
|
//if ( pm->ps->velocity[2] > 0 && (trace.fraction == 1.0 || DotProduct(trace.plane.normal, up) < 0.7))
|
||||||
if (pm->ps.velocity.y > 0 && (
|
if (pm->ps.velocity.z > 0 && (
|
||||||
trace.fraction == 1.0 || trace.planenormal.dotProduct(up) < 0.7
|
trace.fraction == 1.0 || trace.planenormal.dotProduct(up) < 0.7
|
||||||
) )
|
) )
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -460,7 +461,7 @@ int PM_StepSlideMove( bool gravity )
|
||||||
//VectorCopy (start_o, up);
|
//VectorCopy (start_o, up);
|
||||||
up = start_o;
|
up = start_o;
|
||||||
//up[2] += STEPSIZE;
|
//up[2] += STEPSIZE;
|
||||||
up.y += STEPSIZE;
|
up.z += STEPSIZE;
|
||||||
|
|
||||||
// test the player position if they were a stepheight higher
|
// test the player position if they were a stepheight higher
|
||||||
//pm->trace (&trace, start_o, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask);
|
//pm->trace (&trace, start_o, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask);
|
||||||
|
@ -475,7 +476,7 @@ int PM_StepSlideMove( bool gravity )
|
||||||
}
|
}
|
||||||
|
|
||||||
//stepSize = trace.endpos[2] - start_o[2];
|
//stepSize = trace.endpos[2] - start_o[2];
|
||||||
stepSize = trace.endpos.y - start_o.y;
|
stepSize = trace.endpos.z - start_o.z;
|
||||||
|
|
||||||
// try slidemove from this position
|
// try slidemove from this position
|
||||||
//VectorCopy (trace.endpos, pm->ps->origin); // pm->ps->origin = trace.endpos
|
//VectorCopy (trace.endpos, pm->ps->origin); // pm->ps->origin = trace.endpos
|
||||||
|
@ -491,7 +492,7 @@ int PM_StepSlideMove( bool gravity )
|
||||||
//VectorCopy (pm->ps->origin, down);
|
//VectorCopy (pm->ps->origin, down);
|
||||||
down = pm->ps.origin;
|
down = pm->ps.origin;
|
||||||
//down[2] -= stepSize;
|
//down[2] -= stepSize;
|
||||||
down.y -= stepSize;
|
down.z -= stepSize;
|
||||||
|
|
||||||
|
|
||||||
//pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask);
|
//pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask);
|
||||||
|
@ -510,7 +511,7 @@ int PM_StepSlideMove( bool gravity )
|
||||||
float delta;
|
float delta;
|
||||||
|
|
||||||
//delta = pm->ps->origin[2] - start_o[2];
|
//delta = pm->ps->origin[2] - start_o[2];
|
||||||
delta = pm->ps.origin.y - start_o.y;
|
delta = pm->ps.origin.z - start_o.z;
|
||||||
if ( delta > 2 )
|
if ( delta > 2 )
|
||||||
{
|
{
|
||||||
if (gravity)
|
if (gravity)
|
||||||
|
@ -541,6 +542,7 @@ int PM_StepSlideMove( bool gravity )
|
||||||
|
|
||||||
void PM_Friction(void)
|
void PM_Friction(void)
|
||||||
{
|
{
|
||||||
|
std::cout << "Friction\n";
|
||||||
Ogre::Vector3 vec;
|
Ogre::Vector3 vec;
|
||||||
float* vel;
|
float* vel;
|
||||||
float speed, newspeed, control;
|
float speed, newspeed, control;
|
||||||
|
@ -554,14 +556,14 @@ void PM_Friction(void)
|
||||||
|
|
||||||
if ( pml.walking )
|
if ( pml.walking )
|
||||||
//vec[2] = 0; // ignore slope movement
|
//vec[2] = 0; // ignore slope movement
|
||||||
vec.y = 0;
|
vec.z = 0;
|
||||||
|
|
||||||
//speed = VectorLength(vec);
|
//speed = VectorLength(vec);
|
||||||
speed = vec.length();
|
speed = vec.length();
|
||||||
if (speed < 1)
|
if (speed < 1)
|
||||||
{
|
{
|
||||||
vel[0] = 0;
|
vel[0] = 0;
|
||||||
vel[2] = 0; // allow sinking underwater
|
vel[1] = 0; // allow sinking underwater
|
||||||
// FIXME: still have z friction underwater?
|
// FIXME: still have z friction underwater?
|
||||||
//bprintf("Static friction (vec = [%f, %f, %f]) (vec.length = %f)\n", vec.x, vec.y, vec.z, speed);
|
//bprintf("Static friction (vec = [%f, %f, %f]) (vec.length = %f)\n", vec.x, vec.y, vec.z, speed);
|
||||||
return;
|
return;
|
||||||
|
@ -636,6 +638,7 @@ static void PM_Accelerate( Ogre::Vector3& wishdir, float wishspeed, float accel
|
||||||
{
|
{
|
||||||
// int i;
|
// int i;
|
||||||
float addspeed, accelspeed, currentspeed;
|
float addspeed, accelspeed, currentspeed;
|
||||||
|
std::cout << "Accelerate\n";
|
||||||
|
|
||||||
// currentspeed = pm->ps->velocity dot wishdir
|
// currentspeed = pm->ps->velocity dot wishdir
|
||||||
//currentspeed = DotProduct (pm->ps->velocity, wishdir);
|
//currentspeed = DotProduct (pm->ps->velocity, wishdir);
|
||||||
|
@ -681,7 +684,7 @@ static bool PM_CheckJump(void)
|
||||||
//pm->ps->pm_flags |= PMF_JUMP_HELD;
|
//pm->ps->pm_flags |= PMF_JUMP_HELD;
|
||||||
|
|
||||||
pm->ps.groundEntityNum = ENTITYNUM_NONE;
|
pm->ps.groundEntityNum = ENTITYNUM_NONE;
|
||||||
pm->ps.velocity.y = JUMP_VELOCITY;
|
pm->ps.velocity.z = JUMP_VELOCITY;
|
||||||
//PM_AddEvent( EV_JUMP );
|
//PM_AddEvent( EV_JUMP );
|
||||||
|
|
||||||
/*if ( pm->cmd.forwardmove >= 0 )
|
/*if ( pm->cmd.forwardmove >= 0 )
|
||||||
|
@ -776,8 +779,8 @@ static void PM_WaterMove( playerMove* const pm )
|
||||||
wishvel[2] = -60; // sink towards bottom
|
wishvel[2] = -60; // sink towards bottom
|
||||||
*/
|
*/
|
||||||
wishvel.x = 0;
|
wishvel.x = 0;
|
||||||
wishvel.y = -60;
|
wishvel.z = -60;
|
||||||
wishvel.z = 0;
|
wishvel.y = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -834,6 +837,7 @@ static void PM_WalkMove( playerMove* const pmove )
|
||||||
playerMove::playercmd cmd;
|
playerMove::playercmd cmd;
|
||||||
float accelerate;
|
float accelerate;
|
||||||
float vel;
|
float vel;
|
||||||
|
std::cout << "Walking\n";
|
||||||
|
|
||||||
if ( pm->ps.waterlevel > 2 && //DotProduct( pml.forward, pml.groundTrace.plane.normal ) > 0 )
|
if ( pm->ps.waterlevel > 2 && //DotProduct( pml.forward, pml.groundTrace.plane.normal ) > 0 )
|
||||||
pml.forward.dotProduct(pml.groundTrace.planenormal) > 0.0f)
|
pml.forward.dotProduct(pml.groundTrace.planenormal) > 0.0f)
|
||||||
|
@ -937,10 +941,10 @@ static void PM_WalkMove( playerMove* const pmove )
|
||||||
|
|
||||||
// project moves down to flat plane
|
// project moves down to flat plane
|
||||||
//pml.forward[2] = 0;
|
//pml.forward[2] = 0;
|
||||||
pml.forward.y = 0;
|
pml.forward.z = 0;
|
||||||
|
|
||||||
//pml.right[2] = 0;
|
//pml.right[2] = 0;
|
||||||
pml.right.y = 0;
|
pml.right.z = 0;
|
||||||
|
|
||||||
// project the forward and right directions onto the ground plane
|
// project the forward and right directions onto the ground plane
|
||||||
PM_ClipVelocity (pml.forward, pml.groundTrace.planenormal, pml.forward, OVERCLIP );
|
PM_ClipVelocity (pml.forward, pml.groundTrace.planenormal, pml.forward, OVERCLIP );
|
||||||
|
@ -1035,7 +1039,7 @@ void PM_UpdateViewAngles( playerMove::playerStruct* const ps, playerMove::player
|
||||||
{
|
{
|
||||||
short temp;
|
short temp;
|
||||||
int i;
|
int i;
|
||||||
|
std::cout << "Updating viewangles\n";
|
||||||
//while(1);
|
//while(1);
|
||||||
|
|
||||||
//if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPINTERMISSION)
|
//if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPINTERMISSION)
|
||||||
|
@ -1128,7 +1132,7 @@ void PM_GroundTraceMissed()
|
||||||
//VectorCopy( pm->ps->origin, point );
|
//VectorCopy( pm->ps->origin, point );
|
||||||
point = pm->ps.origin;
|
point = pm->ps.origin;
|
||||||
//point[2] -= 64;
|
//point[2] -= 64;
|
||||||
point.y -= 64;
|
point.z -= 64;
|
||||||
|
|
||||||
//pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask);
|
//pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask);
|
||||||
//tracefunc(&trace, *(const D3DXVECTOR3* const)&(pm->ps.origin), *(const D3DXVECTOR3* const)&point, D3DXVECTOR3(0.0f, -64.0f, 0.0f), 0, pml.traceObj);
|
//tracefunc(&trace, *(const D3DXVECTOR3* const)&(pm->ps.origin), *(const D3DXVECTOR3* const)&point, D3DXVECTOR3(0.0f, -64.0f, 0.0f), 0, pml.traceObj);
|
||||||
|
@ -1188,7 +1192,7 @@ static bool PM_CorrectAllSolid(traceResults* const trace)
|
||||||
point[1] = pm->ps->origin[1];
|
point[1] = pm->ps->origin[1];
|
||||||
point[2] = pm->ps->origin[2] - 0.25;*/
|
point[2] = pm->ps->origin[2] - 0.25;*/
|
||||||
point = pm->ps.origin;
|
point = pm->ps.origin;
|
||||||
point.y -= 0.25f;
|
point.z -= 0.25f;
|
||||||
|
|
||||||
//pm->trace (trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask);
|
//pm->trace (trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask);
|
||||||
//tracefunc(trace, *(const D3DXVECTOR3* const)&(pm->ps.origin), *(const D3DXVECTOR3* const)&point, D3DXVECTOR3(0.0f, -0.25f, 0.0f), 0, pml.traceObj);
|
//tracefunc(trace, *(const D3DXVECTOR3* const)&(pm->ps.origin), *(const D3DXVECTOR3* const)&point, D3DXVECTOR3(0.0f, -0.25f, 0.0f), 0, pml.traceObj);
|
||||||
|
@ -1215,7 +1219,7 @@ static void PM_CrashLand( void )
|
||||||
float vel, acc;
|
float vel, acc;
|
||||||
float t;
|
float t;
|
||||||
float a, b, c, den;
|
float a, b, c, den;
|
||||||
|
std::cout << "Crash land\n";
|
||||||
// decide which landing animation to use
|
// decide which landing animation to use
|
||||||
/*if ( pm->ps->pm_flags & PMF_BACKWARDS_JUMP )
|
/*if ( pm->ps->pm_flags & PMF_BACKWARDS_JUMP )
|
||||||
PM_ForceLegsAnim( LEGS_LANDB );
|
PM_ForceLegsAnim( LEGS_LANDB );
|
||||||
|
@ -1227,10 +1231,10 @@ static void PM_CrashLand( void )
|
||||||
// calculate the exact velocity on landing
|
// calculate the exact velocity on landing
|
||||||
//dist = pm->ps->origin[2] - pml.previous_origin[2];
|
//dist = pm->ps->origin[2] - pml.previous_origin[2];
|
||||||
|
|
||||||
dist = pm->ps.origin.y - pml.previous_origin.y;
|
dist = pm->ps.origin.z - pml.previous_origin.z;
|
||||||
|
|
||||||
//vel = pml.previous_velocity[2];
|
//vel = pml.previous_velocity[2];
|
||||||
vel = pml.previous_velocity.y;
|
vel = pml.previous_velocity.z;
|
||||||
|
|
||||||
//acc = -pm->ps->gravity;
|
//acc = -pm->ps->gravity;
|
||||||
acc = -pm->ps.gravity;
|
acc = -pm->ps.gravity;
|
||||||
|
@ -1294,7 +1298,7 @@ static void PM_CrashLand( void )
|
||||||
|
|
||||||
const float waterHeight = pm->waterHeight;
|
const float waterHeight = pm->waterHeight;
|
||||||
const float waterHeightSplash = waterHeight + halfExtents.y;
|
const float waterHeightSplash = waterHeight + halfExtents.y;
|
||||||
if (pm->ps.origin.y < waterHeightSplash)
|
if (pm->ps.origin.z < waterHeightSplash)
|
||||||
{
|
{
|
||||||
splashSound = true;
|
splashSound = true;
|
||||||
}
|
}
|
||||||
|
@ -1357,7 +1361,7 @@ static void PM_CrashLand( void )
|
||||||
|
|
||||||
static void PM_GroundTrace( void )
|
static void PM_GroundTrace( void )
|
||||||
{
|
{
|
||||||
//std::cout << "Ground trace\n";
|
std::cout << "Ground trace\n";
|
||||||
Ogre::Vector3 point;
|
Ogre::Vector3 point;
|
||||||
traceResults trace;
|
traceResults trace;
|
||||||
|
|
||||||
|
@ -1365,7 +1369,7 @@ static void PM_GroundTrace( void )
|
||||||
point[1] = pm->ps->origin[1];
|
point[1] = pm->ps->origin[1];
|
||||||
point[2] = pm->ps->origin[2] - 0.25;*/
|
point[2] = pm->ps->origin[2] - 0.25;*/
|
||||||
point = pm->ps.origin;
|
point = pm->ps.origin;
|
||||||
point.y -= 0.25f;
|
point.z -= 0.25f;
|
||||||
|
|
||||||
//pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask);
|
//pm->trace (&trace, pm->ps->origin, pm->mins, pm->maxs, point, pm->ps->clientNum, pm->tracemask);
|
||||||
//tracefunc(&trace, *(const D3DXVECTOR3* const)&(pm->ps.origin), *(const D3DXVECTOR3* const)&point, D3DXVECTOR3(0.0f, -0.25f, 0.0f), 0, pml.traceObj);
|
//tracefunc(&trace, *(const D3DXVECTOR3* const)&(pm->ps.origin), *(const D3DXVECTOR3* const)&point, D3DXVECTOR3(0.0f, -0.25f, 0.0f), 0, pml.traceObj);
|
||||||
|
@ -1392,7 +1396,7 @@ static void PM_GroundTrace( void )
|
||||||
|
|
||||||
// check if getting thrown off the ground
|
// check if getting thrown off the ground
|
||||||
//if ( pm->ps->velocity[2] > 0 && DotProduct( pm->ps->velocity, trace.plane.normal ) > 10 )
|
//if ( pm->ps->velocity[2] > 0 && DotProduct( pm->ps->velocity, trace.plane.normal ) > 10 )
|
||||||
if (pm->ps.velocity.y > 0 && pm->ps.velocity.dotProduct(trace.planenormal) > 10.0f)
|
if (pm->ps.velocity.z > 0 && pm->ps.velocity.dotProduct(trace.planenormal) > 10.0f)
|
||||||
{
|
{
|
||||||
//if ( pm->debugLevel )
|
//if ( pm->debugLevel )
|
||||||
//Com_Printf("%i:kickoff\n", c_pmove);
|
//Com_Printf("%i:kickoff\n", c_pmove);
|
||||||
|
@ -1417,7 +1421,7 @@ static void PM_GroundTrace( void )
|
||||||
|
|
||||||
// slopes that are too steep will not be considered onground
|
// slopes that are too steep will not be considered onground
|
||||||
//if ( trace.plane.normal[2] < MIN_WALK_NORMAL )
|
//if ( trace.plane.normal[2] < MIN_WALK_NORMAL )
|
||||||
if (trace.planenormal.y < MIN_WALK_NORMAL)
|
if (trace.planenormal.z < MIN_WALK_NORMAL)
|
||||||
{
|
{
|
||||||
//if ( pm->debugLevel )
|
//if ( pm->debugLevel )
|
||||||
//Com_Printf("%i:steep\n", c_pmove);
|
//Com_Printf("%i:steep\n", c_pmove);
|
||||||
|
@ -1451,7 +1455,7 @@ static void PM_GroundTrace( void )
|
||||||
|
|
||||||
// don't do landing time if we were just going down a slope
|
// don't do landing time if we were just going down a slope
|
||||||
//if ( pml.previous_velocity[2] < -200 )
|
//if ( pml.previous_velocity[2] < -200 )
|
||||||
if (pml.previous_velocity.y < -200)
|
if (pml.previous_velocity.z < -200)
|
||||||
{
|
{
|
||||||
// don't allow another jump for a little while
|
// don't allow another jump for a little while
|
||||||
//pm->ps->pm_flags |= PMF_TIME_LAND;
|
//pm->ps->pm_flags |= PMF_TIME_LAND;
|
||||||
|
@ -1469,6 +1473,7 @@ static void PM_GroundTrace( void )
|
||||||
|
|
||||||
static void PM_AirMove()
|
static void PM_AirMove()
|
||||||
{
|
{
|
||||||
|
std::cout << "Air move\n";
|
||||||
//int i;
|
//int i;
|
||||||
Ogre::Vector3 wishvel;
|
Ogre::Vector3 wishvel;
|
||||||
float fmove, smove;
|
float fmove, smove;
|
||||||
|
@ -1490,7 +1495,7 @@ static void PM_AirMove()
|
||||||
|
|
||||||
// project moves down to flat plane
|
// project moves down to flat plane
|
||||||
//pml.forward[2] = 0;
|
//pml.forward[2] = 0;
|
||||||
pml.forward.y = 0;
|
pml.forward.y = 0; //Z or Y?
|
||||||
//pml.right[2] = 0;
|
//pml.right[2] = 0;
|
||||||
pml.right.y = 0;
|
pml.right.y = 0;
|
||||||
//VectorNormalize (pml.forward);
|
//VectorNormalize (pml.forward);
|
||||||
|
@ -1503,7 +1508,7 @@ static void PM_AirMove()
|
||||||
wishvel = pml.forward * fmove + pml.right * smove;
|
wishvel = pml.forward * fmove + pml.right * smove;
|
||||||
|
|
||||||
//wishvel[2] = 0;
|
//wishvel[2] = 0;
|
||||||
wishvel.y = 0;
|
wishvel.z = 0;
|
||||||
|
|
||||||
//VectorCopy (wishvel, wishdir);
|
//VectorCopy (wishvel, wishdir);
|
||||||
wishdir = wishvel;
|
wishdir = wishvel;
|
||||||
|
@ -1659,7 +1664,7 @@ static void PM_FlyMove( void )
|
||||||
wishvel = pml.forward * scale * pm->cmd.forwardmove + pml.right * scale * pm->cmd.rightmove;
|
wishvel = pml.forward * scale * pm->cmd.forwardmove + pml.right * scale * pm->cmd.rightmove;
|
||||||
|
|
||||||
//wishvel[2] += scale * pm->cmd.upmove;
|
//wishvel[2] += scale * pm->cmd.upmove;
|
||||||
wishvel.y += /*6.35f * */pm->cmd.upmove * scale;
|
wishvel.z += /*6.35f * */pm->cmd.upmove * scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
//VectorCopy (wishvel, wishdir);
|
//VectorCopy (wishvel, wishdir);
|
||||||
|
@ -1939,7 +1944,7 @@ void PmoveSingle (playerMove* const pmove)
|
||||||
PM_WaterMove(pmove);
|
PM_WaterMove(pmove);
|
||||||
else if ( pml.walking )
|
else if ( pml.walking )
|
||||||
{
|
{
|
||||||
std::cout << "WALKING\n";
|
|
||||||
// walking on ground
|
// walking on ground
|
||||||
PM_WalkMove(pmove);
|
PM_WalkMove(pmove);
|
||||||
//bprintf("WalkMove\n");
|
//bprintf("WalkMove\n");
|
||||||
|
|
|
@ -28,11 +28,11 @@ void newtrace(traceResults* const results, const Ogre::Vector3& start, const Ogr
|
||||||
|
|
||||||
NewPhysTraceResults out;
|
NewPhysTraceResults out;
|
||||||
//std::cout << "Starting trace\n";
|
//std::cout << "Starting trace\n";
|
||||||
Ogre::Vector3 startReplace = Ogre::Vector3(650,950, 45);
|
//Ogre::Vector3 startReplace = Ogre::Vector3(650,950, 45);
|
||||||
Ogre::Vector3 endReplace = startReplace;
|
//Ogre::Vector3 endReplace = startReplace;
|
||||||
endReplace.y -= .25;
|
//endReplace.z -= .25;
|
||||||
|
|
||||||
const bool hasHit = NewPhysicsTrace<collisionWorldTrace>(&out, start, end, BBHalfExtents, Ogre::Vector3(0.0f, rotation, 0.0f), isInterior, enginePass);
|
const bool hasHit = NewPhysicsTrace<collisionWorldTrace>(&out, start, end, BBHalfExtents, Ogre::Vector3(0.0f, 0.0f, rotation), isInterior, enginePass);
|
||||||
if(hasHit)
|
if(hasHit)
|
||||||
std::cout << "Has hit\n";
|
std::cout << "Has hit\n";
|
||||||
if (out.fraction < 0.001f)
|
if (out.fraction < 0.001f)
|
||||||
|
@ -65,7 +65,7 @@ void newtrace(traceResults* const results, const Ogre::Vector3& start, const Ogr
|
||||||
if (!hasHit)
|
if (!hasHit)
|
||||||
{
|
{
|
||||||
results->endpos = end;
|
results->endpos = end;
|
||||||
results->planenormal = Ogre::Vector3(0.0f, 1.0f, 0.0f);
|
results->planenormal = Ogre::Vector3(0.0f, 0.0f, 1.0f);
|
||||||
results->entityNum = ENTITYNUM_NONE;
|
results->entityNum = ENTITYNUM_NONE;
|
||||||
results->fraction = 1.0f;
|
results->fraction = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,811 +0,0 @@
|
||||||
#include "weather.hpp"
|
|
||||||
#include "world.hpp"
|
|
||||||
#include "player.hpp"
|
|
||||||
|
|
||||||
#include "../mwrender/renderingmanager.hpp"
|
|
||||||
#include "../mwsound/soundmanager.hpp"
|
|
||||||
|
|
||||||
#include <ctime>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <boost/algorithm/string.hpp>
|
|
||||||
|
|
||||||
using namespace Ogre;
|
|
||||||
using namespace MWWorld;
|
|
||||||
using namespace MWSound;
|
|
||||||
|
|
||||||
#define lerp(x, y) (x * (1-factor) + y * factor)
|
|
||||||
|
|
||||||
const std::string WeatherGlobals::mThunderSoundID0 = "Thunder0";
|
|
||||||
const std::string WeatherGlobals::mThunderSoundID1 = "Thunder1";
|
|
||||||
const std::string WeatherGlobals::mThunderSoundID2 = "Thunder2";
|
|
||||||
const std::string WeatherGlobals::mThunderSoundID3 = "Thunder3";
|
|
||||||
const float WeatherGlobals::mSunriseTime = 8;
|
|
||||||
const float WeatherGlobals::mSunsetTime = 18;
|
|
||||||
const float WeatherGlobals::mSunriseDuration = 2;
|
|
||||||
const float WeatherGlobals::mSunsetDuration = 2;
|
|
||||||
const float WeatherGlobals::mWeatherUpdateTime = 20.f;
|
|
||||||
const float WeatherGlobals::mThunderFrequency = .4;
|
|
||||||
const float WeatherGlobals::mThunderThreshold = 0.6;
|
|
||||||
const float WeatherGlobals::mThunderSoundDelay = 0.25;
|
|
||||||
|
|
||||||
WeatherManager::WeatherManager(MWRender::RenderingManager* rendering, Environment* env) :
|
|
||||||
mHour(14), mCurrentWeather("clear"), mFirstUpdate(true), mWeatherUpdateTime(0),
|
|
||||||
mThunderFlash(0), mThunderChance(0), mThunderChanceNeeded(50), mThunderSoundDelay(0)
|
|
||||||
{
|
|
||||||
mRendering = rendering;
|
|
||||||
mEnvironment = env;
|
|
||||||
|
|
||||||
#define clr(r,g,b) ColourValue(r/255.f, g/255.f, b/255.f)
|
|
||||||
|
|
||||||
/// \todo read these from Morrowind.ini
|
|
||||||
Weather clear;
|
|
||||||
clear.mCloudTexture = "tx_sky_clear.dds";
|
|
||||||
clear.mCloudsMaximumPercent = 1.0;
|
|
||||||
clear.mTransitionDelta = 0.015;
|
|
||||||
clear.mSkySunriseColor = clr(118, 141, 164);
|
|
||||||
clear.mSkyDayColor = clr(95, 135, 203);
|
|
||||||
clear.mSkySunsetColor = clr(56, 89, 129);
|
|
||||||
clear.mSkyNightColor = clr(9, 10, 11);
|
|
||||||
clear.mFogSunriseColor = clr(255, 189, 157);
|
|
||||||
clear.mFogDayColor = clr(206, 227, 255);
|
|
||||||
clear.mFogSunsetColor = clr(255, 189, 157);
|
|
||||||
clear.mFogNightColor = clr(9, 10, 11);
|
|
||||||
clear.mAmbientSunriseColor = clr(47, 66, 96);
|
|
||||||
clear.mAmbientDayColor = clr(137, 140, 160);
|
|
||||||
clear.mAmbientSunsetColor = clr(68, 75, 96);
|
|
||||||
clear.mAmbientNightColor = clr(32, 35, 42);
|
|
||||||
clear.mSunSunriseColor = clr(242, 159, 99);
|
|
||||||
clear.mSunDayColor = clr(255, 252, 238);
|
|
||||||
clear.mSunSunsetColor = clr(255, 115, 79);
|
|
||||||
clear.mSunNightColor = clr(59, 97, 176);
|
|
||||||
clear.mSunDiscSunsetColor = clr(255, 189, 157);
|
|
||||||
clear.mLandFogDayDepth = 0.69;
|
|
||||||
clear.mLandFogNightDepth = 0.69;
|
|
||||||
clear.mWindSpeed = 0.1;
|
|
||||||
clear.mCloudSpeed = 1.25;
|
|
||||||
clear.mGlareView = 1.0;
|
|
||||||
mWeatherSettings["clear"] = clear;
|
|
||||||
|
|
||||||
Weather cloudy;
|
|
||||||
cloudy.mCloudTexture = "tx_sky_cloudy.dds";
|
|
||||||
cloudy.mCloudsMaximumPercent = 1.0;
|
|
||||||
cloudy.mTransitionDelta = 0.015;
|
|
||||||
cloudy.mSkySunriseColor = clr(126, 158, 173);
|
|
||||||
cloudy.mSkyDayColor = clr(117, 160, 215);
|
|
||||||
cloudy.mSkySunsetColor = clr(111, 114, 159);
|
|
||||||
cloudy.mSkyNightColor = clr(9, 10, 11);
|
|
||||||
cloudy.mFogSunriseColor = clr(255, 207, 149);
|
|
||||||
cloudy.mFogDayColor = clr(245, 235, 224);
|
|
||||||
cloudy.mFogSunsetColor = clr(255, 155, 106);
|
|
||||||
cloudy.mFogNightColor = clr(9, 10, 11);
|
|
||||||
cloudy.mAmbientSunriseColor = clr(66, 74, 87);
|
|
||||||
cloudy.mAmbientDayColor = clr(137, 145, 160);
|
|
||||||
cloudy.mAmbientSunsetColor = clr(71, 80, 92);
|
|
||||||
cloudy.mAmbientNightColor = clr(32, 39, 54);
|
|
||||||
cloudy.mSunSunriseColor = clr(241, 177, 99);
|
|
||||||
cloudy.mSunDayColor = clr(255, 236, 221);
|
|
||||||
cloudy.mSunSunsetColor = clr(255, 89, 00);
|
|
||||||
cloudy.mSunNightColor = clr(77, 91, 124);
|
|
||||||
cloudy.mSunDiscSunsetColor = clr(255, 202, 179);
|
|
||||||
cloudy.mLandFogDayDepth = 0.72;
|
|
||||||
cloudy.mLandFogNightDepth = 0.72;
|
|
||||||
cloudy.mWindSpeed = 0.2;
|
|
||||||
cloudy.mCloudSpeed = 2;
|
|
||||||
cloudy.mGlareView = 1.0;
|
|
||||||
mWeatherSettings["cloudy"] = cloudy;
|
|
||||||
|
|
||||||
Weather foggy;
|
|
||||||
foggy.mCloudTexture = "tx_sky_foggy.dds";
|
|
||||||
foggy.mCloudsMaximumPercent = 1.0;
|
|
||||||
foggy.mTransitionDelta = 0.015;
|
|
||||||
foggy.mSkySunriseColor = clr(197, 190, 180);
|
|
||||||
foggy.mSkyDayColor = clr(184, 211, 228);
|
|
||||||
foggy.mSkySunsetColor = clr(142, 159, 176);
|
|
||||||
foggy.mSkyNightColor = clr(18, 23, 28);
|
|
||||||
foggy.mFogSunriseColor = clr(173, 164, 148);
|
|
||||||
foggy.mFogDayColor = clr(150, 187, 209);
|
|
||||||
foggy.mFogSunsetColor = clr(113, 135, 157);
|
|
||||||
foggy.mFogNightColor = clr(19, 24, 29);
|
|
||||||
foggy.mAmbientSunriseColor = clr(48, 43, 37);
|
|
||||||
foggy.mAmbientDayColor = clr(92, 109, 120);
|
|
||||||
foggy.mAmbientSunsetColor = clr(28, 33, 39);
|
|
||||||
foggy.mAmbientNightColor = clr(28, 33, 39);
|
|
||||||
foggy.mSunSunriseColor = clr(177, 162, 137);
|
|
||||||
foggy.mSunDayColor = clr(111, 131, 151);
|
|
||||||
foggy.mSunSunsetColor = clr(125, 157, 189);
|
|
||||||
foggy.mSunNightColor = clr(81, 100, 119);
|
|
||||||
foggy.mSunDiscSunsetColor = clr(223, 223, 223);
|
|
||||||
foggy.mLandFogDayDepth = 1.0;
|
|
||||||
foggy.mLandFogNightDepth = 1.9;
|
|
||||||
foggy.mWindSpeed = 0;
|
|
||||||
foggy.mCloudSpeed = 1.25;
|
|
||||||
foggy.mGlareView = 0.25;
|
|
||||||
mWeatherSettings["foggy"] = foggy;
|
|
||||||
|
|
||||||
Weather thunderstorm;
|
|
||||||
thunderstorm.mCloudTexture = "tx_sky_thunder.dds";
|
|
||||||
thunderstorm.mCloudsMaximumPercent = 0.66;
|
|
||||||
thunderstorm.mTransitionDelta = 0.03;
|
|
||||||
thunderstorm.mSkySunriseColor = clr(35, 36, 39);
|
|
||||||
thunderstorm.mSkyDayColor = clr(97, 104, 115);
|
|
||||||
thunderstorm.mSkySunsetColor = clr(35, 36, 39);
|
|
||||||
thunderstorm.mSkyNightColor = clr(19, 20, 22);
|
|
||||||
thunderstorm.mFogSunriseColor = clr(70, 74, 85);
|
|
||||||
thunderstorm.mFogDayColor = clr(97, 104, 115);
|
|
||||||
thunderstorm.mFogSunsetColor = clr(70, 74, 85);
|
|
||||||
thunderstorm.mFogNightColor = clr(19, 20, 22);
|
|
||||||
thunderstorm.mAmbientSunriseColor = clr(54, 54, 54);
|
|
||||||
thunderstorm.mAmbientDayColor = clr(90, 90, 90);
|
|
||||||
thunderstorm.mAmbientSunsetColor = clr(54, 54, 54);
|
|
||||||
thunderstorm.mAmbientNightColor = clr(49, 51, 54);
|
|
||||||
thunderstorm.mSunSunriseColor = clr(91, 99, 122);
|
|
||||||
thunderstorm.mSunDayColor = clr(138, 144, 155);
|
|
||||||
thunderstorm.mSunSunsetColor = clr(96, 101, 117);
|
|
||||||
thunderstorm.mSunNightColor = clr(55, 76, 110);
|
|
||||||
thunderstorm.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
thunderstorm.mLandFogDayDepth = 1;
|
|
||||||
thunderstorm.mLandFogNightDepth = 1.15;
|
|
||||||
thunderstorm.mWindSpeed = 0.5;
|
|
||||||
thunderstorm.mCloudSpeed = 3;
|
|
||||||
thunderstorm.mGlareView = 0;
|
|
||||||
thunderstorm.mRainLoopSoundID = "rain heavy";
|
|
||||||
mWeatherSettings["thunderstorm"] = thunderstorm;
|
|
||||||
|
|
||||||
Weather rain;
|
|
||||||
rain.mCloudTexture = "tx_sky_rainy.dds";
|
|
||||||
rain.mCloudsMaximumPercent = 0.66;
|
|
||||||
rain.mTransitionDelta = 0.015;
|
|
||||||
rain.mSkySunriseColor = clr(71, 74, 75);
|
|
||||||
rain.mSkyDayColor = clr(116, 120, 122);
|
|
||||||
rain.mSkySunsetColor = clr(73, 73, 73);
|
|
||||||
rain.mSkyNightColor = clr(24, 25, 26);
|
|
||||||
rain.mFogSunriseColor = clr(71, 74, 75);
|
|
||||||
rain.mFogDayColor = clr(116, 120, 122);
|
|
||||||
rain.mFogSunsetColor = clr(73, 73, 73);
|
|
||||||
rain.mFogNightColor = clr(24, 25, 26);
|
|
||||||
rain.mAmbientSunriseColor = clr(97, 90, 88);
|
|
||||||
rain.mAmbientDayColor = clr(105, 110, 113);
|
|
||||||
rain.mAmbientSunsetColor = clr(88, 97, 97);
|
|
||||||
rain.mAmbientNightColor = clr(50, 55, 67);
|
|
||||||
rain.mSunSunriseColor = clr(131, 122, 120);
|
|
||||||
rain.mSunDayColor = clr(149, 157, 170);
|
|
||||||
rain.mSunSunsetColor = clr(120, 126, 131);
|
|
||||||
rain.mSunNightColor = clr(50, 62, 101);
|
|
||||||
rain.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
rain.mLandFogDayDepth = 0.8;
|
|
||||||
rain.mLandFogNightDepth = 0.8;
|
|
||||||
rain.mWindSpeed = 0.3;
|
|
||||||
rain.mCloudSpeed = 2;
|
|
||||||
rain.mGlareView = 0;
|
|
||||||
rain.mRainLoopSoundID = "rain";
|
|
||||||
mWeatherSettings["rain"] = rain;
|
|
||||||
|
|
||||||
Weather overcast;
|
|
||||||
overcast.mCloudTexture = "tx_sky_overcast.dds";
|
|
||||||
overcast.mCloudsMaximumPercent = 1.0;
|
|
||||||
overcast.mTransitionDelta = 0.015;
|
|
||||||
overcast.mSkySunriseColor = clr(91, 99, 106);
|
|
||||||
overcast.mSkyDayColor = clr(143, 146, 149);
|
|
||||||
overcast.mSkySunsetColor = clr(108, 115, 121);
|
|
||||||
overcast.mSkyNightColor = clr(19, 22, 25);
|
|
||||||
overcast.mFogSunriseColor = clr(91, 99, 106);
|
|
||||||
overcast.mFogDayColor = clr(143, 146, 149);
|
|
||||||
overcast.mFogSunsetColor = clr(108, 115, 121);
|
|
||||||
overcast.mFogNightColor = clr(19, 22, 25);
|
|
||||||
overcast.mAmbientSunriseColor = clr(84, 88, 92);
|
|
||||||
overcast.mAmbientDayColor = clr(93, 96, 105);
|
|
||||||
overcast.mAmbientSunsetColor = clr(83, 77, 75);
|
|
||||||
overcast.mAmbientNightColor = clr(57, 60, 66);
|
|
||||||
overcast.mSunSunriseColor = clr(87, 125, 163);
|
|
||||||
overcast.mSunDayColor = clr(163, 169, 183);
|
|
||||||
overcast.mSunSunsetColor = clr(85, 103, 157);
|
|
||||||
overcast.mSunNightColor = clr(32, 54, 100);
|
|
||||||
overcast.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
overcast.mLandFogDayDepth = 0.7;
|
|
||||||
overcast.mLandFogNightDepth = 0.7;
|
|
||||||
overcast.mWindSpeed = 0.2;
|
|
||||||
overcast.mCloudSpeed = 1.5;
|
|
||||||
overcast.mGlareView = 0;
|
|
||||||
mWeatherSettings["overcast"] = overcast;
|
|
||||||
|
|
||||||
Weather ashstorm;
|
|
||||||
ashstorm.mCloudTexture = "tx_sky_ashstorm.dds";
|
|
||||||
ashstorm.mCloudsMaximumPercent = 1.0;
|
|
||||||
ashstorm.mTransitionDelta = 0.035;
|
|
||||||
ashstorm.mSkySunriseColor = clr(91, 56, 51);
|
|
||||||
ashstorm.mSkyDayColor = clr(124, 73, 58);
|
|
||||||
ashstorm.mSkySunsetColor = clr(106, 55, 40);
|
|
||||||
ashstorm.mSkyNightColor = clr(20, 21, 22);
|
|
||||||
ashstorm.mFogSunriseColor = clr(91, 56, 51);
|
|
||||||
ashstorm.mFogDayColor = clr(124, 73, 58);
|
|
||||||
ashstorm.mFogSunsetColor = clr(106, 55, 40);
|
|
||||||
ashstorm.mFogNightColor = clr(20, 21, 22);
|
|
||||||
ashstorm.mAmbientSunriseColor = clr(52, 42, 37);
|
|
||||||
ashstorm.mAmbientDayColor = clr(75, 49, 41);
|
|
||||||
ashstorm.mAmbientSunsetColor = clr(48, 39, 35);
|
|
||||||
ashstorm.mAmbientNightColor = clr(36, 42, 49);
|
|
||||||
ashstorm.mSunSunriseColor = clr(184, 91, 71);
|
|
||||||
ashstorm.mSunDayColor = clr(228, 139, 114);
|
|
||||||
ashstorm.mSunSunsetColor = clr(185, 86, 57);
|
|
||||||
ashstorm.mSunNightColor = clr(54, 66, 74);
|
|
||||||
ashstorm.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
ashstorm.mLandFogDayDepth = 1.1;
|
|
||||||
ashstorm.mLandFogNightDepth = 1.2;
|
|
||||||
ashstorm.mWindSpeed = 0.8;
|
|
||||||
ashstorm.mCloudSpeed = 7;
|
|
||||||
ashstorm.mGlareView = 0;
|
|
||||||
ashstorm.mAmbientLoopSoundID = "ashstorm";
|
|
||||||
mWeatherSettings["ashstorm"] = ashstorm;
|
|
||||||
|
|
||||||
Weather blight;
|
|
||||||
blight.mCloudTexture = "tx_sky_blight.dds";
|
|
||||||
blight.mCloudsMaximumPercent = 1.0;
|
|
||||||
blight.mTransitionDelta = 0.04;
|
|
||||||
blight.mSkySunriseColor = clr(90, 35, 35);
|
|
||||||
blight.mSkyDayColor = clr(90, 35, 35);
|
|
||||||
blight.mSkySunsetColor = clr(92, 33, 33);
|
|
||||||
blight.mSkyNightColor = clr(44, 14, 14);
|
|
||||||
blight.mFogSunriseColor = clr(90, 35, 35);
|
|
||||||
blight.mFogDayColor = clr(128, 19, 19);
|
|
||||||
blight.mFogSunsetColor = clr(92, 33, 33);
|
|
||||||
blight.mFogNightColor = clr(44, 14, 14);
|
|
||||||
blight.mAmbientSunriseColor = clr(61, 40, 40);
|
|
||||||
blight.mAmbientDayColor = clr(79, 54, 54);
|
|
||||||
blight.mAmbientSunsetColor = clr(61, 40, 40);
|
|
||||||
blight.mAmbientNightColor = clr(56, 58, 62);
|
|
||||||
blight.mSunSunriseColor = clr(180, 78, 78);
|
|
||||||
blight.mSunDayColor = clr(224, 84, 84);
|
|
||||||
blight.mSunSunsetColor = clr(180, 78, 78);
|
|
||||||
blight.mSunNightColor = clr(61, 91, 143);
|
|
||||||
blight.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
blight.mLandFogDayDepth = 1.1;
|
|
||||||
blight.mLandFogNightDepth = 1.2;
|
|
||||||
blight.mWindSpeed = 0.9;
|
|
||||||
blight.mCloudSpeed = 9;
|
|
||||||
blight.mGlareView = 0;
|
|
||||||
blight.mAmbientLoopSoundID = "blight";
|
|
||||||
mWeatherSettings["blight"] = blight;
|
|
||||||
|
|
||||||
Weather snow;
|
|
||||||
snow.mCloudTexture = "tx_bm_sky_snow.dds";
|
|
||||||
snow.mCloudsMaximumPercent = 1.0;
|
|
||||||
snow.mTransitionDelta = 0.014;
|
|
||||||
snow.mSkySunriseColor = clr(196, 91, 91);
|
|
||||||
snow.mSkyDayColor = clr(153, 158, 166);
|
|
||||||
snow.mSkySunsetColor = clr(96, 115, 134);
|
|
||||||
snow.mSkyNightColor = clr(31, 35, 39);
|
|
||||||
snow.mFogSunriseColor = clr(106, 91, 91);
|
|
||||||
snow.mFogDayColor = clr(153, 158, 166);
|
|
||||||
snow.mFogSunsetColor = clr(96, 115, 134);
|
|
||||||
snow.mFogNightColor = clr(31, 35, 39);
|
|
||||||
snow.mAmbientSunriseColor = clr(92, 84, 84);
|
|
||||||
snow.mAmbientDayColor = clr(93, 96, 105);
|
|
||||||
snow.mAmbientSunsetColor = clr(70, 79, 87);
|
|
||||||
snow.mAmbientNightColor = clr(49, 58, 68);
|
|
||||||
snow.mSunSunriseColor = clr(141, 109, 109);
|
|
||||||
snow.mSunDayColor = clr(163, 169, 183);
|
|
||||||
snow.mSunSunsetColor = clr(101, 121, 141);
|
|
||||||
snow.mSunNightColor = clr(55, 66, 77);
|
|
||||||
snow.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
snow.mLandFogDayDepth = 1.0;
|
|
||||||
snow.mLandFogNightDepth = 1.2;
|
|
||||||
snow.mWindSpeed = 0;
|
|
||||||
snow.mCloudSpeed = 1.5;
|
|
||||||
snow.mGlareView = 0;
|
|
||||||
mWeatherSettings["snow"] = snow;
|
|
||||||
|
|
||||||
Weather blizzard;
|
|
||||||
blizzard.mCloudTexture = "tx_bm_sky_blizzard.dds";
|
|
||||||
blizzard.mCloudsMaximumPercent = 1.0;
|
|
||||||
blizzard.mTransitionDelta = 0.030;
|
|
||||||
blizzard.mSkySunriseColor = clr(91, 99, 106);
|
|
||||||
blizzard.mSkyDayColor = clr(121, 133, 145);
|
|
||||||
blizzard.mSkySunsetColor = clr(108, 115, 121);
|
|
||||||
blizzard.mSkyNightColor = clr(27, 29, 31);
|
|
||||||
blizzard.mFogSunriseColor = clr(91, 99, 106);
|
|
||||||
blizzard.mFogDayColor = clr(121, 133, 145);
|
|
||||||
blizzard.mFogSunsetColor = clr(108, 115, 121);
|
|
||||||
blizzard.mFogNightColor = clr(21, 24, 28);
|
|
||||||
blizzard.mAmbientSunriseColor = clr(84, 88, 92);
|
|
||||||
blizzard.mAmbientDayColor = clr(93, 96, 105);
|
|
||||||
blizzard.mAmbientSunsetColor = clr(83, 77, 75);
|
|
||||||
blizzard.mAmbientNightColor = clr(53, 62, 70);
|
|
||||||
blizzard.mSunSunriseColor = clr(114, 128, 146);
|
|
||||||
blizzard.mSunDayColor = clr(163, 169, 183);
|
|
||||||
blizzard.mSunSunsetColor = clr(106, 114, 136);
|
|
||||||
blizzard.mSunNightColor = clr(57, 66, 74);
|
|
||||||
blizzard.mSunDiscSunsetColor = clr(128, 128, 128);
|
|
||||||
blizzard.mLandFogDayDepth = 2.8;
|
|
||||||
blizzard.mLandFogNightDepth = 3.0;
|
|
||||||
blizzard.mWindSpeed = 0.9;
|
|
||||||
blizzard.mCloudSpeed = 7.5;
|
|
||||||
blizzard.mGlareView = 0;
|
|
||||||
blizzard.mAmbientLoopSoundID = "BM Blizzard";
|
|
||||||
mWeatherSettings["blizzard"] = blizzard;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WeatherManager::setWeather(const String& weather, bool instant)
|
|
||||||
{
|
|
||||||
if (instant || mFirstUpdate)
|
|
||||||
{
|
|
||||||
mNextWeather = "";
|
|
||||||
mCurrentWeather = weather;
|
|
||||||
mFirstUpdate = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (mNextWeather != "")
|
|
||||||
{
|
|
||||||
// transition more than 50% finished?
|
|
||||||
if (mRemainingTransitionTime/(mWeatherSettings[mCurrentWeather].mTransitionDelta*24.f*60) <= 0.5)
|
|
||||||
mCurrentWeather = mNextWeather;
|
|
||||||
}
|
|
||||||
|
|
||||||
mNextWeather = weather;
|
|
||||||
mRemainingTransitionTime = mWeatherSettings[mCurrentWeather].mTransitionDelta*24.f*60;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherResult WeatherManager::getResult(const String& weather)
|
|
||||||
{
|
|
||||||
const Weather& current = mWeatherSettings[weather];
|
|
||||||
WeatherResult result;
|
|
||||||
|
|
||||||
result.mCloudTexture = current.mCloudTexture;
|
|
||||||
result.mCloudBlendFactor = 0;
|
|
||||||
result.mCloudOpacity = current.mCloudsMaximumPercent;
|
|
||||||
result.mWindSpeed = current.mWindSpeed;
|
|
||||||
result.mCloudSpeed = current.mCloudSpeed;
|
|
||||||
result.mGlareView = current.mGlareView;
|
|
||||||
result.mAmbientLoopSoundID = current.mAmbientLoopSoundID;
|
|
||||||
result.mSunColor = current.mSunDiscSunsetColor;
|
|
||||||
|
|
||||||
const float fade_duration = current.mTransitionDelta * 24.f;
|
|
||||||
|
|
||||||
result.mNight = (mHour < 6.f+fade_duration || mHour > 20.f-fade_duration);
|
|
||||||
|
|
||||||
result.mFogDepth = result.mNight ? current.mLandFogNightDepth : current.mLandFogDayDepth;
|
|
||||||
|
|
||||||
// night
|
|
||||||
if (mHour <= (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration)
|
|
||||||
|| mHour >= (WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration))
|
|
||||||
{
|
|
||||||
result.mFogColor = current.mFogNightColor;
|
|
||||||
result.mAmbientColor = current.mAmbientNightColor;
|
|
||||||
result.mSunColor = current.mSunNightColor;
|
|
||||||
result.mSkyColor = current.mSkyNightColor;
|
|
||||||
result.mNightFade = 1.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
// sunrise
|
|
||||||
else if (mHour >= (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration) && mHour <= WeatherGlobals::mSunriseTime)
|
|
||||||
{
|
|
||||||
if (mHour <= (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration+fade_duration))
|
|
||||||
{
|
|
||||||
// fade in
|
|
||||||
float advance = (WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration+fade_duration)-mHour;
|
|
||||||
float factor = (advance / fade_duration);
|
|
||||||
result.mFogColor = lerp(current.mFogSunriseColor, current.mFogNightColor);
|
|
||||||
result.mAmbientColor = lerp(current.mAmbientSunriseColor, current.mAmbientNightColor);
|
|
||||||
result.mSunColor = lerp(current.mSunSunriseColor, current.mSunNightColor);
|
|
||||||
result.mSkyColor = lerp(current.mSkySunriseColor, current.mSkyNightColor);
|
|
||||||
result.mNightFade = factor;
|
|
||||||
}
|
|
||||||
else if (mHour >= (WeatherGlobals::mSunriseTime-fade_duration))
|
|
||||||
{
|
|
||||||
// fade out
|
|
||||||
float advance = mHour-(WeatherGlobals::mSunriseTime-fade_duration);
|
|
||||||
float factor = advance / fade_duration;
|
|
||||||
result.mFogColor = lerp(current.mFogSunriseColor, current.mFogDayColor);
|
|
||||||
result.mAmbientColor = lerp(current.mAmbientSunriseColor, current.mAmbientDayColor);
|
|
||||||
result.mSunColor = lerp(current.mSunSunriseColor, current.mSunDayColor);
|
|
||||||
result.mSkyColor = lerp(current.mSkySunriseColor, current.mSkyDayColor);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result.mFogColor = current.mFogSunriseColor;
|
|
||||||
result.mAmbientColor = current.mAmbientSunriseColor;
|
|
||||||
result.mSunColor = current.mSunSunriseColor;
|
|
||||||
result.mSkyColor = current.mSkySunriseColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// day
|
|
||||||
else if (mHour >= (WeatherGlobals::mSunriseTime) && mHour <= (WeatherGlobals::mSunsetTime))
|
|
||||||
{
|
|
||||||
result.mFogColor = current.mFogDayColor;
|
|
||||||
result.mAmbientColor = current.mAmbientDayColor;
|
|
||||||
result.mSunColor = current.mSunDayColor;
|
|
||||||
result.mSkyColor = current.mSkyDayColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
// sunset
|
|
||||||
else if (mHour >= (WeatherGlobals::mSunsetTime) && mHour <= (WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration))
|
|
||||||
{
|
|
||||||
if (mHour <= (WeatherGlobals::mSunsetTime+fade_duration))
|
|
||||||
{
|
|
||||||
// fade in
|
|
||||||
float advance = (WeatherGlobals::mSunsetTime+fade_duration)-mHour;
|
|
||||||
float factor = (advance / fade_duration);
|
|
||||||
result.mFogColor = lerp(current.mFogSunsetColor, current.mFogDayColor);
|
|
||||||
result.mAmbientColor = lerp(current.mAmbientSunsetColor, current.mAmbientDayColor);
|
|
||||||
result.mSunColor = lerp(current.mSunSunsetColor, current.mSunDayColor);
|
|
||||||
result.mSkyColor = lerp(current.mSkySunsetColor, current.mSkyDayColor);
|
|
||||||
}
|
|
||||||
else if (mHour >= (WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration-fade_duration))
|
|
||||||
{
|
|
||||||
// fade out
|
|
||||||
float advance = mHour-(WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration-fade_duration);
|
|
||||||
float factor = advance / fade_duration;
|
|
||||||
result.mFogColor = lerp(current.mFogSunsetColor, current.mFogNightColor);
|
|
||||||
result.mAmbientColor = lerp(current.mAmbientSunsetColor, current.mAmbientNightColor);
|
|
||||||
result.mSunColor = lerp(current.mSunSunsetColor, current.mSunNightColor);
|
|
||||||
result.mSkyColor = lerp(current.mSkySunsetColor, current.mSkyNightColor);
|
|
||||||
result.mNightFade = factor;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result.mFogColor = current.mFogSunsetColor;
|
|
||||||
result.mAmbientColor = current.mAmbientSunsetColor;
|
|
||||||
result.mSunColor = current.mSunSunsetColor;
|
|
||||||
result.mSkyColor = current.mSkySunsetColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherResult WeatherManager::transition(float factor)
|
|
||||||
{
|
|
||||||
const WeatherResult& current = getResult(mCurrentWeather);
|
|
||||||
const WeatherResult& other = getResult(mNextWeather);
|
|
||||||
WeatherResult result;
|
|
||||||
|
|
||||||
result.mCloudTexture = current.mCloudTexture;
|
|
||||||
result.mNextCloudTexture = other.mCloudTexture;
|
|
||||||
result.mCloudBlendFactor = factor;
|
|
||||||
|
|
||||||
result.mCloudOpacity = lerp(current.mCloudOpacity, other.mCloudOpacity);
|
|
||||||
result.mFogColor = lerp(current.mFogColor, other.mFogColor);
|
|
||||||
result.mSunColor = lerp(current.mSunColor, other.mSunColor);
|
|
||||||
result.mSkyColor = lerp(current.mSkyColor, other.mSkyColor);
|
|
||||||
|
|
||||||
result.mAmbientColor = lerp(current.mAmbientColor, other.mAmbientColor);
|
|
||||||
result.mSunDiscColor = lerp(current.mSunDiscColor, other.mSunDiscColor);
|
|
||||||
result.mFogDepth = lerp(current.mFogDepth, other.mFogDepth);
|
|
||||||
result.mWindSpeed = lerp(current.mWindSpeed, other.mWindSpeed);
|
|
||||||
result.mCloudSpeed = lerp(current.mCloudSpeed, other.mCloudSpeed);
|
|
||||||
result.mCloudOpacity = lerp(current.mCloudOpacity, other.mCloudOpacity);
|
|
||||||
result.mGlareView = lerp(current.mGlareView, other.mGlareView);
|
|
||||||
|
|
||||||
result.mNight = current.mNight;
|
|
||||||
|
|
||||||
// sound change behaviour:
|
|
||||||
// if 'other' has a new sound, switch to it after 1/2 of the transition length
|
|
||||||
if (other.mAmbientLoopSoundID != "")
|
|
||||||
result.mAmbientLoopSoundID = factor>0.5 ? other.mAmbientLoopSoundID : current.mAmbientLoopSoundID;
|
|
||||||
// if 'current' has a sound and 'other' does not have a sound, turn off the sound immediately
|
|
||||||
else if (current.mAmbientLoopSoundID != "")
|
|
||||||
result.mAmbientLoopSoundID = "";
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WeatherManager::update(float duration)
|
|
||||||
{
|
|
||||||
mWeatherUpdateTime -= duration;
|
|
||||||
if (mEnvironment->mWorld->isCellExterior() || mEnvironment->mWorld->isCellQuasiExterior())
|
|
||||||
{
|
|
||||||
std::string regionstr = mEnvironment->mWorld->getPlayer().getPlayer().getCell()->cell->region;
|
|
||||||
boost::algorithm::to_lower(regionstr);
|
|
||||||
|
|
||||||
if (mWeatherUpdateTime <= 0 || regionstr != mCurrentRegion)
|
|
||||||
{
|
|
||||||
mCurrentRegion = regionstr;
|
|
||||||
mWeatherUpdateTime = WeatherGlobals::mWeatherUpdateTime*60.f;
|
|
||||||
|
|
||||||
std::string weather;
|
|
||||||
|
|
||||||
if (mRegionOverrides.find(regionstr) != mRegionOverrides.end())
|
|
||||||
weather = mRegionOverrides[regionstr];
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// get weather probabilities for the current region
|
|
||||||
const ESM::Region *region = mEnvironment->mWorld->getStore().regions.find (regionstr);
|
|
||||||
|
|
||||||
float clear = region->data.clear/255.f;
|
|
||||||
float cloudy = region->data.cloudy/255.f;
|
|
||||||
float foggy = region->data.foggy/255.f;
|
|
||||||
float overcast = region->data.overcast/255.f;
|
|
||||||
float rain = region->data.rain/255.f;
|
|
||||||
float thunder = region->data.thunder/255.f;
|
|
||||||
float ash = region->data.ash/255.f;
|
|
||||||
float blight = region->data.blight/255.f;
|
|
||||||
float snow = region->data.a/255.f;
|
|
||||||
float blizzard = region->data.b/255.f;
|
|
||||||
|
|
||||||
// re-scale to 100 percent
|
|
||||||
const float total = clear+cloudy+foggy+overcast+rain+thunder+ash+blight+snow+blizzard;
|
|
||||||
|
|
||||||
srand(time(NULL));
|
|
||||||
float random = ((rand()%100)/100.f) * total;
|
|
||||||
|
|
||||||
if (random >= snow+blight+ash+thunder+rain+overcast+foggy+cloudy+clear)
|
|
||||||
weather = "blizzard";
|
|
||||||
else if (random >= blight+ash+thunder+rain+overcast+foggy+cloudy+clear)
|
|
||||||
weather = "snow";
|
|
||||||
else if (random >= ash+thunder+rain+overcast+foggy+cloudy+clear)
|
|
||||||
weather = "blight";
|
|
||||||
else if (random >= thunder+rain+overcast+foggy+cloudy+clear)
|
|
||||||
weather = "ashstorm";
|
|
||||||
else if (random >= rain+overcast+foggy+cloudy+clear)
|
|
||||||
weather = "thunderstorm";
|
|
||||||
else if (random >= overcast+foggy+cloudy+clear)
|
|
||||||
weather = "rain";
|
|
||||||
else if (random >= foggy+cloudy+clear)
|
|
||||||
weather = "overcast";
|
|
||||||
else if (random >= cloudy+clear)
|
|
||||||
weather = "foggy";
|
|
||||||
else if (random >= clear)
|
|
||||||
weather = "cloudy";
|
|
||||||
else
|
|
||||||
weather = "clear";
|
|
||||||
}
|
|
||||||
|
|
||||||
setWeather(weather, false);
|
|
||||||
/*
|
|
||||||
std::cout << "roll result: " << random << std::endl;
|
|
||||||
|
|
||||||
std::cout << regionstr << " weather probabilities: " << clear << " " << cloudy << " " << foggy << " "
|
|
||||||
<< overcast << " " << rain << " " << thunder << " " << ash << " " << blight << " " << snow << " "
|
|
||||||
<< blizzard << std::endl;
|
|
||||||
|
|
||||||
std::cout << "New weather : " << weather << std::endl;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
WeatherResult result;
|
|
||||||
|
|
||||||
if (mNextWeather != "")
|
|
||||||
{
|
|
||||||
mRemainingTransitionTime -= duration;
|
|
||||||
if (mRemainingTransitionTime < 0)
|
|
||||||
{
|
|
||||||
mCurrentWeather = mNextWeather;
|
|
||||||
mNextWeather = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mNextWeather != "")
|
|
||||||
result = transition(1-(mRemainingTransitionTime/(mWeatherSettings[mCurrentWeather].mTransitionDelta*24.f*60)));
|
|
||||||
else
|
|
||||||
result = getResult(mCurrentWeather);
|
|
||||||
|
|
||||||
mRendering->configureFog(result.mFogDepth, result.mFogColor);
|
|
||||||
|
|
||||||
// disable sun during night
|
|
||||||
if (mHour >= WeatherGlobals::mSunsetTime+WeatherGlobals::mSunsetDuration
|
|
||||||
|| mHour <= WeatherGlobals::mSunriseTime-WeatherGlobals::mSunriseDuration)
|
|
||||||
mRendering->getSkyManager()->sunDisable();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// during day, calculate sun angle
|
|
||||||
float height = 1-std::abs(((mHour-13)/7.f));
|
|
||||||
int facing = mHour > 13.f ? 1 : -1;
|
|
||||||
Vector3 final(
|
|
||||||
(1-height)*facing,
|
|
||||||
(1-height)*facing,
|
|
||||||
height);
|
|
||||||
mRendering->setSunDirection(final);
|
|
||||||
|
|
||||||
mRendering->getSkyManager()->sunEnable();
|
|
||||||
}
|
|
||||||
|
|
||||||
// moon calculations
|
|
||||||
float night;
|
|
||||||
if (mHour >= 14)
|
|
||||||
night = mHour-14;
|
|
||||||
else if (mHour <= 10)
|
|
||||||
night = mHour+10;
|
|
||||||
else
|
|
||||||
night = 0;
|
|
||||||
|
|
||||||
night /= 20.f;
|
|
||||||
|
|
||||||
if (night != 0)
|
|
||||||
{
|
|
||||||
float moonHeight = 1-std::abs((night-0.5)*2);
|
|
||||||
int facing = (mHour > 0.f && mHour<12.f) ? 1 : -1;
|
|
||||||
Vector3 masser(
|
|
||||||
(1-moonHeight)*facing,
|
|
||||||
(1-moonHeight)*facing,
|
|
||||||
moonHeight);
|
|
||||||
|
|
||||||
Vector3 secunda(
|
|
||||||
(1-moonHeight)*facing*0.8,
|
|
||||||
(1-moonHeight)*facing*1.25,
|
|
||||||
moonHeight);
|
|
||||||
|
|
||||||
mRendering->getSkyManager()->setMasserDirection(masser);
|
|
||||||
mRendering->getSkyManager()->setSecundaDirection(secunda);
|
|
||||||
mRendering->getSkyManager()->masserEnable();
|
|
||||||
mRendering->getSkyManager()->secundaEnable();
|
|
||||||
|
|
||||||
float hour_fade;
|
|
||||||
if (mHour >= 7.f && mHour <= 14.f)
|
|
||||||
hour_fade = 1-(mHour-7)/3.f;
|
|
||||||
else if (mHour >= 14 && mHour <= 15.f)
|
|
||||||
hour_fade = mHour-14;
|
|
||||||
else
|
|
||||||
hour_fade = 1;
|
|
||||||
|
|
||||||
float secunda_angle_fade;
|
|
||||||
float masser_angle_fade;
|
|
||||||
float angle = moonHeight*90.f;
|
|
||||||
|
|
||||||
if (angle >= 30 && angle <= 50)
|
|
||||||
secunda_angle_fade = (angle-30)/20.f;
|
|
||||||
else if (angle <30)
|
|
||||||
secunda_angle_fade = 0.f;
|
|
||||||
else
|
|
||||||
secunda_angle_fade = 1.f;
|
|
||||||
|
|
||||||
if (angle >= 40 && angle <= 50)
|
|
||||||
masser_angle_fade = (angle-40)/10.f;
|
|
||||||
else if (angle <40)
|
|
||||||
masser_angle_fade = 0.f;
|
|
||||||
else
|
|
||||||
masser_angle_fade = 1.f;
|
|
||||||
|
|
||||||
masser_angle_fade *= hour_fade;
|
|
||||||
secunda_angle_fade *= hour_fade;
|
|
||||||
|
|
||||||
mRendering->getSkyManager()->setMasserFade(masser_angle_fade);
|
|
||||||
mRendering->getSkyManager()->setSecundaFade(secunda_angle_fade);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mRendering->getSkyManager()->masserDisable();
|
|
||||||
mRendering->getSkyManager()->secundaDisable();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mCurrentWeather == "thunderstorm" && mNextWeather == "")
|
|
||||||
{
|
|
||||||
if (mThunderFlash > 0)
|
|
||||||
{
|
|
||||||
// play the sound after a delay
|
|
||||||
mThunderSoundDelay -= duration;
|
|
||||||
if (mThunderSoundDelay <= 0)
|
|
||||||
{
|
|
||||||
// pick a random sound
|
|
||||||
int sound = rand() % 4;
|
|
||||||
std::string soundname;
|
|
||||||
if (sound == 0) soundname = WeatherGlobals::mThunderSoundID0;
|
|
||||||
else if (sound == 1) soundname = WeatherGlobals::mThunderSoundID1;
|
|
||||||
else if (sound == 2) soundname = WeatherGlobals::mThunderSoundID2;
|
|
||||||
else if (sound == 3) soundname = WeatherGlobals::mThunderSoundID3;
|
|
||||||
mEnvironment->mSoundManager->playSound(soundname, 1.0, 1.0);
|
|
||||||
mThunderSoundDelay = 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
mThunderFlash -= duration;
|
|
||||||
if (mThunderFlash > 0)
|
|
||||||
mRendering->getSkyManager()->setThunder( mThunderFlash / WeatherGlobals::mThunderThreshold );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
srand(time(NULL));
|
|
||||||
mThunderChanceNeeded = rand() % 100;
|
|
||||||
mThunderChance = 0;
|
|
||||||
mRendering->getSkyManager()->setThunder( 0.f );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// no thunder active
|
|
||||||
mThunderChance += duration*4; // chance increases by 4 percent every second
|
|
||||||
if (mThunderChance >= mThunderChanceNeeded)
|
|
||||||
{
|
|
||||||
mThunderFlash = WeatherGlobals::mThunderThreshold;
|
|
||||||
|
|
||||||
mRendering->getSkyManager()->setThunder( mThunderFlash / WeatherGlobals::mThunderThreshold );
|
|
||||||
|
|
||||||
mThunderSoundDelay = WeatherGlobals::mThunderSoundDelay;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
mRendering->getSkyManager()->setThunder(0.f);
|
|
||||||
|
|
||||||
mRendering->setAmbientColour(result.mAmbientColor);
|
|
||||||
mRendering->sunEnable();
|
|
||||||
mRendering->setSunColour(result.mSunColor);
|
|
||||||
|
|
||||||
mRendering->getSkyManager()->setWeather(result);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mRendering->sunDisable();
|
|
||||||
mRendering->skyDisable();
|
|
||||||
mRendering->getSkyManager()->setThunder(0.f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WeatherManager::setHour(const float hour)
|
|
||||||
{
|
|
||||||
// accelerate a bit for testing
|
|
||||||
/*
|
|
||||||
mHour += 0.005;
|
|
||||||
|
|
||||||
if (mHour >= 24.f) mHour = 0.f;
|
|
||||||
|
|
||||||
std::cout << "hour " << mHour << std::endl;
|
|
||||||
*/
|
|
||||||
|
|
||||||
mHour = hour;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WeatherManager::setDate(const int day, const int month)
|
|
||||||
{
|
|
||||||
mDay = day;
|
|
||||||
mMonth = month;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int WeatherManager::getWeatherID() const
|
|
||||||
{
|
|
||||||
// Source: http://www.uesp.net/wiki/Tes3Mod:GetCurrentWeather
|
|
||||||
|
|
||||||
if (mCurrentWeather == "clear")
|
|
||||||
return 0;
|
|
||||||
else if (mCurrentWeather == "cloudy")
|
|
||||||
return 1;
|
|
||||||
else if (mCurrentWeather == "foggy")
|
|
||||||
return 2;
|
|
||||||
else if (mCurrentWeather == "overcast")
|
|
||||||
return 3;
|
|
||||||
else if (mCurrentWeather == "rain")
|
|
||||||
return 4;
|
|
||||||
else if (mCurrentWeather == "thunderstorm")
|
|
||||||
return 5;
|
|
||||||
else if (mCurrentWeather == "ashstorm")
|
|
||||||
return 6;
|
|
||||||
else if (mCurrentWeather == "blight")
|
|
||||||
return 7;
|
|
||||||
else if (mCurrentWeather == "snow")
|
|
||||||
return 8;
|
|
||||||
else if (mCurrentWeather == "blizzard")
|
|
||||||
return 9;
|
|
||||||
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WeatherManager::changeWeather(const std::string& region, const unsigned int id)
|
|
||||||
{
|
|
||||||
std::string weather;
|
|
||||||
if (id==0)
|
|
||||||
weather = "clear";
|
|
||||||
else if (id==1)
|
|
||||||
weather = "cloudy";
|
|
||||||
else if (id==2)
|
|
||||||
weather = "foggy";
|
|
||||||
else if (id==3)
|
|
||||||
weather = "overcast";
|
|
||||||
else if (id==4)
|
|
||||||
weather = "rain";
|
|
||||||
else if (id==5)
|
|
||||||
weather = "thunderstorm";
|
|
||||||
else if (id==6)
|
|
||||||
weather = "ashstorm";
|
|
||||||
else if (id==7)
|
|
||||||
weather = "blight";
|
|
||||||
else if (id==8)
|
|
||||||
weather = "snow";
|
|
||||||
else if (id==9)
|
|
||||||
weather = "blizzard";
|
|
||||||
else
|
|
||||||
weather = "clear";
|
|
||||||
|
|
||||||
mRegionOverrides[region] = weather;
|
|
||||||
}
|
|
|
@ -1,272 +0,0 @@
|
||||||
#ifndef GAME_MWWORLD_WEATHER_H
|
|
||||||
#define GAME_MWWORLD_WEATHER_H
|
|
||||||
|
|
||||||
#include <OgreString.h>
|
|
||||||
#include <OgreColourValue.h>
|
|
||||||
|
|
||||||
namespace MWRender
|
|
||||||
{
|
|
||||||
class RenderingManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace MWWorld
|
|
||||||
{
|
|
||||||
class Environment;
|
|
||||||
|
|
||||||
/// Global weather manager properties (according to INI)
|
|
||||||
struct WeatherGlobals
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
[Weather]
|
|
||||||
EnvReduceColor=255,255,255,255
|
|
||||||
LerpCloseColor=037,046,048,255
|
|
||||||
BumpFadeColor=230,239,255,255
|
|
||||||
AlphaReduce=0.35
|
|
||||||
Minimum Time Between Environmental Sounds=1.0
|
|
||||||
Maximum Time Between Environmental Sounds=5.0
|
|
||||||
Sun Glare Fader Max=0.5
|
|
||||||
Sun Glare Fader Angle Max=30.0
|
|
||||||
Sun Glare Fader Color=222,095,039
|
|
||||||
Timescale Clouds=0
|
|
||||||
Precip Gravity=575
|
|
||||||
Hours Between Weather Changes=20
|
|
||||||
Rain Ripples=1
|
|
||||||
Rain Ripple Radius=1024
|
|
||||||
Rain Ripples Per Drop=1
|
|
||||||
Rain Ripple Scale=0.3
|
|
||||||
Rain Ripple Speed=1.0
|
|
||||||
Fog Depth Change Speed=3
|
|
||||||
Sunrise Time=6
|
|
||||||
Sunset Time=18
|
|
||||||
Sunrise Duration=2
|
|
||||||
Sunset Duration=2
|
|
||||||
Sky Pre-Sunrise Time=.5
|
|
||||||
Sky Post-Sunrise Time=1
|
|
||||||
Sky Pre-Sunset Time=1.5
|
|
||||||
Sky Post-Sunset Time=.5
|
|
||||||
Ambient Pre-Sunrise Time=.5
|
|
||||||
Ambient Post-Sunrise Time=2
|
|
||||||
Ambient Pre-Sunset Time=1
|
|
||||||
Ambient Post-Sunset Time=1.25
|
|
||||||
Fog Pre-Sunrise Time=.5
|
|
||||||
Fog Post-Sunrise Time=1
|
|
||||||
Fog Pre-Sunset Time=2
|
|
||||||
Fog Post-Sunset Time=1
|
|
||||||
Sun Pre-Sunrise Time=0
|
|
||||||
Sun Post-Sunrise Time=0
|
|
||||||
Sun Pre-Sunset Time=1
|
|
||||||
Sun Post-Sunset Time=1.25
|
|
||||||
Stars Post-Sunset Start=1
|
|
||||||
Stars Pre-Sunrise Finish=2
|
|
||||||
Stars Fading Duration=2
|
|
||||||
Snow Ripples=0
|
|
||||||
Snow Ripple Radius=1024
|
|
||||||
Snow Ripples Per Flake=1
|
|
||||||
Snow Ripple Scale=0.3
|
|
||||||
Snow Ripple Speed=1.0
|
|
||||||
Snow Gravity Scale=0.1
|
|
||||||
Snow High Kill=700
|
|
||||||
Snow Low Kill=150
|
|
||||||
|
|
||||||
|
|
||||||
[Moons]
|
|
||||||
Masser Size=94
|
|
||||||
Masser Fade In Start=14
|
|
||||||
Masser Fade In Finish=15
|
|
||||||
Masser Fade Out Start=7
|
|
||||||
Masser Fade Out Finish=10
|
|
||||||
Masser Axis Offset=35
|
|
||||||
Masser Speed=.5
|
|
||||||
Masser Daily Increment=1
|
|
||||||
Masser Fade Start Angle=50
|
|
||||||
Masser Fade End Angle=40
|
|
||||||
Masser Moon Shadow Early Fade Angle=0.5
|
|
||||||
Secunda Size=40
|
|
||||||
Secunda Fade In Start=14
|
|
||||||
Secunda Fade In Finish=15
|
|
||||||
Secunda Fade Out Start=7
|
|
||||||
Secunda Fade Out Finish=10
|
|
||||||
Secunda Axis Offset=50
|
|
||||||
Secunda Speed=.6
|
|
||||||
Secunda Daily Increment=1.2
|
|
||||||
Secunda Fade Start Angle=50
|
|
||||||
Secunda Fade End Angle=30
|
|
||||||
Secunda Moon Shadow Early Fade Angle=0.5
|
|
||||||
Script Color=255,20,20
|
|
||||||
*/
|
|
||||||
|
|
||||||
static const float mSunriseTime;
|
|
||||||
static const float mSunsetTime;
|
|
||||||
static const float mSunriseDuration;
|
|
||||||
static const float mSunsetDuration;
|
|
||||||
|
|
||||||
static const float mWeatherUpdateTime;
|
|
||||||
|
|
||||||
// morrowind sets these per-weather, but since they are only used by 'thunderstorm'
|
|
||||||
// weather setting anyway, we can just as well set them globally
|
|
||||||
static const float mThunderFrequency;
|
|
||||||
static const float mThunderThreshold;
|
|
||||||
static const float mThunderSoundDelay;
|
|
||||||
static const std::string mThunderSoundID0;
|
|
||||||
static const std::string mThunderSoundID1;
|
|
||||||
static const std::string mThunderSoundID2;
|
|
||||||
static const std::string mThunderSoundID3;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Defines the actual weather that results from weather setting (see below), time of day and weather transition
|
|
||||||
struct WeatherResult
|
|
||||||
{
|
|
||||||
Ogre::String mCloudTexture;
|
|
||||||
Ogre::String mNextCloudTexture;
|
|
||||||
float mCloudBlendFactor;
|
|
||||||
|
|
||||||
Ogre::ColourValue mFogColor;
|
|
||||||
|
|
||||||
Ogre::ColourValue mAmbientColor;
|
|
||||||
|
|
||||||
Ogre::ColourValue mSkyColor;
|
|
||||||
|
|
||||||
Ogre::ColourValue mSunColor;
|
|
||||||
|
|
||||||
Ogre::ColourValue mSunDiscColor;
|
|
||||||
|
|
||||||
float mFogDepth;
|
|
||||||
|
|
||||||
float mWindSpeed;
|
|
||||||
|
|
||||||
float mCloudSpeed;
|
|
||||||
|
|
||||||
float mCloudOpacity;
|
|
||||||
|
|
||||||
float mGlareView;
|
|
||||||
|
|
||||||
bool mNight; // use night skybox
|
|
||||||
float mNightFade; // fading factor for night skybox
|
|
||||||
|
|
||||||
Ogre::String mAmbientLoopSoundID;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/// Defines a single weather setting (according to INI)
|
|
||||||
struct Weather
|
|
||||||
{
|
|
||||||
Ogre::String mCloudTexture;
|
|
||||||
|
|
||||||
// Sky (atmosphere) colors
|
|
||||||
Ogre::ColourValue mSkySunriseColor,
|
|
||||||
mSkyDayColor,
|
|
||||||
mSkySunsetColor,
|
|
||||||
mSkyNightColor;
|
|
||||||
|
|
||||||
// Fog colors
|
|
||||||
Ogre::ColourValue mFogSunriseColor,
|
|
||||||
mFogDayColor,
|
|
||||||
mFogSunsetColor,
|
|
||||||
mFogNightColor;
|
|
||||||
|
|
||||||
// Ambient lighting colors
|
|
||||||
Ogre::ColourValue mAmbientSunriseColor,
|
|
||||||
mAmbientDayColor,
|
|
||||||
mAmbientSunsetColor,
|
|
||||||
mAmbientNightColor;
|
|
||||||
|
|
||||||
// Sun (directional) lighting colors
|
|
||||||
Ogre::ColourValue mSunSunriseColor,
|
|
||||||
mSunDayColor,
|
|
||||||
mSunSunsetColor,
|
|
||||||
mSunNightColor;
|
|
||||||
|
|
||||||
// Fog depth/density
|
|
||||||
float mLandFogDayDepth,
|
|
||||||
mLandFogNightDepth;
|
|
||||||
|
|
||||||
// Color modulation for the sun itself during sunset (not completely sure)
|
|
||||||
Ogre::ColourValue mSunDiscSunsetColor;
|
|
||||||
|
|
||||||
// Duration of weather transition (in days)
|
|
||||||
float mTransitionDelta;
|
|
||||||
|
|
||||||
// No idea what this one is used for?
|
|
||||||
float mWindSpeed;
|
|
||||||
|
|
||||||
// Cloud animation speed multiplier
|
|
||||||
float mCloudSpeed;
|
|
||||||
|
|
||||||
// Multiplier for clouds transparency
|
|
||||||
float mCloudsMaximumPercent;
|
|
||||||
|
|
||||||
// Value between 0 and 1, defines the strength of the sun glare effect
|
|
||||||
float mGlareView;
|
|
||||||
|
|
||||||
// Sound effect
|
|
||||||
// This is used for Blight, Ashstorm and Blizzard (Bloodmoon)
|
|
||||||
Ogre::String mAmbientLoopSoundID;
|
|
||||||
|
|
||||||
// Rain sound effect
|
|
||||||
Ogre::String mRainLoopSoundID;
|
|
||||||
|
|
||||||
/// \todo disease chance
|
|
||||||
};
|
|
||||||
|
|
||||||
///
|
|
||||||
/// Interface for weather settings
|
|
||||||
///
|
|
||||||
class WeatherManager
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
WeatherManager(MWRender::RenderingManager*, MWWorld::Environment*);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Change the weather in the specified region
|
|
||||||
* @param region that should be changed
|
|
||||||
* @param ID of the weather setting to shift to
|
|
||||||
*/
|
|
||||||
void changeWeather(const std::string& region, const unsigned int id);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Per-frame update
|
|
||||||
* @param duration
|
|
||||||
*/
|
|
||||||
void update(float duration);
|
|
||||||
|
|
||||||
void setHour(const float hour);
|
|
||||||
|
|
||||||
void setDate(const int day, const int month);
|
|
||||||
|
|
||||||
unsigned int getWeatherID() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
float mHour;
|
|
||||||
int mDay, mMonth;
|
|
||||||
|
|
||||||
MWRender::RenderingManager* mRendering;
|
|
||||||
MWWorld::Environment* mEnvironment;
|
|
||||||
|
|
||||||
std::map<Ogre::String, Weather> mWeatherSettings;
|
|
||||||
|
|
||||||
std::map<std::string, std::string> mRegionOverrides;
|
|
||||||
|
|
||||||
Ogre::String mCurrentWeather;
|
|
||||||
Ogre::String mNextWeather;
|
|
||||||
|
|
||||||
std::string mCurrentRegion;
|
|
||||||
|
|
||||||
bool mFirstUpdate;
|
|
||||||
|
|
||||||
float mWeatherUpdateTime;
|
|
||||||
|
|
||||||
float mRemainingTransitionTime;
|
|
||||||
|
|
||||||
float mThunderFlash;
|
|
||||||
float mThunderChance;
|
|
||||||
float mThunderChanceNeeded;
|
|
||||||
float mThunderSoundDelay;
|
|
||||||
|
|
||||||
WeatherResult transition(const float factor);
|
|
||||||
WeatherResult getResult(const Ogre::String& weather);
|
|
||||||
|
|
||||||
void setWeather(const Ogre::String& weather, bool instant=false);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // GAME_MWWORLD_WEATHER_H
|
|
Loading…
Reference in a new issue