Fixed rubber balls sometimes disappearing under the track.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@9949 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk 2011-10-06 22:19:44 +00:00
parent ad73e60d4c
commit dbae2b0854
2 changed files with 16 additions and 7 deletions

View File

@ -290,8 +290,8 @@ bool RubberBall::updateAndDelete(float dt)
// terrain is less than half the current maximum height. // terrain is less than half the current maximum height.
bool close_to_ground = 2.0*(getXYZ().getY() - getHoT()) bool close_to_ground = 2.0*(getXYZ().getY() - getHoT())
< m_current_max_height; < m_current_max_height;
Vec3 offset(0, close_to_ground ? 1.0f : 0.0f, 0); Vec3 vertical_offset(0, close_to_ground ? 1.0f : 0.0f, 0);
Flyable::setPositionOffset(offset); Flyable::setPositionOffset(vertical_offset);
if(Flyable::updateAndDelete(dt)) if(Flyable::updateAndDelete(dt))
return true; return true;
@ -328,13 +328,15 @@ bool RubberBall::updateAndDelete(float dt)
// No need to check for terrain height if the ball is low to the ground // No need to check for terrain height if the ball is low to the ground
if(height > 0.5f) if(height > 0.5f)
{ {
float terrain_height = getMaxTerrainHeight()-m_extend.getY(); float terrain_height = getMaxTerrainHeight(vertical_offset)
- m_extend.getY();
if(new_y>terrain_height) if(new_y>terrain_height)
new_y = terrain_height; new_y = terrain_height;
} }
if(UserConfigParams::logFlyable()) if(UserConfigParams::logFlyable())
printf("newy2 %f gmth %f\n", new_y,getMaxTerrainHeight()); printf("newy2 %f gmth %f\n", new_y,
getMaxTerrainHeight(vertical_offset));
next_xyz.setY(new_y); next_xyz.setY(new_y);
@ -499,17 +501,22 @@ float RubberBall::updateHeight()
* generall the height is arbitrary (a skybox is not part of the physics and * generall the height is arbitrary (a skybox is not part of the physics and
* will therefore not be detected), it is important that a rubber ball does * will therefore not be detected), it is important that a rubber ball does
* not end up on top of a tunnel. * not end up on top of a tunnel.
* \param vertical_offset A vertical offset which is added to the current
* position of the kart in order to avoid tunneling effects (it could
* happen that the raycast down find the track since it uses the
* vertical offset, while the raycast up would hit under the track
* if the vertical offset is not used).
* \returns The height (Y coordinate) of the next terrain element found by * \returns The height (Y coordinate) of the next terrain element found by
* a raycast up. If no terrain is found, it returns 99990 * a raycast up. If no terrain is found, it returns 99990
*/ */
float RubberBall::getMaxTerrainHeight() const float RubberBall::getMaxTerrainHeight(const Vec3 &vertical_offset) const
{ {
const TriangleMesh &tm = World::getWorld()->getTrack()->getTriangleMesh(); const TriangleMesh &tm = World::getWorld()->getTrack()->getTriangleMesh();
Vec3 to(getXYZ()); Vec3 to(getXYZ());
to.setY(10000.0f); to.setY(10000.0f);
Vec3 hit_point; Vec3 hit_point;
const Material *material; const Material *material;
tm.castRay(getXYZ(), to, &hit_point, &material); tm.castRay(getXYZ()+vertical_offset, to, &hit_point, &material);
return (material) ? hit_point.getY() : 99999.f; return (material) ? hit_point.getY() : 99999.f;
} // getMaxTerrainHeight } // getMaxTerrainHeight
@ -536,6 +543,8 @@ void RubberBall::checkDistanceToTarget()
if(diff < m_st_target_distance) if(diff < m_st_target_distance)
{ {
printf("target-height %f ball-height %f\n",
m_target->getXYZ().getY(), getXYZ().getY());
m_aiming_at_target = true; m_aiming_at_target = true;
return; return;
} }

View File

@ -149,7 +149,7 @@ private:
void interpolate(Vec3 *next_xyz, float dt); void interpolate(Vec3 *next_xyz, float dt);
void moveTowardsTarget(Vec3 *next_xyz, float dt); void moveTowardsTarget(Vec3 *next_xyz, float dt);
void initializeControlPoints(const Vec3 &xyz); void initializeControlPoints(const Vec3 &xyz);
float getMaxTerrainHeight() const; float getMaxTerrainHeight(const Vec3 &vertical_offset) const;
public: public:
RubberBall (Kart* kart, Track* track); RubberBall (Kart* kart, Track* track);
virtual ~RubberBall(); virtual ~RubberBall();