diff --git a/src/graphics/material.cpp b/src/graphics/material.cpp index 5501fd6b4..e0de3cd7c 100644 --- a/src/graphics/material.cpp +++ b/src/graphics/material.cpp @@ -84,21 +84,19 @@ Material::Material(const XMLNode *node, bool deprecated) std::string s; - //node->get("adjust-image", &s ); - //if(s=="premultiply") - // m_adjust_image = ADJ_PREMUL; - //else if (s=="divide") - // m_adjust_image = ADJ_DIV; - //else if (s=="" || s=="none") - // m_adjust_image = ADJ_NONE; - //else - // Log::warn("material", - // "Incorrect adjust-image specification: '%s' - ignored.", - // s.c_str()); - - node->get("high-adhesion", &m_high_tire_adhesion); - node->get("reset", &m_drive_reset ); + node->get("high-adhesion", &m_high_tire_adhesion ); + node->get("reset", &m_drive_reset ); + s = ""; + node->get("mirror-axis", &s); + if (s == "u") + s = "U"; + else if (s == "v") + s = "V"; + if (s != "U" && s != "V") + m_mirror_axis_when_reverse = ' '; + else + m_mirror_axis_when_reverse = s[0]; // backwards compatibility bool crash_reset = false; node->get("crash-reset", &crash_reset ); @@ -433,6 +431,7 @@ void Material::init() m_surface = false; m_ignore = false; m_drive_reset = false; + m_mirror_axis_when_reverse = ' '; m_collision_reaction = NORMAL; m_disable_z_write = false; m_water_shader_speed_1 = 6.6667f; diff --git a/src/graphics/material.hpp b/src/graphics/material.hpp index 692adfb57..2fa7cb2ac 100644 --- a/src/graphics/material.hpp +++ b/src/graphics/material.hpp @@ -156,6 +156,11 @@ private: bool m_fog; + /** Either ' ' (no mirroring), 'U' or 'V' if a texture needs to be + * mirrored when driving in reverse. Typically used for arrows indicating + * the direction. */ + char m_mirror_axis_when_reverse; + ParticleKind* m_particles_effects[EMIT_KINDS_COUNT]; /** For normal maps */ @@ -373,6 +378,9 @@ public: // ------------------------------------------------------------------------ ShaderType getShaderType() const { return m_shader_type; } // ------------------------------------------------------------------------ + /** True if this texture should have the U coordinates mirrored. */ + char getMirrorAxisInReverse() const { return m_mirror_axis_when_reverse; } + // ------------------------------------------------------------------------ } ; diff --git a/src/tracks/track.cpp b/src/tracks/track.cpp index 9880be647..dc6e9538b 100644 --- a/src/tracks/track.cpp +++ b/src/tracks/track.cpp @@ -885,6 +885,18 @@ void Track::convertTrackToBullet(scene::ISceneNode *node) if (mb->getVertexType() == video::EVT_STANDARD) { irr::video::S3DVertex* mbVertices=(video::S3DVertex*)mb->getVertices(); + if (race_manager->getReverseTrack() && + material->getMirrorAxisInReverse() != ' ') + { + for (unsigned int i = 0; i < mb->getVertexCount(); i++) + { + core::vector2df &tc = mb->getTCoords(i); + if (material->getMirrorAxisInReverse() == 'V') + tc.Y = 1 - tc.Y; + else + tc.X = 1 - tc.X; + } + } // reverse track and texture needs mirroring for (unsigned int matrix_index = 0; matrix_index < matrices.size(); matrix_index++) { for (unsigned int j = 0; j < mb->getIndexCount(); j += 3)