⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitor.cpp

📁 浙江大学 RoboCup3D 2006 源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                }
                glEnd();
            }
            text_x = x + radius*cosDeg((ang1 + ang2) / 2);
            text_y = y + radius*sinDeg((ang1 + ang2) / 2);
            text_z = 0.1;
            // print out the text information
            glColor4f(0, 0, 0, 1.0);
            mGLServer.DrawText3D(buff, Vector3(text_x, text_y, text_z));
        }
    }

}

void
Monitor::DrawStatusText()
{

    stringstream sl, sc, sr;

	sl << mGameState.GetTeamnameLeft() << " " << mGameState.GetScoreLeft();
	sr << mGameState.GetScoreRight() << " " << mGameState.GetTeamnameRight();
/*	sc << "(" << ((mGameState.GetHalf() == GH_FIRST) ?
                "first" : "second") << " half) ";*/

    int play_mode = mGameState.GetPlayMode();

    switch (play_mode)
    {
    case PM_KickOff_Left:
        mKickOff = CommServerBase::eRight;
        break;
    case PM_KickOff_Right:
        mKickOff = CommServerBase::eLeft;
        break;
    };

    sc << mGameState.PlayMode2Str(play_mode) << " ";
    sc << "t=" << setiosflags(ios::fixed) << setprecision(2) << mGameState.GetTime();

    glColor3f(1.0, 1.0, 1.0);
    mGLServer.DrawTextPix(sl.str().c_str(),
                          Vector2( 0, mGLServer.GetTextHeight()));
    mGLServer.DrawTextPix(sc.str().c_str(),
                          Vector2( 0, mGLServer.GetTextHeight()),
                          GLServer::eCENTER);
    mGLServer.DrawTextPix(sr.str().c_str(),
                          Vector2( 0, mGLServer.GetTextHeight()),
                          GLServer::eRIGHT);

}

void
Monitor::DrawStatusLine()
{
    glColor4dv(sTeamColorLeft);
    mGLServer.DrawSphere(Vector3(-0.97,0.93,0.0), 0.025, 20);
    glColor4dv(sTeamColorRight);
    mGLServer.DrawSphere(Vector3( 0.97,0.93,0.0), 0.025, 20);

    int play_mode = mGameState.GetPlayMode();

    if (play_mode == PM_BeforeKickOff)
    {
        glColor4dv(sSphereDefaultColor);
        switch (mKickOff)
        {
        case CommServerBase::eRandom:
            mGLServer.DrawSphere(Vector3( 0.0,0.93,0.0), 0.025, 20);
            break;
        case CommServerBase::eLeft:
            mGLServer.DrawSphere(Vector3( -0.92,0.93,0.0), 0.025, 20);
            break;
        case CommServerBase::eRight:
            mGLServer.DrawSphere(Vector3( 0.92,0.93,0.0), 0.025, 20);
            break;
        }
    }

}

Vector3 Monitor::Get2DPos(const Vector3& pos)
{

    return Vector3
        (
         -1.0 + s2DLowX + s2DScale * (pos.x + mGameState.GetFieldLength()/2),

         1.0 - s2DLowY - (s2DScale * mGameState.GetFieldWidth()) +
         s2DScale * (pos.y + mGameState.GetFieldWidth()/2),

         0.0
         );

}

