Add tricks I hope help dramatically improve the synchronisation between the STK physics and irlricht animations in cutscene

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@11633 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2012-09-28 01:52:09 +00:00
parent 5b623927d8
commit 48d480a67d
4 changed files with 28 additions and 2 deletions

View File

@ -83,6 +83,8 @@ void AnimationBase::reset()
{
curr->reset();
}
TrackObject::reset();
} // reset
// ----------------------------------------------------------------------------

View File

@ -47,6 +47,7 @@
*/
CutsceneWorld::CutsceneWorld() : World()
{
m_time_at_second_reset = 0.0f;
m_aborted = false;
WorldStatus::setClockMode(CLOCK_NONE);
m_use_highscores = false;
@ -59,6 +60,7 @@ CutsceneWorld::CutsceneWorld() : World()
*/
void CutsceneWorld::init()
{
m_second_reset = false;
World::init();
dynamic_cast<CutsceneGUI*>(m_race_gui)->setFadeLevel(1.0f);
@ -189,6 +191,8 @@ void CutsceneWorld::update(float dt)
if (m_time < 0.0001f)
{
//printf("INITIAL TIME for CutsceneWorld\n");
PtrVector<TrackObject>& objects = m_track->getTrackObjectManager()->getObjects();
TrackObject* curr;
for_in(curr, objects)
@ -196,7 +200,20 @@ void CutsceneWorld::update(float dt)
curr->reset();
}
}
else if (m_second_reset)
{
m_second_reset = false;
PtrVector<TrackObject>& objects = m_track->getTrackObjectManager()->getObjects();
TrackObject* curr;
for_in(curr, objects)
{
curr->reset();
}
m_time_at_second_reset = m_time;
}
m_time += dt;
if (m_time < 2.0f)
@ -212,7 +229,7 @@ void CutsceneWorld::update(float dt)
dynamic_cast<CutsceneGUI*>(m_race_gui)->setFadeLevel(0.0f);
}
float currFrame = m_time * 25.0f; // We assume 25 FPS
float currFrame = (m_time - m_time_at_second_reset)* 25.0f - 1.0f; // We assume 25 FPS. Irrlicht starts at frame 0.
//printf("Estimated current frame : %f\n", currFrame);

View File

@ -45,6 +45,12 @@ class CutsceneWorld : public World
float m_duration;
bool m_aborted;
/** monkey tricks to get the animations in sync with irrlicht. we reset the time
* after all is loaded and it's running withotu delays
*/
bool m_second_reset;
float m_time_at_second_reset;
void abortCutscene()
{
if (m_time < m_duration - 2.0f) m_duration = m_time + 2.0f;

View File

@ -242,6 +242,7 @@ TrackObject::TrackObject(const XMLNode &xml_node)
scene::IAnimatedMeshSceneNode *node =
irr_driver->addAnimatedMesh((scene::IAnimatedMesh*)m_mesh);
m_node = node;
node->setName(model_name.c_str());
m_frame_start = node->getStartFrame();
xml_node.get("frame-start", &m_frame_start);