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

📄 mgcglutapplication.cpp

📁 <B>《3D Engine Design》的随书源代码
💻 CPP
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// Copyright (c) 2000, All Rights Reserved
//
// Source code from Magic Software is supplied under the terms of a license
// agreement and may not be copied or disclosed except in accordance with the
// terms of that agreement.  The various license agreements may be found at
// the Magic Software web site.  This file is subject to the license
//
// FREE SOURCE CODE
// http://www.magic-software.com/License.html/free.pdf

#include "MgcApplication.h"
#include "MgcCommand.h"
#include <MgcGlutRenderer.pkg>

const int MgcApplication::KEY_ESCAPE = 0x1B;
const int MgcApplication::KEY_LEFT_ARROW = GLUT_KEY_LEFT;
const int MgcApplication::KEY_RIGHT_ARROW = GLUT_KEY_RIGHT;
const int MgcApplication::KEY_UP_ARROW = GLUT_KEY_UP;
const int MgcApplication::KEY_DOWN_ARROW = GLUT_KEY_DOWN;
const int MgcApplication::KEY_HOME = GLUT_KEY_HOME;
const int MgcApplication::KEY_END = GLUT_KEY_END;
const int MgcApplication::KEY_PAGE_UP = GLUT_KEY_PAGE_UP;
const int MgcApplication::KEY_PAGE_DOWN = GLUT_KEY_PAGE_DOWN;
const int MgcApplication::KEY_INSERT = GLUT_KEY_INSERT;
const int MgcApplication::KEY_DELETE = 0x2E;
const int MgcApplication::KEY_F1 = GLUT_KEY_F1;
const int MgcApplication::KEY_F2 = GLUT_KEY_F2;
const int MgcApplication::KEY_F3 = GLUT_KEY_F3;
const int MgcApplication::KEY_F4 = GLUT_KEY_F4;
const int MgcApplication::KEY_F5 = GLUT_KEY_F5;
const int MgcApplication::KEY_F6 = GLUT_KEY_F6;
const int MgcApplication::KEY_F7 = GLUT_KEY_F7;
const int MgcApplication::KEY_F8 = GLUT_KEY_F8;
const int MgcApplication::KEY_F9 = GLUT_KEY_F9;
const int MgcApplication::KEY_F10 = GLUT_KEY_F10;
const int MgcApplication::KEY_F11 = GLUT_KEY_F11;
const int MgcApplication::KEY_F12 = GLUT_KEY_F12;

const int MgcApplication::MOUSE_LEFT_BUTTON = GLUT_LEFT_BUTTON;
const int MgcApplication::MOUSE_MIDDLE_BUTTON = GLUT_MIDDLE_BUTTON;
const int MgcApplication::MOUSE_RIGHT_BUTTON = GLUT_RIGHT_BUTTON;
const int MgcApplication::MOUSE_UP = GLUT_UP;
const int MgcApplication::MOUSE_DOWN = GLUT_DOWN;