void
Monitor::DrawOverview()
{
    // radius of player
    double pl_radius = 0.01;
//         = sSzY / mGameState.GetFieldWidth() *
//         mGameState.GetAgentRadius();

    // radius of ball
    double b_radius = 0.005;

//         sSzY / mGameState.GetFieldWidth() *
//         mGameState.GetBallRadius();

    // resolution of a sphere
    int res  = 8;

    const double& fl = mGameState.GetFieldLength();
    const double& fw = mGameState.GetFieldWidth();
//     const double& fh = mGameState.GetFieldHeight();
//     const double& lw = mGameState.GetLineWidth();
//     const double& bs = mGameState.GetBorderSize();
    const double& gw = mGameState.GetGoalWidth();

    // field rect
    glColor4dv(sLineColor);
    glBegin(GL_LINE_STRIP);
    glVertex3dv(Get2DPos(Vector3(-fl/2,-fw/2,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(fl/2,-fw/2,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(fl/2,fw/2,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(-fl/2,fw/2,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(-fl/2,-fw/2,0)).GetData());
    glEnd();

    // middle line
    glBegin(GL_LINES);
    glVertex3dv(Get2DPos(Vector3(0,-fw/2,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(0,fw/2,0)).GetData());
    glEnd();

    // middle circle
    mGLServer.DrawCircle(Get2DPos(Vector3(0,0,0)),sCenterRadius*s2DScale);

    // left goal box
    glBegin(GL_LINE_STRIP);
    glVertex3dv(Get2DPos(Vector3(-fl/2,gw/2+sGoalBoxLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(-fl/2+sGoalBoxLength,gw/2+sGoalBoxLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(-fl/2+sGoalBoxLength,-gw/2-sGoalBoxLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(-fl/2,-gw/2-sGoalBoxLength,0)).GetData());
    glEnd();

    // right goal box
    glBegin(GL_LINE_STRIP);
    glVertex3dv(Get2DPos(Vector3(+fl/2,gw/2+sGoalBoxLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(+fl/2-sGoalBoxLength,gw/2+sGoalBoxLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(+fl/2-sGoalBoxLength,-gw/2-sGoalBoxLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(+fl/2,-gw/2-sGoalBoxLength,0)).GetData());
    glEnd();

    // penalty area left
    glBegin(GL_LINE_STRIP);
    glVertex3dv(Get2DPos(Vector3(-fl/2,gw/2+sPenaltyLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(-fl/2+sPenaltyLength,gw/2+sPenaltyLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(-fl/2+sPenaltyLength,-gw/2-sPenaltyLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(-fl/2,-gw/2-sPenaltyLength,0)).GetData());
    glEnd();

    // penalty area right
    glBegin(GL_LINE_STRIP);
    glVertex3dv(Get2DPos(Vector3(+fl/2,gw/2+sPenaltyLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(+fl/2-sPenaltyLength,gw/2+sPenaltyLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(+fl/2-sPenaltyLength,-gw/2-sPenaltyLength,0)).GetData());
    glVertex3dv(Get2DPos(Vector3(+fl/2,-gw/2-sPenaltyLength,0)).GetData());
    glEnd();

    Vector3 pos;
    double size;
    if (mGameState.GetBall(pos, size))
    {
        glColor4dv(sBallColor);
        mGLServer.DrawSphere(Get2DPos(pos), b_radius, res);
    }

    int i = 0;
    int unum;
    TTeamIndex side;
    while (mGameState.GetPlayer(i, pos, side, unum, size))
    {
        switch (side)
            {
            case TI_LEFT:
                glColor4dv(sTeamColorLeft);
                break;
            case TI_RIGHT:
                glColor4dv(sTeamColorRight);
                break;
            default:
                glColor4dv(sSphereDefaultColor);
            }

        mGLServer.DrawSphere(Get2DPos(pos), pl_radius, res);

        if (mDrawUnums)
            {
                glColor4dv(sUnumColor);
                stringstream ss;
                ss << unum;
                mGLServer.DrawText3D(ss.str(), Get2DPos(pos));
            }

        ++i;
    }

}

void
Monitor::DrawFlag(GameState::EFlagType i, Vector3 pos, int pass)
{

    TFlagInfoMap::const_iterator j = mFlagInfo.find(i);
    FlagInfo fi;
    if (j == mFlagInfo.end())
    {
        memcpy(&fi, &mDefaultFlagInfo, sizeof(FlagInfo));
    } else {
        memcpy(&fi, &(j->second), sizeof(FlagInfo));
    }

    // pass=0, first pass with depth test disabled
    if (pass == 0)
    {
        mGLServer.DrawShadowOfSphere(pos + fi.mOffset, fi.mRadius);
    }
    else
    // pass=1, second pass with depth test
    {
        glColor4dv(fi.mColor);
        mGLServer.DrawSphere(pos + fi.mOffset, fi.mRadius);
    }

}

void
Monitor::DrawPlayer(TTeamIndex side,
                    int unum, const Vector3& pos, double size, int pass)
{
    if (unum < 0) {
        return;
    }

    if (pass == 0)
    {
        mGLServer.DrawShadowOfSphere(pos, size);
    }
    else
    // pass=1, second pass with depth test
    {
        GLdouble tmp[4];
        switch (abs(side))
        {
        case TI_LEFT:
            memcpy(tmp, sTeamColorLeft, sizeof(tmp));
            if (side < 0) {
                tmp[0]/=3; tmp[1]/=3; tmp[2]/=3; tmp[3] = 0.8;
            }
            glColor4dv(tmp);
            break;
        case TI_RIGHT:
            memcpy(tmp, sTeamColorRight, sizeof(tmp));
            if (side < 0) {
                tmp[0]/=3; tmp[1]/=3; tmp[2]/=3; tmp[3] = 0.8;
            }
            glColor4dv(tmp);
            break;
        case TI_NOSEEN:
            glColor4dv(sTeamColorNoSeen);
            break;
        default:
            glColor4dv(sSphereDefaultColor);
        }

        mGLServer.DrawSphere(pos, size);

        if (mDrawUnums && unum > 0)
        {
            glColor4dv(sUnumColor);
            stringstream ss;
            ss << unum;
            mGLServer.DrawText3D(ss.str(), pos);
        }
    }
}

void
Monitor::DrawBall(const Vector3& pos, double size, int pass, const Vector3& color)
{
    if (pass == 0)
    {
        mGLServer.DrawShadowOfSphere(pos, size);
    }
    else
    // pass=1, second pass with depth test
    {
        glColor4f(color.x, color.y, color.z, 1.0);
        mGLServer.DrawSphere(pos, size);
    }
}

void
Monitor::DrawBall(const Vector3& pos, double size, int pass)
{
    if (pass == 0)
    {
        mGLServer.DrawShadowOfSphere(pos, size);
    }
    else
    // pass=1, second pass with depth test
    {
        glColor4dv(sBallColor);
        mGLServer.DrawSphere(pos, size);
    }
}

void
Monitor::Display(vector<string>& geoDebug, bool showReal, bool monitorOnly, WM& wm)
{
    const Vector3 szGoal1 = mGameState.GetGoalSize(false);
    const Vector3 szGoal2 = mGameState.GetGoalSize(true);

    glClearColor(0.15f,0.15f,0.3f,1.0f);
    glClear (GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
    glColor3f (1, 1, 1);


    glLoadIdentity();
    mGLServer.ApplyCamera();

    const double& fl = mGameState.GetFieldLength();
    const double& fw = mGameState.GetFieldWidth();
    const double& fh = mGameState.GetFieldHeight();
    const double& lw = mGameState.GetLineWidth();
    const double& bs = mGameState.GetBorderSize();
    const double& gw = mGameState.GetGoalWidth();

    // ground
    glColor4dv(sGroundColor);

    // left half
    mGLServer.DrawGroundRectangle(Vector3(-fl/2 + lw, -fw/2 + lw, 0),
                                  fl/2 - lw - lw/2, fw - 2*lw, 0);

    // right half
    mGLServer.DrawGroundRectangle(Vector3(lw/2, -fw/2 + lw, 0),
                                  fl/2 - lw - lw/2, fw - 2*lw, 0);

    // border
    glColor4dv(sBorderColor);
    glDisable (GL_DEPTH_TEST);

    // border at left goal
    mGLServer.DrawGroundRectangle(Vector3(-fl/2-bs,-fw/2-bs,0),
                                  bs, fw+2*bs, 0);

    // border at right goal
    mGLServer.DrawGroundRectangle(Vector3(fl/2,-fw/2-bs,0),
                                  bs, fw+2*bs, 0);

    // long top border
    mGLServer.DrawGroundRectangle(Vector3(-fl/2,-fw/2-bs,0),
                                  fl, bs, 0);

    // long bottom border
    mGLServer.DrawGroundRectangle(Vector3(-fl/2,fw/2,0),
                                  fl, bs, 0);

    // lines
    glColor4dv(sLineColor);

    // left goal
    mGLServer.DrawGroundRectangle(Vector3(-fl/2,-fw/2,0), lw, fw, 0);

    // right goal
    mGLServer.DrawGroundRectangle(Vector3(fl/2 - lw,-fw/2,0), lw, fw, 0);

    // long top border
    mGLServer.DrawGroundRectangle(Vector3(-fl/2 + lw,-fw/2,0),
                                  fl - 2*lw, lw, 0);

    // long bottom border
    mGLServer.DrawGroundRectangle(Vector3(-fl/2 + lw,fw/2 - lw,0),
                                  fl - 2*lw, lw, 0);

    // middle line
    mGLServer.DrawGroundRectangle(Vector3(-lw/2,-fw/2 + lw,0),
                                  lw, fw - 2*lw, 0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -