/** * Let drivers to drive. * Only one driver can drive at the same time. * @param input wrapped input * @return true when a fish has moved (switch does not count) */ bool Controls::driving(const InputProvider *input) { bool moved = false; if (!useSwitch()) { if (!useStroke()) { moved = driveUnit(input); } else { moved = true; } } return moved; }
// Draw a fragment of text. Assumes graphics origin and scaling are correct. static float drawChars(const string& str, int start, int end, const Font& font, const GFXColor& color, float inRasterPos) { // Make sure the graphics state is right. glColor4f(color.r, color.g, color.b, color.a); if (useStroke()) glLineWidth(font.strokeWidth()); else { static bool setRasterPos= XMLSupport::parse_bool(vs_config->getVariable("graphics","set_raster_text_color","true")); if (setRasterPos) glRasterPos2f(inRasterPos/(g_game.x_resolution/2),0); } // Draw all the characters. for(int charPos=start; charPos<=end; charPos++) { inRasterPos+=font.drawChar(str[charPos]); } return inRasterPos; }
// Draw specified lines of text. void PaintText::drawLines(int start, int count) const { // Make sure we hav a display list. calcLayoutIfNeeded(); // Make sure we have something to do. if(m_lines.empty()) { return; } // Initialize the graphics state. GFXToggleTexture(false,0); if(gl_options.smooth_lines) { glEnable(GL_LINE_SMOOTH); } GFXPushBlendMode(); GFXBlendMode(SRCALPHA,INVSRCALPHA); glPushMatrix(); // Keep track of line position. float lineTop = m_rect.top(); // Figure ending line index. const int end = guiMin(start + count, m_lines.size()); // Loop through the display list lines. for(int i=start; i<end; i++) { const TextLine& line = m_lines[i]; // Make sure we can paint this line in the vertical space we have left. if(lineTop - line.height*LINE_HEIGHT_EPSILON < m_rect.origin.y) { // Not enough space to draw this line. break; } // Position at the start of the line. glLoadIdentity(); glTranslatef(m_rect.origin.x+line.x, lineTop-line.baseLine, 0.0); if (line.fragments.size()) { GFXColorf(line.fragments[0].color); } if (!useStroke()){ glRasterPos2f(0,0); }else glScaled(m_horizontalScaling, m_verticalScaling, 1.0); float rasterpos=0; // Draw each fragment. for(vector<TextFragment>::const_iterator frag=line.fragments.begin(); frag!=line.fragments.end(); frag++) { if(frag->start == ELLIPSIS_FRAGMENT) { // We have a special-case for the ellipsis at the end of a line. drawChars(ELLIPSIS_STRING, 0, 2, frag->font, frag->color,rasterpos); } else { rasterpos=drawChars(m_text, frag->start, frag->end, frag->font, frag->color,rasterpos); } } // Top of next line. lineTop -= line.height; } glRasterPos2f(0,0); // Undo graphics state GFXPopBlendMode(); if(gl_options.smooth_lines) { glDisable(GL_LINE_SMOOTH); } glPopMatrix(); GFXToggleTexture(true,0); }