//----------------------------------------------------------------------------
void MgcApplication::RequestTermination ()
{
    exit(0);
}
//----------------------------------------------------------------------------
MgcReal MgcApplication::GetTimeInSeconds ()
{
    MgcReal fTime = 0.001*glutGet(GLUT_ELAPSED_TIME);
    return fTime;
}
//----------------------------------------------------------------------------
void MgcApplication::MoveCamera ()
{
    // GLUT does not have distinct callbacks for key-down versus key-up.  So
    // I have to reset the 'key down' flags each time.  This leads to not so
    // smooth camera motion.

    if ( m_bUArrowPressed )
    {
        MoveForward();
        m_bUArrowPressed = false;
    }
    else if ( m_bDArrowPressed )
    {
        MoveBackward();
        m_bDArrowPressed = false;
    }

    if ( m_bHomePressed )
    {
        MoveUp();
        m_bHomePressed = false;
    }
    else if ( m_bEndPressed )
    {
        MoveDown();
        m_bEndPressed = false;
    }

    if ( m_bLArrowPressed )
    {
        TurnLeft();
        m_bLArrowPressed = false;
    }
    else if ( m_bRArrowPressed )
    {
        TurnRight();
        m_bRArrowPressed = false;
    }

    if ( m_bPgUpPressed )
    {
        LookUp();
        m_bPgUpPressed = false;
    }
    else if ( m_bPgDnPressed )
    {
        LookDown();
        m_bPgDnPressed = false;
    }
}
//----------------------------------------------------------------------------
static void ReshapeCallback (int iWidth, int iHeight)
{
    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    if ( pkTheApp )
        pkTheApp->OnReshape(iWidth,iHeight);
}
//----------------------------------------------------------------------------
static void DisplayCallback ()
{
    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    if ( pkTheApp )
        pkTheApp->OnDisplay();
}
//----------------------------------------------------------------------------
static void IdleCallback ()
{
    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    if ( pkTheApp )
        pkTheApp->OnIdle();
}
//----------------------------------------------------------------------------
static void KeyPressCallback (unsigned char ucKey, int iX, int iY)
{
    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    if ( pkTheApp )
        pkTheApp->OnKeyPress(ucKey,iX,iY);
}
//----------------------------------------------------------------------------
static void SpecialKeyPressCallback (int iKey, int iX, int iY)
{
    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    if ( pkTheApp )
        pkTheApp->OnSpecialKeyPress(iKey,iX,iY);
}
//----------------------------------------------------------------------------
static void MousePressCallback (int iButton, int iState, int iX, int iY)
{
    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    if ( pkTheApp )
        pkTheApp->OnMousePress(iButton,iState,iX,iY);
}
//----------------------------------------------------------------------------
static void MotionCallback (int iX, int iY)
{
    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    if ( pkTheApp )
        pkTheApp->OnMotion(iX,iY);
}
//----------------------------------------------------------------------------
static void PassiveMotionCallback (int iX, int iY)
{
    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    if ( pkTheApp )
        pkTheApp->OnPassiveMotion(iX,iY);
}
//----------------------------------------------------------------------------
static void Terminate ()
{
    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    if ( pkTheApp )
    {
        pkTheApp->OnTerminate();
        glutDestroyWindow(pkTheApp->GetWindowID());
    }
}
//----------------------------------------------------------------------------
int main (int iQuantity, char** apcArgument)
{
    // The unique MgcApplication object must be created pre-main by a
    // constuctor call in the application source file.

    MgcApplication* pkTheApp = MgcApplication::GetApplication();
    assert( pkTheApp );
    if ( !pkTheApp )
        return -1;

    if ( atexit(Terminate) != 0 )
        return -2;

    glutInit(&iQuantity,apcArgument);
    pkTheApp->SetCommand(new MgcCommand(iQuantity,apcArgument));

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(pkTheApp->GetWidth(),pkTheApp->GetHeight());
    pkTheApp->SetWindowID(glutCreateWindow(pkTheApp->GetWindowTitle()));

    pkTheApp->SetRenderer(new MgcGlutRenderer(pkTheApp->GetWindowID(),
        pkTheApp->GetWidth(),pkTheApp->GetHeight()));

    pkTheApp->SetCamera(new MgcGlutCamera(pkTheApp->GetWidth(),
        pkTheApp->GetHeight()));

    if ( !pkTheApp->OnInitialize() )
        return -3;

    glutReshapeFunc(ReshapeCallback);
    glutDisplayFunc(DisplayCallback);
    glutIdleFunc(IdleCallback);
    glutKeyboardFunc(KeyPressCallback);
    glutSpecialFunc(SpecialKeyPressCallback);
    glutMouseFunc(MousePressCallback);
    glutMotionFunc(MotionCallback);
    glutPassiveMotionFunc(PassiveMotionCallback);

    glutMainLoop();
    return 0;
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

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