Allow skid marks to be skinned (features requested by samuncle, he says he will have a nice new texture coming soon)
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14241 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
d8cfc75557
commit
a6a336c94a
@ -37,10 +37,19 @@ SkidMarks::SkidMarks(const AbstractKart& kart, float width) : m_kart(kart)
|
|||||||
{
|
{
|
||||||
m_width = width;
|
m_width = width;
|
||||||
m_material = new video::SMaterial();
|
m_material = new video::SMaterial();
|
||||||
m_material->MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
|
m_material->MaterialType = video::EMT_ONETEXTURE_BLEND;
|
||||||
|
m_material->MaterialTypeParam =
|
||||||
|
pack_textureBlendFunc(video::EBF_SRC_ALPHA,
|
||||||
|
video::EBF_ONE_MINUS_SRC_ALPHA,
|
||||||
|
video::EMFN_MODULATE_1X,
|
||||||
|
video::EAS_TEXTURE | video::EAS_VERTEX_COLOR);
|
||||||
m_material->AmbientColor = video::SColor(128, 0, 0, 0);
|
m_material->AmbientColor = video::SColor(128, 0, 0, 0);
|
||||||
m_material->DiffuseColor = video::SColor(128, 16, 16, 16);
|
m_material->DiffuseColor = video::SColor(128, 16, 16, 16);
|
||||||
|
//m_material->AmbientColor = video::SColor(255, 255, 255, 255);
|
||||||
|
//m_material->DiffuseColor = video::SColor(255, 255, 255, 255);
|
||||||
|
m_material->setFlag(video::EMF_ANISOTROPIC_FILTER, true);
|
||||||
m_material->Shininess = 0;
|
m_material->Shininess = 0;
|
||||||
|
m_material->TextureLayer[0].Texture = irr_driver->getTexture("skidmarks.png");
|
||||||
m_skid_marking = false;
|
m_skid_marking = false;
|
||||||
m_current = -1;
|
m_current = -1;
|
||||||
} // SkidMark
|
} // SkidMark
|
||||||
@ -133,10 +142,20 @@ void SkidMarks::update(float dt, bool force_skid_marks,
|
|||||||
delta.normalize();
|
delta.normalize();
|
||||||
delta *= m_width;
|
delta *= m_width;
|
||||||
|
|
||||||
|
float distance = 0.0f;
|
||||||
|
if (m_current > 0)
|
||||||
|
{
|
||||||
|
Vec3 previousPoint = m_left[m_current - 1]->getMiddlePoint();
|
||||||
|
Vec3 newPoint = (raycast_left.m_contactPointWS + raycast_right.m_contactPointWS)/2;
|
||||||
|
distance = m_left[m_current - 1]->getDistance() + (newPoint - previousPoint).length();
|
||||||
|
}
|
||||||
|
|
||||||
m_left [m_current]->add(raycast_left.m_contactPointWS,
|
m_left [m_current]->add(raycast_left.m_contactPointWS,
|
||||||
raycast_left.m_contactPointWS + delta);
|
raycast_left.m_contactPointWS + delta,
|
||||||
|
distance);
|
||||||
m_right[m_current]->add(raycast_right.m_contactPointWS-delta,
|
m_right[m_current]->add(raycast_right.m_contactPointWS-delta,
|
||||||
raycast_right.m_contactPointWS);
|
raycast_right.m_contactPointWS,
|
||||||
|
distance);
|
||||||
// Adjust the boundary box of the mesh to include the
|
// Adjust the boundary box of the mesh to include the
|
||||||
// adjusted aabb of its buffers.
|
// adjusted aabb of its buffers.
|
||||||
core::aabbox3df aabb=m_nodes[m_current]->getMesh()
|
core::aabbox3df aabb=m_nodes[m_current]->getMesh()
|
||||||
@ -163,14 +182,14 @@ void SkidMarks::update(float dt, bool force_skid_marks,
|
|||||||
SkidMarkQuads *smq_left =
|
SkidMarkQuads *smq_left =
|
||||||
new SkidMarkQuads(raycast_left.m_contactPointWS,
|
new SkidMarkQuads(raycast_left.m_contactPointWS,
|
||||||
raycast_left.m_contactPointWS + delta,
|
raycast_left.m_contactPointWS + delta,
|
||||||
m_material, m_avoid_z_fighting, custom_color);
|
m_material, 0.0f, m_avoid_z_fighting, custom_color);
|
||||||
scene::SMesh *new_mesh = new scene::SMesh();
|
scene::SMesh *new_mesh = new scene::SMesh();
|
||||||
new_mesh->addMeshBuffer(smq_left);
|
new_mesh->addMeshBuffer(smq_left);
|
||||||
|
|
||||||
SkidMarkQuads *smq_right =
|
SkidMarkQuads *smq_right =
|
||||||
new SkidMarkQuads(raycast_right.m_contactPointWS - delta,
|
new SkidMarkQuads(raycast_right.m_contactPointWS - delta,
|
||||||
raycast_right.m_contactPointWS,
|
raycast_right.m_contactPointWS,
|
||||||
m_material, m_avoid_z_fighting, custom_color);
|
m_material, 0.0f, m_avoid_z_fighting, custom_color);
|
||||||
new_mesh->addMeshBuffer(smq_right);
|
new_mesh->addMeshBuffer(smq_right);
|
||||||
scene::IMeshSceneNode *new_node = irr_driver->addMesh(new_mesh);
|
scene::IMeshSceneNode *new_node = irr_driver->addMesh(new_mesh);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -215,12 +234,15 @@ void SkidMarks::update(float dt, bool force_skid_marks,
|
|||||||
SkidMarks::SkidMarkQuads::SkidMarkQuads(const Vec3 &left,
|
SkidMarks::SkidMarkQuads::SkidMarkQuads(const Vec3 &left,
|
||||||
const Vec3 &right,
|
const Vec3 &right,
|
||||||
video::SMaterial *material,
|
video::SMaterial *material,
|
||||||
|
float distance,
|
||||||
float z_offset,
|
float z_offset,
|
||||||
video::SColor* custom_color)
|
video::SColor* custom_color)
|
||||||
: scene::SMeshBuffer()
|
: scene::SMeshBuffer()
|
||||||
{
|
{
|
||||||
|
m_middle_point = (left + right)/2;
|
||||||
m_z_offset = z_offset;
|
m_z_offset = z_offset;
|
||||||
m_fade_out = 0.0f;
|
m_fade_out = 0.0f;
|
||||||
|
m_distance = distance;
|
||||||
|
|
||||||
m_start_color = (custom_color != NULL ? *custom_color :
|
m_start_color = (custom_color != NULL ? *custom_color :
|
||||||
video::SColor(255,
|
video::SColor(255,
|
||||||
@ -230,7 +252,7 @@ SkidMarks::SkidMarkQuads::SkidMarkQuads(const Vec3 &left,
|
|||||||
|
|
||||||
Material = *material;
|
Material = *material;
|
||||||
m_aabb = core::aabbox3df(left.toIrrVector());
|
m_aabb = core::aabbox3df(left.toIrrVector());
|
||||||
add(left, right);
|
add(left, right, distance);
|
||||||
|
|
||||||
|
|
||||||
} // SkidMarkQuads
|
} // SkidMarkQuads
|
||||||
@ -240,7 +262,8 @@ SkidMarks::SkidMarkQuads::SkidMarkQuads(const Vec3 &left,
|
|||||||
* \param left,right Left and right coordinates.
|
* \param left,right Left and right coordinates.
|
||||||
*/
|
*/
|
||||||
void SkidMarks::SkidMarkQuads::add(const Vec3 &left,
|
void SkidMarks::SkidMarkQuads::add(const Vec3 &left,
|
||||||
const Vec3 &right)
|
const Vec3 &right,
|
||||||
|
float distance)
|
||||||
{
|
{
|
||||||
// The skid marks must be raised slightly higher, otherwise it blends
|
// The skid marks must be raised slightly higher, otherwise it blends
|
||||||
// too much with the track.
|
// too much with the track.
|
||||||
@ -252,9 +275,11 @@ void SkidMarks::SkidMarkQuads::add(const Vec3 &left,
|
|||||||
v.Pos = left.toIrrVector();
|
v.Pos = left.toIrrVector();
|
||||||
v.Pos.Y += m_z_offset;
|
v.Pos.Y += m_z_offset;
|
||||||
v.Normal = core::vector3df(0, 1, 0);
|
v.Normal = core::vector3df(0, 1, 0);
|
||||||
|
v.TCoords = core::vector2df(0.0f, distance*0.5f);
|
||||||
Vertices.push_back(v);
|
Vertices.push_back(v);
|
||||||
v.Pos = right.toIrrVector();
|
v.Pos = right.toIrrVector();
|
||||||
v.Pos.Y += m_z_offset;
|
v.Pos.Y += m_z_offset;
|
||||||
|
v.TCoords = core::vector2df(1.0f, distance*0.5f);
|
||||||
Vertices.push_back(v);
|
Vertices.push_back(v);
|
||||||
// Out of the box Irrlicht only supports triangle meshes and not
|
// Out of the box Irrlicht only supports triangle meshes and not
|
||||||
// triangle strips. Since this is a strip it would be more efficient
|
// triangle strips. Since this is a strip it would be more efficient
|
||||||
|
@ -79,15 +79,21 @@ private:
|
|||||||
|
|
||||||
video::SColor m_start_color;
|
video::SColor m_start_color;
|
||||||
|
|
||||||
|
Vec3 m_middle_point;
|
||||||
|
float m_distance;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SkidMarkQuads (const Vec3 &left, const Vec3 &right,
|
SkidMarkQuads (const Vec3 &left, const Vec3 &right,
|
||||||
video::SMaterial *material, float z_offset,
|
video::SMaterial *material, float distance,
|
||||||
video::SColor* custom_color = NULL);
|
float z_offset, video::SColor* custom_color = NULL);
|
||||||
void add (const Vec3 &left,
|
void add (const Vec3 &left,
|
||||||
const Vec3 &right);
|
const Vec3 &right,
|
||||||
|
float distance);
|
||||||
void fade (float f);
|
void fade (float f);
|
||||||
/** Returns the aabb of this skid mark quads. */
|
/** Returns the aabb of this skid mark quads. */
|
||||||
const core::aabbox3df &getAABB() { return m_aabb; }
|
const core::aabbox3df &getAABB() { return m_aabb; }
|
||||||
|
const Vec3& getMiddlePoint() const { return m_middle_point; }
|
||||||
|
float getDistance() const { return m_distance; }
|
||||||
}; // SkidMarkQuads
|
}; // SkidMarkQuads
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user