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

📄 testmorphcontroller.cpp

📁 《3D游戏引擎设计》的源码
💻 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 "TestMorphController.h"

//---------------------------------------------------------------------------
MgcApplication* MgcApplication::Create ()
{
    return new TestMorphController;
}
//---------------------------------------------------------------------------
TestMorphController::TestMorphController ()
    :
    MgcApplication("TestMorphController",640,480,0,2)
{
    MeasureTime();
    m_fBaseTime = -1.0;
    m_fCurrTime = -1.0;
}
//---------------------------------------------------------------------------
bool TestMorphController::Initialize ()
{
    m_spkCamera = new MgcOglCamera(640,480);
    m_spkCamera->SetFrustum(1.0,1000.0,-0.55,0.55,0.4125,-0.4125);
    MgcVector3 kCLoc(0.0,0.0,0.0);
    MgcVector3 kCLeft(0.0,0.0,-1.0);
    MgcVector3 kCUp(0.0,1.0,0.0);
    MgcVector3 kCDir(1.0,0.0,0.0);
    m_spkCamera->SetFrame(kCLoc,kCLeft,kCUp,kCDir);
    m_spkRenderer = new MgcOglRenderer(GetWindowHandle(),640,480);
    m_spkRenderer->SetBackgroundColor(MgcColor(0.5f,0.0f,1.0f));
    m_spkRenderer->SetCamera(m_spkCamera);

    MgcStream kStream;
    bool bResult = kStream.Load("sneeze.mgc");
    assert( bResult );
    assert( kStream.GetObjectCount() == 1 );
    assert( MgcIsExactlyClass(MgcNode,kStream.GetObjectAt(0)) );
    m_spkScene = (MgcNode*) kStream.GetObjectAt(0);

    m_spkWireframeState = new MgcWireframeState;
    m_spkScene->SetRenderState(m_spkWireframeState);

    MgcZBufferState* pkZBufferState = new MgcZBufferState;
    pkZBufferState->Enabled() = true;
    pkZBufferState->Writeable() = true;
    pkZBufferState->Compare() = MgcZBufferState::CF_LEQUAL;
    m_spkScene->SetRenderState(pkZBufferState);

    MgcMaterialState* pkMaterial = new MgcMaterialState;
    pkMaterial->Ambient() = MgcColor(0.5,0.5,0.5);
    pkMaterial->Diffuse() = MgcColor(0.99607,0.83920,0.67059);
    pkMaterial->Specular() = MgcColor(0.8,0.8,0.8);
    m_spkScene->SetRenderState(pkMaterial);

    MgcDirectionalLight* pkLight = new MgcDirectionalLight;
    pkLight->Direction() = MgcVector3::UNIT_X;
    pkLight->Ambient() = MgcColor(0.125,0.125,0.125);
    pkLight->Diffuse() = MgcColor(1.0,1.0,1.0);
    MgcLightState* pkLightState = new MgcLightState;
    pkLightState->Attach(pkLight);
    m_spkScene->SetRenderState(pkLightState);

    m_spkCamera->Update();
    m_spkScene->UpdateGS(0.0);
    m_spkScene->UpdateRS();

    return true;
}
//---------------------------------------------------------------------------
void TestMorphController::Terminate ()
{
    m_spkWireframeState = 0;
    m_spkCamera = 0;
    m_spkRenderer = 0;
    m_spkScene = 0;
}
//---------------------------------------------------------------------------
void TestMorphController::OnIdle ()
{
    MeasureTime();

    // update the morph animation
    if ( m_fBaseTime == -1.0 )
    {
        m_fBaseTime = (MgcReal) GetCurrentTimeInSeconds();
        m_fCurrTime = m_fBaseTime;
    }
    else
    {
        m_fCurrTime = (MgcReal) GetCurrentTimeInSeconds();
    }
    m_spkScene->UpdateGS(m_fCurrTime - m_fBaseTime);


    // draw the scene
    m_spkRenderer->ClearBuffers();
    m_spkRenderer->Draw(m_spkScene);
    m_spkRenderer->DisplayBackBuffer();

    DrawFrameRate();
    DisplayStatistics();
    UpdateClicks();
}
//---------------------------------------------------------------------------
bool TestMorphController::WmChar (char cCharCode, long lModifiers)
{
    switch ( cCharCode )
    {
    case '0':  // reset frame rate measurements
        ResetTime();
        return true;
    case 'w':
        m_spkWireframeState->Enabled() = !m_spkWireframeState->Enabled();
        return true;
    case 'q':
    case 'Q':
    case VK_ESCAPE:
        PostMessage(GetWindowHandle(),WM_DESTROY,0,0);
        return true;
    }

    return false;
}
//---------------------------------------------------------------------------
void TestMorphController::DisplayStatistics ()
{
    char acMsg[256];
    MgcReal fDTime = m_fCurrTime - m_fBaseTime;
    sprintf(acMsg,"time = %6.2f",fDTime);
    unsigned int uiPane = 1;
    HWND hStatusWnd = GetStatusWindowHandle();
    SendMessage(hStatusWnd,SB_SETTEXT,(WPARAM)uiPane,(LPARAM)acMsg);
    SendMessage(hStatusWnd,WM_PAINT,0,0); 
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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