Forced LOD=0 when a kart finishes a race, this way end animations
are shown even when the end camera is far away from the kart. git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@12078 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
0f6757be65
commit
604f61d1b4
@ -33,7 +33,7 @@
|
|||||||
*/
|
*/
|
||||||
LODNode::LODNode(std::string group_name, scene::ISceneNode* parent,
|
LODNode::LODNode(std::string group_name, scene::ISceneNode* parent,
|
||||||
scene::ISceneManager* mgr, s32 id)
|
scene::ISceneManager* mgr, s32 id)
|
||||||
: ISceneNode(parent, mgr, id) //: IDummyTransformationSceneNode(parent, mgr, id)
|
: ISceneNode(parent, mgr, id)
|
||||||
{
|
{
|
||||||
assert(mgr != NULL);
|
assert(mgr != NULL);
|
||||||
assert(parent != NULL);
|
assert(parent != NULL);
|
||||||
@ -47,6 +47,8 @@ LODNode::LODNode(std::string group_name, scene::ISceneNode* parent,
|
|||||||
// so that only the reference from the parent is active, causing this
|
// so that only the reference from the parent is active, causing this
|
||||||
// node to be deleted when it is removed from the parent.
|
// node to be deleted when it is removed from the parent.
|
||||||
drop();
|
drop();
|
||||||
|
|
||||||
|
m_forced_lod = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LODNode::~LODNode()
|
LODNode::~LODNode()
|
||||||
@ -63,6 +65,10 @@ void LODNode::render()
|
|||||||
*/
|
*/
|
||||||
int LODNode::getLevel()
|
int LODNode::getLevel()
|
||||||
{
|
{
|
||||||
|
// If a level is forced, use it
|
||||||
|
if(m_forced_lod>-1)
|
||||||
|
return m_forced_lod;
|
||||||
|
|
||||||
// TODO: optimize this, there is no need to check every frame
|
// TODO: optimize this, there is no need to check every frame
|
||||||
scene::ICameraSceneNode* curr_cam = irr_driver->getSceneManager()->getActiveCamera();
|
scene::ICameraSceneNode* curr_cam = irr_driver->getSceneManager()->getActiveCamera();
|
||||||
|
|
||||||
@ -78,7 +84,16 @@ int LODNode::getLevel()
|
|||||||
return -1;
|
return -1;
|
||||||
} // getLevel
|
} // getLevel
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
/** Forces the level of detail to be n. If n>number of levels, the most
|
||||||
|
* detailed level is used. This is used to disable LOD when the end
|
||||||
|
* camera is activated, since it zooms in to the kart. */
|
||||||
|
void LODNode::forceLevelOfDetail(int n)
|
||||||
|
{
|
||||||
|
m_forced_lod = (n >=(int)m_detail.size()) ? m_detail.size()-1 : n;
|
||||||
|
} // forceLevelOfDetail
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
void LODNode::OnAnimate(u32 timeMs)
|
void LODNode::OnAnimate(u32 timeMs)
|
||||||
{
|
{
|
||||||
if (isVisible())
|
if (isVisible())
|
||||||
|
@ -57,6 +57,10 @@ private:
|
|||||||
|
|
||||||
std::string m_group_name;
|
std::string m_group_name;
|
||||||
|
|
||||||
|
/** The normal level of detail can be overwritten. If
|
||||||
|
* m_forced_lod is >=0, only this level is be used. */
|
||||||
|
int m_forced_lod;
|
||||||
|
|
||||||
int getLevel();
|
int getLevel();
|
||||||
|
|
||||||
enum PreviousVisibility
|
enum PreviousVisibility
|
||||||
@ -95,6 +99,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
void add(int level, scene::ISceneNode* node, bool reparent);
|
void add(int level, scene::ISceneNode* node, bool reparent);
|
||||||
|
|
||||||
|
void forceLevelOfDetail(int n);
|
||||||
|
|
||||||
/** Get the highest level of detail node */
|
/** Get the highest level of detail node */
|
||||||
scene::ISceneNode* getFirstNode()
|
scene::ISceneNode* getFirstNode()
|
||||||
{
|
{
|
||||||
@ -139,6 +145,7 @@ public:
|
|||||||
m_nodes[n]->setScale(scale);
|
m_nodes[n]->setScale(scale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -769,6 +769,7 @@ void Kart::finishedRace(float time)
|
|||||||
m_finished_race = true;
|
m_finished_race = true;
|
||||||
m_finish_time = time;
|
m_finish_time = time;
|
||||||
m_controller->finishedRace(time);
|
m_controller->finishedRace(time);
|
||||||
|
m_kart_model->finishedRace();
|
||||||
race_manager->kartFinishedRace(this, time);
|
race_manager->kartFinishedRace(this, time);
|
||||||
|
|
||||||
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_NORMAL_RACE ||
|
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_NORMAL_RACE ||
|
||||||
|
@ -417,8 +417,21 @@ void KartModel::reset()
|
|||||||
|
|
||||||
// Stop any animations currently being played.
|
// Stop any animations currently being played.
|
||||||
setAnimation(KartModel::AF_DEFAULT);
|
setAnimation(KartModel::AF_DEFAULT);
|
||||||
|
// Don't force any LOD
|
||||||
|
((LODNode*)m_kart->getNode())->forceLevelOfDetail(-1);
|
||||||
} // reset
|
} // reset
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
/** Called when the kart finished the race. It will force the highest LOD
|
||||||
|
* for the kart, since otherwise the end camera can be far away (due to
|
||||||
|
* zooming) and show non-animated karts.
|
||||||
|
*/
|
||||||
|
void KartModel::finishedRace()
|
||||||
|
{
|
||||||
|
// Force the animated model, independent of actual camera distance.
|
||||||
|
((LODNode*)m_kart->getNode())->forceLevelOfDetail(0);
|
||||||
|
} // finishedRace
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
/** Enables- or disables the end animation.
|
/** Enables- or disables the end animation.
|
||||||
* \param type The type of animation to play.
|
* \param type The type of animation to play.
|
||||||
|
@ -148,6 +148,7 @@ public:
|
|||||||
const float suspension[4]);
|
const float suspension[4]);
|
||||||
void setDefaultPhysicsPosition(const Vec3 ¢er_shift,
|
void setDefaultPhysicsPosition(const Vec3 ¢er_shift,
|
||||||
float wheel_radius);
|
float wheel_radius);
|
||||||
|
void finishedRace();
|
||||||
scene::ISceneNode*
|
scene::ISceneNode*
|
||||||
attachModel(bool animatedModels);
|
attachModel(bool animatedModels);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user