Browse Source

Merge branch 'ticket/8'

closes #8 (Requires corresponding MOULSCRIPT ticket 13)
tickets/08/8/2
rarified 4 years ago
parent
commit
5b95b7e9b7
  1. 29
      Sources/Plasma/Apps/plClient/plClient.cpp
  2. 2
      Sources/Plasma/PubUtilLib/plInterp/hsInterp.cpp
  3. 14
      Sources/Plasma/PubUtilLib/plInterp/plAnimTimeConvert.cpp
  4. 6
      Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.cpp
  5. 1
      Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.h

29
Sources/Plasma/Apps/plClient/plClient.cpp

@ -1287,7 +1287,20 @@ void plClient::IProgressMgrCallbackProc(plOperationProgress * progress)
return; return;
fInstance->fMessagePumpProc(); fInstance->fMessagePumpProc();
// HACK HACK HACK HACK!
// Yes, this is the ORIGINAL, EVIL famerate limit from plClient::IDraw (except I bumped it to 60fps)
// As it so happens, this callback is happening in the main resource loading thread
// Without this NASTY ASS HACK, we draw after loading every KO, which starves the loader.
// At some point, a better solution should be found... Like running the loader in a separate thread.
static float lastDrawTime;
static const float kMaxFrameRate = 1.f/60.f;
float currTime = (float) hsTimer::GetSeconds();
if ((currTime - lastDrawTime) > kMaxFrameRate)
{
fInstance->IDraw(); fInstance->IDraw();
lastDrawTime = currTime;
}
} }
//============================================================================ //============================================================================
@ -1847,22 +1860,6 @@ hsBool plClient::IDrawProgress() {
hsBool plClient::IDraw() hsBool plClient::IDraw()
{ {
// Limit framerate
static float lastDrawTime;
static const float kMaxFrameRate = 1.f/30.f;
float currTime = (float) hsTimer::GetSeconds();
if (!fPipeline->IsDebugFlagSet(plPipeDbg::kFlagNVPerfHUD))
{
// If we're using NVPerfHUD to step through draw calls,
// We're going to have a frame delta of zero. In that
// case we need to draw no matter what, and we don't
// care as much about starving other threads because
// we're presumably just debugging a graphics glitch.
if ((currTime - lastDrawTime) < kMaxFrameRate)
return true;
}
lastDrawTime = currTime;
// If we're shutting down, don't attempt to draw. Doing so // If we're shutting down, don't attempt to draw. Doing so
// tends to cause a device reload each frame. // tends to cause a device reload each frame.
if (fDone) if (fDone)

2
Sources/Plasma/PubUtilLib/plInterp/hsInterp.cpp

@ -404,7 +404,7 @@ void hsInterp::GetBoundaryKeyFrames(hsScalar time, UInt32 numKeys, void *keys, U
{ {
hsAssert(numKeys>1, "Must have more than 1 keyframe"); hsAssert(numKeys>1, "Must have more than 1 keyframe");
int k1, k2; int k1, k2;
UInt16 frame = (UInt16)(time * MAX_FRAMES_PER_SEC); float frame = (time * MAX_FRAMES_PER_SEC);
// boundary case, past end // boundary case, past end
if (frame > GetKey(numKeys-1, keys, size)->fFrame) if (frame > GetKey(numKeys-1, keys, size)->fFrame)

14
Sources/Plasma/PubUtilLib/plInterp/plAnimTimeConvert.cpp

@ -557,11 +557,16 @@ hsScalar plAnimTimeConvert::WorldToAnimTime(double wSecs)
{ {
if (secs > fLoopEnd) if (secs > fLoopEnd)
{ {
secs = fmodf(secs - fLoopBegin, fLoopEnd - fLoopBegin) + fLoopBegin; float result = fmodf(secs - fLoopBegin, fLoopEnd - fLoopBegin) + fLoopBegin;
// if fLoopBegin == fLoopEnd == 0, result will not be a number
if (!_isnan(result))
{
secs = result;
wrapped = true; wrapped = true;
} }
} }
} }
}
else else
{ {
if (IGetLatestState()->fStartAnimTime < fLoopBegin) if (IGetLatestState()->fStartAnimTime < fLoopBegin)
@ -576,11 +581,16 @@ hsScalar plAnimTimeConvert::WorldToAnimTime(double wSecs)
{ {
if (secs < fLoopBegin) if (secs < fLoopBegin)
{ {
secs = fLoopEnd - fmodf(fLoopEnd - secs, fLoopEnd - fLoopBegin); float result = fLoopEnd - fmodf(fLoopEnd - secs, fLoopEnd - fLoopBegin);
// if fLoopBegin == fLoopEnd == 0, result will not be a number
if (!_isnan(result))
{
secs = result;
wrapped = true; wrapped = true;
} }
} }
} }
}
if (fFlags & kWrap) if (fFlags & kWrap)
{ {

6
Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.cpp

@ -626,7 +626,7 @@ void plSimulationMgr::Advance(float delSecs)
{ {
if (fExtraProfile) if (fExtraProfile)
Log("Step clamped from %f to limit of %f", fAccumulator, fMaxDelta); Log("Step clamped from %f to limit of %f", fAccumulator, fMaxDelta);
fAccumulator = fMaxDelta; fAccumulator = kDefaultMaxDelta;
} }
++fStepCount; ++fStepCount;
@ -783,22 +783,18 @@ void plSimulationMgr::ISendUpdates()
// RESOLUTION & TIMEOUT PARAMETERS // RESOLUTION & TIMEOUT PARAMETERS
// //
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
void plSimulationMgr::SetMaxDelta(float maxDelta) void plSimulationMgr::SetMaxDelta(float maxDelta)
{ {
fMaxDelta = maxDelta; fMaxDelta = maxDelta;
} }
float plSimulationMgr::GetMaxDelta() const float plSimulationMgr::GetMaxDelta() const
{ {
return fMaxDelta; return fMaxDelta;
} }
void plSimulationMgr::SetStepsPerSecond(int stepsPerSecond) void plSimulationMgr::SetStepsPerSecond(int stepsPerSecond)
{ {
fStepSize = 1.0f / (float)stepsPerSecond; fStepSize = 1.0f / (float)stepsPerSecond;
} }
int plSimulationMgr::GetStepsPerSecond() int plSimulationMgr::GetStepsPerSecond()
{ {
return (int)((1.0 / fStepSize) + 0.5f); // round to nearest int return (int)((1.0 / fStepSize) + 0.5f); // round to nearest int

1
Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.h

@ -159,6 +159,7 @@ protected:
float fMaxDelta; float fMaxDelta;
float fStepSize; float fStepSize;
float fAccumulator; float fAccumulator;
UInt32 fStepCount; UInt32 fStepCount;

Loading…
Cancel
Save