Exemple #1
0
void CameraControl::OnExcute(float sec)
{
    float move_speed = m_move_speed;

    // 前后移动 
    float len = sec * move_speed * m_fDirection;

    if (len != 0)
    {
        // 前后平移
        MoveFront(-len);
    }

    // 上下移动
    float len1 = sec * move_speed * m_fUpDirection;

    if (len1 != 0)
    {
        MoveUp(len1);
    }

    // 左右平移 
    float delta = sec * move_speed * m_fShiftDirection;

    if (delta != 0)
    {
        MoveShift(delta);
    }

}
Exemple #2
0
  void
  TerminalDisplay::Move(Pos p) {
    Attach();
    if (fWritePos == p) return;
    if (fWritePos.fLine > p.fLine) {
      MoveUp(fWritePos.fLine - p.fLine);
      fWritePos.fLine -= fWritePos.fLine - p.fLine;
    } else if (fWritePos.fLine < p.fLine) {
      MoveDown(p.fLine - fWritePos.fLine);
      fWritePos.fLine += p.fLine - fWritePos.fLine;
    }

    if (p.fCol == 0) {
      MoveFront();
      fWritePos.fCol = 0;
    } else if (fWritePos.fCol > p.fCol) {
      MoveLeft(fWritePos.fCol - p.fCol);
      fWritePos.fCol -= fWritePos.fCol - p.fCol;
    } else if (p.fCol > fWritePos.fCol) {
      MoveRight(p.fCol - fWritePos.fCol);
      fWritePos.fCol += p.fCol - fWritePos.fCol;
    }
  }
Exemple #3
0
  size_t
  TerminalDisplay::WriteWrappedElement(const Text& Element, size_t TextOffset,
                                       size_t WriteOffset, size_t Requested) {
    size_t Start = TextOffset;
    size_t Remaining = Requested;

    size_t Available = Element.length() - Start;
    if (Requested == (size_t) -1) {
      Requested = Available;
    }

    if (Available > 0) {
      if (Available < Remaining) {
        Remaining = Available;
      }

      while (Remaining > 0) {
        size_t numThisLine = Remaining;

        // How much can this line hold?
        size_t numToEOL = GetWidth() - ((Start + WriteOffset) % GetWidth());
        if (!numToEOL) {
          MoveDown();
          ++fWritePos.fLine;
          MoveFront();
          fWritePos.fCol = 0;
          numToEOL = GetWidth();
        }
        if (numThisLine > numToEOL) {
          numThisLine = numToEOL;
        }

        if (GetContext()->GetColorizer()) {
          // We only write same-color chunks; how long is it?
          const std::vector<char>& Colors = Element.GetColors();
          char ThisColor = Colors[Start];
          size_t numSameColor = 1;
          while (numSameColor < numThisLine
                 && ThisColor == Colors[Start + numSameColor])
            ++numSameColor;
          numThisLine = numSameColor;

          if (ThisColor != fPrevColor) {
            Color C;
            GetContext()->GetColorizer()->GetColor(ThisColor, C);
            SetColor(ThisColor, C);
            fPrevColor = ThisColor;
          }
        }

        WriteRawString(Element.GetText().c_str() + Start, numThisLine);
        fWritePos = IndexToPos(PosToIndex(fWritePos) + numThisLine);
        if (numThisLine == numToEOL) {
          ActOnEOL();
        }

        Start += numThisLine;
        Remaining -= numThisLine;
      }
    }

    if (Requested == Available) {
      size_t VisL = fWriteLen / GetWidth();
      size_t Wrote = WriteOffset + TextOffset + Requested;
      size_t WroteL = Wrote / GetWidth();
      size_t NumToEOL = GetWidth() - (Wrote % GetWidth());
      if (fWriteLen > Wrote && NumToEOL > 0) {
        // Wrote less and not at EOL
        EraseToRight();
      }
      if (WroteL < VisL) {
        Pos prevWC = GetCursor();
        MoveFront();
        fWritePos.fCol = 0;
        for (size_t l = WroteL + 1; l <= VisL; ++l) {
          MoveDown();
          ++fWritePos.fLine;
          EraseToRight();
        }
        Move(prevWC);
      }
    }
    return Remaining;
  }