IntermediateTutorial7Source         Intermediate Tutorial 7 - source

This is the source for Intermediate Tutorial 7.

IntermediateTutorial7.h:

#ifndef __IntermediateTutorial7_h_
#define __IntermediateTutorial7_h_

#include "BaseApplication.h"

class IntermediateTutorial7 : public BaseApplication, Ogre::RenderTargetListener
{
public:
    IntermediateTutorial7(void);
    virtual ~IntermediateTutorial7(void);

protected:
    virtual void createScene(void);
    virtual void createFrameListener(void);
    virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);
    virtual void preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);
    virtual void postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);

    Ogre::MovablePlane* mPlane;
    Ogre::Entity*       mPlaneEnt;
    Ogre::SceneNode*    mPlaneNode;
    Ogre::Rectangle2D*  mMiniScreen;
};

#endif // #ifndef __IntermediateTutorial7_h_


IntermediateTutorial7.cpp:

#include "IntermediateTutorial7.h"

//-------------------------------------------------------------------------------------
IntermediateTutorial7::IntermediateTutorial7(void)
{
}
//-------------------------------------------------------------------------------------
IntermediateTutorial7::~IntermediateTutorial7(void)
{
}
//-------------------------------------------------------------------------------------
void IntermediateTutorial7::createScene(void)
{
    mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2f, 0.2f, 0.2f));

    Ogre::Light* light = mSceneMgr->createLight("MainLight");
    light->setPosition(20, 80, 50);

    mCamera->setPosition(60, 200, 70);
    mCamera->lookAt(0,0,0);

    Ogre::MaterialPtr mat = Ogre::MaterialManager::getSingleton().create("PlaneMat", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
    Ogre::TextureUnitState* tuisTexture = mat->getTechnique(0)->getPass(0)->createTextureUnitState("grass_1024.jpg");

    mPlane = new Ogre::MovablePlane("Plane");
    mPlane->d = 0;
    mPlane->normal = Ogre::Vector3::UNIT_Y;

    Ogre::MeshManager::getSingleton().createPlane("PlaneMesh", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, *mPlane, 120, 120, 1, 1, true, 1, 1, 1, Ogre::Vector3::UNIT_Z);
    mPlaneEnt = mSceneMgr->createEntity("PlaneEntity", "PlaneMesh");
    mPlaneEnt->setMaterialName("PlaneMat");

    mPlaneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
    mPlaneNode->attachObject(mPlaneEnt);

    Ogre::TexturePtr rtt_texture = Ogre::TextureManager::getSingleton().createManual("RttTex", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, mWindow->getWidth(), mWindow->getHeight(), 0, Ogre::PF_R8G8B8, Ogre::TU_RENDERTARGET);

    Ogre::RenderTexture *renderTexture = rtt_texture->getBuffer()->getRenderTarget();

    renderTexture->addViewport(mCamera);
    renderTexture->getViewport(0)->setClearEveryFrame(true);
    renderTexture->getViewport(0)->setBackgroundColour(Ogre::ColourValue::Black);
    renderTexture->getViewport(0)->setOverlaysEnabled(false);
    renderTexture->addListener(this);

    mMiniScreen = new Ogre::Rectangle2D(true);
    mMiniScreen->setCorners(0.5f, -0.5f, 1.0f, -1.0f);
    mMiniScreen->setBoundingBox(Ogre::AxisAlignedBox::BOX_INFINITE);

    Ogre::SceneNode* miniScreenNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("MiniScreenNode");
    miniScreenNode->attachObject(mMiniScreen);

    Ogre::MaterialPtr renderMaterial = Ogre::MaterialManager::getSingleton().create("RttMat", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
    Ogre::Technique* matTechnique = renderMaterial->createTechnique();
    matTechnique->createPass();
    renderMaterial->getTechnique(0)->getPass(0)->setLightingEnabled(false);
    renderMaterial->getTechnique(0)->getPass(0)->createTextureUnitState("RttTex");

    mMiniScreen->setMaterial("RttMat");    
}
//-------------------------------------------------------------------------------------
void IntermediateTutorial7::createFrameListener(void)
{
	BaseApplication::createFrameListener();

	mTrayMgr->hideLogo();
}
//-------------------------------------------------------------------------------------
bool IntermediateTutorial7::frameRenderingQueued(const Ogre::FrameEvent& evt)
{
    mPlaneNode->yaw(Ogre::Radian(evt.timeSinceLastFrame));
    return BaseApplication::frameRenderingQueued(evt);
}
//-------------------------------------------------------------------------------------
void IntermediateTutorial7::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
{
    mMiniScreen->setVisible(false);
}
//-------------------------------------------------------------------------------------
void IntermediateTutorial7::postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
{
    mMiniScreen->setVisible(true);
}

//-------------------------------------------------------------------------------------

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
    int main(int argc, char *argv[])
#endif
    {
        // Create application object
        IntermediateTutorial7 app;

        try {
            app.go();
        } catch( Ogre::Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
            MessageBoxA( NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
            std::cerr << "An exception has occurred: " <<
                e.getFullDescription().c_str() << std::endl;
#endif
        }

        return 0;
    }

#ifdef __cplusplus
}
#endif