Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

175 lines
4.2 KiB
C++

//===========================================================================//
// File: DeceleratorOf.hpp
// Project: MechWarrior 4
// Contents:
// AngleAxis class for animation. This is just an unlimited rotation
// quaternion
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 06/02/99 JSE Initial coding,
//---------------------------------------------------------------------------//
// Copyright (C) 1998, Fasa Interactive, Inc.
// All Rights reserved worldwide
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL
//===========================================================================//
#pragma once
namespace MechWarrior4 {
//##########################################################################
//######################### DeceleratorOf ###############################
//##########################################################################
template <class T> class DeceleratorOf
{
public:
T motionLimit;
T motionDecceleration;
T returnForce;
T outwardForce;
T homePosition;
T currentPosition;
T currentSpeed;
bool initialized;
DeceleratorOf()
{
initialized = false;
}
DeceleratorOf(T motion_limit, T motion_acceleration, T return_speed, T home_position, T outward_force)
{
Initialize(motion_limit, motion_acceleration, return_speed, home_position, outward_force);
};
~DeceleratorOf(){};
void Initialize(T motion_limit, T motion_decceleration, T return_force, T home_position, T outward_force)
{
initialized = true;
motionLimit = motion_limit;
motionDecceleration = motion_decceleration;
returnForce = return_force;
homePosition = home_position;
currentPosition = homePosition;
outwardForce = outward_force;
for (int i = 0; i < T::GetMemberCount(); i++)
{
currentSpeed[i] = 0.0f;
}
};
// 0 to 1, 1 being full stretch of the spring.
void SetInitialSpeed(T how_hard)
{
Verify(initialized);
T new_speed;
for (int i = 0; i < T::GetMemberCount(); i++)
{
new_speed[i] = outwardForce[i] * how_hard[i];
}
for (i = 0; i < T::GetMemberCount(); i++)
{
currentSpeed[i] = new_speed[i] + currentSpeed[i];
}
}
void StopAndGoHome(void)
{
for (int i = 0; i < T::GetMemberCount(); i++)
{
if (currentSpeed[i] > 0.0f)
{
currentSpeed[i] = returnForce[i];
}
}
}
void Reset(void)
{
for (int i = 0; i < T::GetMemberCount(); i++)
{
currentSpeed[i] = 0;
}
currentPosition = homePosition;
}
T GetCurrentPosition(void)
{
return currentPosition;
};
void AdvanceTime(Stuff::Scalar time_slice)
{
Verify(initialized);
for (int i = 0; i < T::GetMemberCount(); i++)
{
if (currentSpeed[i] > 0.0f)
{
currentSpeed[i] -= (motionDecceleration[i] * time_slice);
Min_Clamp(currentSpeed[i], 0.0f);
currentPosition[i] += (currentSpeed[i] * time_slice);
Max_Clamp(currentPosition[i], motionLimit[i]);
if (currentPosition[i] >= motionLimit[i])
{
currentPosition[i] = motionLimit[i];
currentSpeed[i] = 0.0f;
}
}
else if (currentSpeed[i] < 0.0f)
{
currentSpeed[i] += (motionDecceleration[i] * time_slice);
Max_Clamp(currentSpeed[i], 0.0f);
currentPosition[i] += (currentSpeed[i] * time_slice);
if (currentPosition[i] <= -motionLimit[i])
{
currentPosition[i] = -motionLimit[i];
currentSpeed[i] = 0.0f;
}
}
if (currentSpeed[i] == 0.0f)
{
if (currentPosition[i] > homePosition[i])
{
currentPosition[i] -= returnForce[i] * time_slice;
Min_Clamp(currentPosition[i], homePosition[i]);
}
else if (currentPosition[i] < homePosition[i])
{
currentPosition[i] += returnForce[i] * time_slice;
Max_Clamp(currentPosition[i], homePosition[i]);
}
}
}
}
};
}