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:
parent
ad73e60d4c
commit
dbae2b0854
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user