Stop snowing inside tunnels
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@7767 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
a50e0fe660
commit
f7f01c144a
@ -24,6 +24,7 @@
|
|||||||
#include "graphics/particle_kind.hpp"
|
#include "graphics/particle_kind.hpp"
|
||||||
#include "graphics/irr_driver.hpp"
|
#include "graphics/irr_driver.hpp"
|
||||||
#include "io/file_manager.hpp"
|
#include "io/file_manager.hpp"
|
||||||
|
#include "tracks/track.hpp"
|
||||||
#include "utils/constants.hpp"
|
#include "utils/constants.hpp"
|
||||||
|
|
||||||
class FadeAwayAffector : public scene::IParticleAffector
|
class FadeAwayAffector : public scene::IParticleAffector
|
||||||
@ -41,7 +42,9 @@ public:
|
|||||||
m_end_fading = end;
|
m_end_fading = end;
|
||||||
assert(m_end_fading >= m_start_fading);
|
assert(m_end_fading >= m_start_fading);
|
||||||
} // FadeAwayAffector
|
} // FadeAwayAffector
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
virtual void affect(u32 now, scene::SParticle* particlearray, u32 count)
|
virtual void affect(u32 now, scene::SParticle* particlearray, u32 count)
|
||||||
{
|
{
|
||||||
scene::ICameraSceneNode* curr_cam =
|
scene::ICameraSceneNode* curr_cam =
|
||||||
@ -76,6 +79,7 @@ public:
|
|||||||
} // affect
|
} // affect
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
virtual scene::E_PARTICLE_AFFECTOR_TYPE getType() const
|
virtual scene::E_PARTICLE_AFFECTOR_TYPE getType() const
|
||||||
{
|
{
|
||||||
// FIXME: this method seems to make sense only for built-in affectors
|
// FIXME: this method seems to make sense only for built-in affectors
|
||||||
@ -84,7 +88,74 @@ public:
|
|||||||
|
|
||||||
}; // FadeAwayAffector
|
}; // FadeAwayAffector
|
||||||
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
|
class HeightMapCollisionAffector : public scene::IParticleAffector
|
||||||
|
{
|
||||||
|
std::vector< std::vector<float> > m_height_map;
|
||||||
|
Track* m_track;
|
||||||
|
|
||||||
|
public:
|
||||||
|
HeightMapCollisionAffector(Track* t) : m_height_map(t->buildHeightMap())
|
||||||
|
{
|
||||||
|
m_track = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void affect(u32 now, scene::SParticle* particlearray, u32 count)
|
||||||
|
{
|
||||||
|
const Vec3* aabb_min;
|
||||||
|
const Vec3* aabb_max;
|
||||||
|
m_track->getAABB(&aabb_min, &aabb_max);
|
||||||
|
float track_x = aabb_min->getX();
|
||||||
|
float track_z = aabb_min->getZ();
|
||||||
|
const float track_x_len = aabb_max->getX() - aabb_min->getX();
|
||||||
|
const float track_z_len = aabb_max->getZ() - aabb_min->getZ();
|
||||||
|
|
||||||
|
for (unsigned int n=0; n<count; n++)
|
||||||
|
{
|
||||||
|
scene::SParticle& curr = particlearray[n];
|
||||||
|
const int i = (curr.pos.X - track_x)/track_x_len*m_height_map.size();
|
||||||
|
const int j = (curr.pos.Z - track_z)/track_z_len*m_height_map.size();
|
||||||
|
assert(i < (int)m_height_map.size());
|
||||||
|
assert(j < (int)m_height_map.size());
|
||||||
|
assert(i >= 0);
|
||||||
|
assert(j >= 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
core::vector3df lp = curr.pos;
|
||||||
|
core::vector3df lp2 = curr.pos;
|
||||||
|
lp2.Y = m_height_map[i][j] + 0.02f;
|
||||||
|
|
||||||
|
irr_driver->getVideoDriver()->draw3DLine(lp, lp2, video::SColor(255,255,0,0));
|
||||||
|
core::vector3df lp3 = lp2;
|
||||||
|
lp3.X += 0.1f;
|
||||||
|
lp3.Y += 0.02f;
|
||||||
|
lp3.Z += 0.1f;
|
||||||
|
lp2.X -= 0.1f;
|
||||||
|
lp2.Y -= 0.02f;
|
||||||
|
lp2.Z -= 0.1f;
|
||||||
|
irr_driver->getVideoDriver()->draw3DBox(core::aabbox3d< f32 >(lp2, lp3), video::SColor(255,255,0,0));
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (curr.pos.Y < m_height_map[i][j])
|
||||||
|
{
|
||||||
|
//curr.color = video::SColor(255,255,0,0);
|
||||||
|
curr.endTime = curr.startTime; // destroy particle
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual scene::E_PARTICLE_AFFECTOR_TYPE getType() const
|
||||||
|
{
|
||||||
|
// FIXME: this method seems to make sense only for built-in affectors
|
||||||
|
return scene::EPAT_FADE_OUT;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
ParticleEmitter::ParticleEmitter(const ParticleKind* type,
|
ParticleEmitter::ParticleEmitter(const ParticleKind* type,
|
||||||
const Vec3 &position,
|
const Vec3 &position,
|
||||||
scene::ISceneNode* parent)
|
scene::ISceneNode* parent)
|
||||||
@ -297,3 +368,12 @@ void ParticleEmitter::setParticleType(const ParticleKind* type)
|
|||||||
faa->drop();
|
faa->drop();
|
||||||
}
|
}
|
||||||
} // setParticleType
|
} // setParticleType
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void ParticleEmitter::addHeightMapAffector(Track* t)
|
||||||
|
{
|
||||||
|
HeightMapCollisionAffector* hmca = new HeightMapCollisionAffector(t);
|
||||||
|
m_node->addAffector(hmca);
|
||||||
|
hmca->drop();
|
||||||
|
}
|
||||||
|
@ -28,6 +28,7 @@ using namespace irr;
|
|||||||
|
|
||||||
class Material;
|
class Material;
|
||||||
class ParticleKind;
|
class ParticleKind;
|
||||||
|
class Track;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief manages smoke particle effects
|
* \brief manages smoke particle effects
|
||||||
@ -68,6 +69,8 @@ public:
|
|||||||
void setParticleType(const ParticleKind* p);
|
void setParticleType(const ParticleKind* p);
|
||||||
|
|
||||||
scene::IParticleSystemSceneNode* getNode() { return m_node; }
|
scene::IParticleSystemSceneNode* getNode() { return m_node; }
|
||||||
|
|
||||||
|
void addHeightMapAffector(Track* t);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1034,6 +1034,7 @@ void Track::loadTrackModel(World* parent, unsigned int mode_id)
|
|||||||
|
|
||||||
// FIXME: don't hardcode height We need to set the emission area in blender
|
// FIXME: don't hardcode height We need to set the emission area in blender
|
||||||
m_sky_particles_emitter = new ParticleEmitter(m_sky_particles, core::vector3df(x, m_aabb_max.getY()*0.75f, z));
|
m_sky_particles_emitter = new ParticleEmitter(m_sky_particles, core::vector3df(x, m_aabb_max.getY()*0.75f, z));
|
||||||
|
m_sky_particles_emitter->addHeightMapAffector(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only print warning if not in battle mode, since battle tracks don't have
|
// Only print warning if not in battle mode, since battle tracks don't have
|
||||||
@ -1172,3 +1173,73 @@ bool Track::setTerrainHeight(Vec3 *pos) const
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} // setTerrainHeight
|
} // setTerrainHeight
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
std::vector< std::vector<float> > Track::buildHeightMap()
|
||||||
|
{
|
||||||
|
const int HEIGHT_MAP_RESOLUTION = 128;
|
||||||
|
|
||||||
|
std::vector< std::vector<float> > out(HEIGHT_MAP_RESOLUTION);
|
||||||
|
|
||||||
|
float x = m_aabb_min.getX();
|
||||||
|
const float x_len = m_aabb_max.getX() - m_aabb_min.getX();
|
||||||
|
const float z_len = m_aabb_max.getZ() - m_aabb_min.getZ();
|
||||||
|
|
||||||
|
const float x_step = x_len/HEIGHT_MAP_RESOLUTION;
|
||||||
|
const float z_step = z_len/HEIGHT_MAP_RESOLUTION;
|
||||||
|
|
||||||
|
btVector3 hitpoint;
|
||||||
|
const Material* material;
|
||||||
|
btVector3 normal;
|
||||||
|
|
||||||
|
for (int i=0; i<HEIGHT_MAP_RESOLUTION; i++)
|
||||||
|
{
|
||||||
|
out[i].resize(HEIGHT_MAP_RESOLUTION);
|
||||||
|
float z = m_aabb_min.getZ();
|
||||||
|
|
||||||
|
for (int j=0; j<HEIGHT_MAP_RESOLUTION; j++)
|
||||||
|
{
|
||||||
|
btVector3 pos(x, 100.0f, z);
|
||||||
|
btVector3 to = pos;
|
||||||
|
to.setY(-100000.f);
|
||||||
|
|
||||||
|
m_track_mesh->castRay(pos, to, &hitpoint, &material, &normal);
|
||||||
|
z += z_step;
|
||||||
|
|
||||||
|
out[i][j] = hitpoint.getY();
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (out[i][j] < -50)
|
||||||
|
{
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
else if (out[i][j] < -25)
|
||||||
|
{
|
||||||
|
printf("`");
|
||||||
|
}
|
||||||
|
else if (out[i][j] < 0)
|
||||||
|
{
|
||||||
|
printf("-");
|
||||||
|
}
|
||||||
|
else if (out[i][j] < 25)
|
||||||
|
{
|
||||||
|
printf(":");
|
||||||
|
}
|
||||||
|
else if (out[i][j] < 50)
|
||||||
|
{
|
||||||
|
printf("!");
|
||||||
|
}
|
||||||
|
else if (out[i][j] < 100)
|
||||||
|
{
|
||||||
|
printf("#");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
//printf("\n");
|
||||||
|
x += x_step;
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
@ -316,6 +316,8 @@ public:
|
|||||||
|
|
||||||
WeatherType getWeatherType () const { return m_weather_type; }
|
WeatherType getWeatherType () const { return m_weather_type; }
|
||||||
|
|
||||||
|
std::vector< std::vector<float> > buildHeightMap();
|
||||||
|
|
||||||
}; // class Track
|
}; // class Track
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user