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.
bool close_to_ground = 2.0*(getXYZ().getY() - getHoT())
< m_current_max_height;
Vec3 offset(0, close_to_ground ? 1.0f : 0.0f, 0);
Flyable::setPositionOffset(offset);
Vec3 vertical_offset(0, close_to_ground ? 1.0f : 0.0f, 0);
Flyable::setPositionOffset(vertical_offset);
if(Flyable::updateAndDelete(dt))
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
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)
new_y = terrain_height;
}
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);
@ -499,17 +501,22 @@ float RubberBall::updateHeight()
* 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
* 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
* 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();
Vec3 to(getXYZ());
to.setY(10000.0f);
Vec3 hit_point;
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;
} // getMaxTerrainHeight
@ -536,6 +543,8 @@ void RubberBall::checkDistanceToTarget()
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;
return;
}

View File

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