/** Constructor for a checkline. * \param node XML node containing the parameters for this checkline. * \param index Index of this check structure in the check manager. */ CheckLine::CheckLine(const XMLNode &node, unsigned int index) : CheckStructure(node, index) { // Note that when this is called the karts have not been allocated // in world, so we can't call world->getNumKarts() m_previous_sign.resize(race_manager->getNumberOfKarts()); std::string p1_string("p1"); std::string p2_string("p2"); // In case of a cannon in a reverse track, we have to use the target line // as check line if(getType()==CT_CANNON && race_manager->getReverseTrack()) { p1_string = "target-p1"; p2_string = "target-p2"; } core::vector2df p1, p2; if(node.get(p1_string, &p1) && node.get(p2_string, &p2) && node.get("min-height", &m_min_height)) { m_left_point = Vec3(p1.X, m_min_height, p1.Y); m_right_point = Vec3(p2.X, m_min_height, p2.Y); } else { node.get(p1_string, &m_left_point); p1 = core::vector2df(m_left_point.getX(), m_left_point.getZ()); node.get(p2_string, &m_right_point); p2 = core::vector2df(m_right_point.getX(), m_right_point.getZ()); m_min_height = std::min(m_left_point.getY(), m_right_point.getY()); } m_line.setLine(p1, p2); if(UserConfigParams::m_check_debug) { video::SMaterial material; material.setFlag(video::EMF_BACK_FACE_CULLING, false); material.setFlag(video::EMF_LIGHTING, false); material.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR; scene::IMesh *mesh = irr_driver->createQuadMesh(&material, /*create mesh*/true); scene::IMeshBuffer *buffer = mesh->getMeshBuffer(0); assert(buffer->getVertexType()==video::EVT_STANDARD); irr::video::S3DVertex* vertices = (video::S3DVertex*)buffer->getVertices(); vertices[0].Pos = core::vector3df(p1.X, m_min_height-m_under_min_height, p1.Y); vertices[1].Pos = core::vector3df(p2.X, m_min_height-m_under_min_height, p2.Y); vertices[2].Pos = core::vector3df(p2.X, m_min_height+m_over_min_height, p2.Y); vertices[3].Pos = core::vector3df(p1.X, m_min_height+m_over_min_height, p1.Y); for(unsigned int i=0; i<4; i++) { vertices[i].Color = m_active_at_reset ? video::SColor(128, 255, 0, 0) : video::SColor(128, 128, 128, 128); } buffer->recalculateBoundingBox(); buffer->getMaterial().setTexture(0, getUnicolorTexture(video::SColor(128, 255, 105, 180))); buffer->getMaterial().setTexture(1, getUnicolorTexture(video::SColor(0, 0, 0, 0))); buffer->getMaterial().setTexture(7, getUnicolorTexture(video::SColor(0, 0, 0, 0))); buffer->getMaterial().BackfaceCulling = false; //mesh->setBoundingBox(buffer->getBoundingBox()); m_debug_node = irr_driver->addMesh(mesh, "checkdebug"); mesh->drop(); } else { m_debug_node = NULL; } } // CheckLine
/** Constructor for a checkline. * \param node XML node containing the parameters for this checkline. * \param index Index of this check structure in the check manager. */ CheckLine::CheckLine(const XMLNode &node, unsigned int index) : CheckStructure(node, index) { m_ignore_height = false; // Note that when this is called the karts have not been allocated // in world, so we can't call world->getNumKarts() m_previous_sign.resize(race_manager->getNumberOfKarts()); std::string p1_string("p1"); std::string p2_string("p2"); // In case of a cannon in a reverse track, we have to use the target line // as check line if(getType()==CT_CANNON && race_manager->getReverseTrack()) { p1_string = "target-p1"; p2_string = "target-p2"; } core::vector2df p1, p2; if(node.get(p1_string, &p1) && node.get(p2_string, &p2) && node.get("min-height", &m_min_height)) { m_left_point = Vec3(p1.X, m_min_height, p1.Y); m_right_point = Vec3(p2.X, m_min_height, p2.Y); } else { node.get(p1_string, &m_left_point); p1 = core::vector2df(m_left_point.getX(), m_left_point.getZ()); node.get(p2_string, &m_right_point); p2 = core::vector2df(m_right_point.getX(), m_right_point.getZ()); m_min_height = std::min(m_left_point.getY(), m_right_point.getY()); } m_line.setLine(p1, p2); if(UserConfigParams::m_check_debug && !ProfileWorld::isNoGraphics()) { #ifndef SERVER_ONLY m_debug_dy_dc = std::make_shared<SP::SPDynamicDrawCall> (scene::EPT_TRIANGLE_STRIP, SP::SPShaderManager::get()->getSPShader("additive"), material_manager->getDefaultSPMaterial("additive")); SP::addDynamicDrawCall(m_debug_dy_dc); m_debug_dy_dc->getVerticesVector().resize(4); auto& vertices = m_debug_dy_dc->getVerticesVector(); vertices[0].m_position = core::vector3df(p1.X, m_min_height - m_under_min_height, p1.Y); vertices[1].m_position = core::vector3df(p2.X, m_min_height - m_under_min_height, p2.Y); vertices[2].m_position = core::vector3df(p1.X, m_min_height + m_over_min_height, p1.Y); vertices[3].m_position = core::vector3df(p2.X, m_min_height + m_over_min_height, p2.Y); for(unsigned int i = 0; i < 4; i++) { vertices[i].m_color = m_active_at_reset ? video::SColor(128, 255, 0, 0) : video::SColor(128, 128, 128, 128); } m_debug_dy_dc->recalculateBoundingBox(); #endif } } // CheckLine