<div>#ifndef __basetutorial_h_<br>#define __basetutorial_h_</div> <div>#include "BaseApplication.h"<br>#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32<br>#include "../res/resource.h"<br>#endif</div> <div>#include <Terrain/OgreTerrain.h><br>#include <Terrain/OgreTerrainGroup.h><br>#include "BaseApplication.h"</div> <div>#include <iostream><br>#include <list></div> <div>using namespace Ogre;<br>using namespace std;</div> <div>class basetutorial : public BaseApplication<br>{<br>public:<br> basetutorial(void);<br> virtual ~basetutorial(void);</div> <div>private:<br> Ogre::TerrainGlobalOptions* mTerrainGlobals;<br> Ogre::TerrainGroup* mTerrainGroup;<br> bool mTerrainsImported;<br> OgreBites::Label* mInfoLabel;<br> <br> void defineTerrain(long x, long y);<br> void initBlendMaps(Ogre::Terrain* terrain);<br> void configureTerrainDefaults(Ogre::Light* light);</div> <div> ////////////////////////////////////////////////////<br> <br> </div> <div><br> ////////////////////////////////////////////////////<br> void create_robot();<br> </div> <div>protected:<br> virtual void createScene(void);<br> virtual void createFrameListener(void);<br> virtual void destroyScene(void);<br> virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);<br> ///////////////////////////////////////////////////////////////////////////////////////////<br> virtual bool keyPressed(const OIS::KeyEvent& arg);<br> virtual bool keyReleased(const OIS::KeyEvent& arg);<br> ///////////////////////////////////////////////////////////////////////////////////////////<br> virtual bool mouseMoved(const OIS::MouseEvent& arg);<br> virtual bool mousePressed(const OIS::MouseEvent& arg, OIS::MouseButtonID id);<br> virtual bool mouseReleased(const OIS::MouseEvent& arg, OIS::MouseButtonID id);</div> <div> Real mRotate;<br> Real mMove;<br> SceneNode * mCamNode;<br> Vector3 mDirection;</div> <div> struct Robot<br> {<br> Entity *rEntity;<br> SceneNode *rSceneNode;<br> };<br> std::list<Robot *> Robot_list;</div> <div> AnimationState *robot_AnimationState;<br> <br>};</div> <div>void getTerrainImage(bool flipX, bool flipY, Ogre::Image& img)<br>{<br> img.load("terrain.png", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);<br> if (flipX)<br> img.flipAroundY();<br> if (flipY)<br> img.flipAroundX();<br>}<br>//-------------------------------------------------------------------------------------<br>void basetutorial::defineTerrain(long x, long y)<br>{<br> Ogre::String filename = mTerrainGroup->generateFilename(x, y);<br> if (Ogre::ResourceGroupManager::getSingleton().resourceExists(mTerrainGroup->getResourceGroup(), filename))<br> {<br> mTerrainGroup->defineTerrain(x, y);<br> }<br> else<br> {<br> Ogre::Image img;<br> getTerrainImage(x % 2 != 0, y % 2 != 0, img);<br> mTerrainGroup->defineTerrain(x, y, &img);<br> mTerrainsImported = true;<br> }</div> <div>}<br>//-------------------------------------------------------------------------------------<br>void basetutorial::initBlendMaps(Ogre::Terrain* terrain)<br>{<br> Ogre::TerrainLayerBlendMap* blendMap0 = terrain->getLayerBlendMap(1);<br> Ogre::TerrainLayerBlendMap* blendMap1 = terrain->getLayerBlendMap(2);<br> Ogre::Real minHeight0 = 70;<br> Ogre::Real fadeDist0 = 40;<br> Ogre::Real minHeight1 = 70;<br> Ogre::Real fadeDist1 = 15;<br> float* pBlend0 = blendMap0->getBlendPointer();<br> float* pBlend1 = blendMap1->getBlendPointer();<br> for (Ogre::uint16 y = 0; y < terrain->getLayerBlendMapSize(); ++y)<br> {<br> for (Ogre::uint16 x = 0; x < terrain->getLayerBlendMapSize(); ++x)<br> {<br> Ogre::Real tx, ty;<br> <br> blendMap0->convertImageToTerrainSpace(x, y, &tx, &ty);<br> Ogre::Real height = terrain->getHeightAtTerrainPosition(tx, ty);<br> Ogre::Real val = (height - minHeight0) / fadeDist0;<br> val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1);<br> *pBlend0++ = val;<br> <br> val = (height - minHeight1) / fadeDist1;<br> val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1);<br> *pBlend1++ = val;<br> }<br> }<br> blendMap0->dirty();<br> blendMap1->dirty();<br> blendMap0->update();<br> blendMap1->update();</div> <div>}<br>//-------------------------------------------------------------------------------------<br>void basetutorial::configureTerrainDefaults(Ogre::Light* light)<br>{<br> // Configure global<br> mTerrainGlobals->setMaxPixelError(8);<br> // testing composite map<br> mTerrainGlobals->setCompositeMapDistance(3000);<br> <br> // Important to set these so that the terrain knows what to use for derived (non-realtime) data<br> mTerrainGlobals->setLightMapDirection(light->getDerivedDirection());<br> mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight());<br> mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());<br> <br> // Configure default import settings for if we use imported image<br> Ogre::Terrain::ImportData& defaultimp = mTerrainGroup->getDefaultImportSettings();<br> defaultimp.terrainSize = 513;<br> defaultimp.worldSize = 12000.0f;<br> defaultimp.inputScale = 600;<br> defaultimp.minBatchSize = 33;<br> defaultimp.maxBatchSize = 65;<br> // textures<br> defaultimp.layerList.resize(3);<br> defaultimp.layerList[0].worldSize = 100;<br> defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_diffusespecular.dds");<br> defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_normalheight.dds");<br> defaultimp.layerList[1].worldSize = 30;<br> defaultimp.layerList[1].textureNames.push_back("grass_green-01_diffusespecular.dds");<br> defaultimp.layerList[1].textureNames.push_back("grass_green-01_normalheight.dds");<br> defaultimp.layerList[2].worldSize = 200;<br> defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_diffusespecular.dds");<br> defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_normalheight.dds");</div> <div>}</div> <div>bool basetutorial::frameRenderingQueued(const Ogre::FrameEvent& evt)<br>{<br> bool ret = BaseApplication::frameRenderingQueued(evt);<br> <br> if (mTerrainGroup->isDerivedDataUpdateInProgress())<br> {<br> mTrayMgr->moveWidgetToTray(mInfoLabel, OgreBites::TL_TOP, 0);<br> mInfoLabel->show();<br> if (mTerrainsImported)<br> {<br> mInfoLabel->setCaption("Building terrain, please wait...");<br> }<br> else<br> {<br> mInfoLabel->setCaption("Updating textures, patience...");<br> }<br> }<br> else<br> {<br> mTrayMgr->removeWidgetFromTray(mInfoLabel);<br> mInfoLabel->hide();<br> if (mTerrainsImported)<br> {<br> mTerrainGroup->saveAllTerrains(true);<br> mTerrainsImported = false;<br> }<br> }</div> <div> if(mWindow->isClosed()) return false;<br> if(mShutDown)return false;<br> mKeyboard->capture();<br> mMouse->capture();<br> mTrayMgr->frameRenderingQueued(evt);<br> mCamNode->translate(mDirection *evt.timeSinceLastFrame, Node::TS_LOCAL);</div> <div> robot_AnimationState->addTime(evt.timeSinceLastFrame);<br> <br> //return ret;<br> return true;<br>}<br>void basetutorial::createFrameListener(void)<br>{</div> <div> BaseApplication::createFrameListener();<br> <br> mCamNode = mCamera->getParentSceneNode();<br> mRotate = 0.13;<br> mMove = 250;</div> <div> mMouse->setEventCallback(this);<br> mKeyboard->setEventCallback(this);</div> <div> mDirection = Vector3::ZERO;</div> <div> mInfoLabel = mTrayMgr->createLabel(OgreBites::TL_TOP, "TInfo", "", 350);</div> <div> <br>}<br>void basetutorial::destroyScene(void)<br>{<br> OGRE_DELETE mTerrainGroup;<br> OGRE_DELETE mTerrainGlobals;<br>}<br>////////////////////////////////////////////////////////////////////////////////////////<br>bool basetutorial::keyPressed(const OIS::KeyEvent& arg)<br>{<br> switch (arg.key)<br> {<br> case OIS::KC_1:<br> mCamera->getParentSceneNode()->detachObject(mCamera);<br> mCamNode = mSceneMgr->getSceneNode("CamNode1");<br> mCamNode->attachObject(mCamera);<br> break;<br> <br> case OIS::KC_2:<br> mCamera->getParentSceneNode()->detachObject(mCamera);<br> mCamNode = mSceneMgr->getSceneNode("CamNode2");<br> mCamNode->attachObject(mCamera);<br> break;<br> case OIS::KC_UP:<br> case OIS::KC_W:<br> mDirection.z = -mMove;<br> if(mKeyboard->isKeyDown(OIS::KC_LSHIFT))<br> {mDirection.z = -10*mMove;}<br> break;<br> <br> case OIS::KC_DOWN:<br> case OIS::KC_S:<br> mDirection.z = mMove;<br> if(mKeyboard->isKeyDown(OIS::KC_LSHIFT))<br> {mDirection.z = 10*mMove;}<br> break;<br> <br> case OIS::KC_LEFT:<br> case OIS::KC_A:<br> mDirection.x = -mMove;<br> if(mKeyboard->isKeyDown(OIS::KC_LSHIFT))<br> {mDirection.x = -10*mMove;}<br> break;<br> <br> case OIS::KC_RIGHT:<br> case OIS::KC_D:<br> mDirection.x = mMove;<br> if(mKeyboard->isKeyDown(OIS::KC_LSHIFT))<br> {mDirection.x = 10*mMove;}<br> break;<br> <br> case OIS::KC_PGDOWN:<br> case OIS::KC_E:<br> mDirection.y = -mMove;<br> if(mKeyboard->isKeyDown(OIS::KC_LSHIFT))<br> {mDirection.y = -10*mMove;}<br> break;<br> <br> case OIS::KC_PGUP:<br> case OIS::KC_Q:<br> mDirection.y = mMove;<br> if(mKeyboard->isKeyDown(OIS::KC_LSHIFT))<br> {mDirection.y = 10*mMove;}<br> break;<br> <br> case OIS::KC_ESCAPE: <br> mShutDown = true;<br> break;<br> default:<br> break;<br> }</div> <div> return true;<br>}<br>bool basetutorial::keyReleased(const OIS::KeyEvent& arg)<br>{<br> switch (arg.key)<br> {<br> case OIS::KC_UP:<br> case OIS::KC_W:<br> mDirection.z = 0;<br> break;<br> <br> case OIS::KC_DOWN:<br> case OIS::KC_S:<br> mDirection.z = 0;<br> break;<br> <br> case OIS::KC_LEFT:<br> case OIS::KC_A:<br> mDirection.x = 0;<br> break;<br> <br> case OIS::KC_RIGHT:<br> case OIS::KC_D:<br> mDirection.x = 0;<br> break;<br> <br> case OIS::KC_PGDOWN:<br> case OIS::KC_E:<br> mDirection.y = 0;<br> break;<br> <br> case OIS::KC_PGUP:<br> case OIS::KC_Q:<br> mDirection.y = 0;<br> break;<br> <br> default:<br> break;<br> }</div> <div> return true;<br>}<br>bool basetutorial::mouseMoved(const OIS::MouseEvent& arg)<br>{<br> if (arg.state.buttonDown(OIS::MB_Right))<br> {<br> mCamNode->yaw(Ogre::Degree(-mRotate * arg.state.X.rel), Ogre::Node::TS_WORLD);<br> mCamNode->pitch(Ogre::Degree(-mRotate * arg.state.Y.rel), Ogre::Node::TS_LOCAL);<br> }<br> return true;<br>}<br>bool basetutorial::mousePressed(const OIS::MouseEvent& arg, OIS::MouseButtonID id)<br>{<br> Light *light = mSceneMgr->getLight("Light1");<br> <br> <br> <br> switch (id)<br> {<br> case OIS::MB_Left:<br> light->setVisible(! light->isVisible());<br> create_robot();<br> break;<br> default:<br> break;<br> }</div> <div> return true;<br>}<br>bool basetutorial::mouseReleased(const OIS::MouseEvent& arg, OIS::MouseButtonID id)<br>{<br> return true;<br>}<br>void basetutorial::create_robot()<br>{<br> </div> <div> Robot *NewRobot = new Robot;<br> memset(NewRobot, 0, sizeof(Robot));<br> char size_ID[32] = "";<br> sprintf_s(size_ID,32,"ID%d",(int)NewRobot);<br> NewRobot->rEntity = mSceneMgr->createEntity(size_ID,"robot.mesh");<br> NewRobot->rSceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();<br> NewRobot->rSceneNode->attachObject(NewRobot->rEntity);<br> NewRobot->rSceneNode->setPosition(mCamera->getPositionForViewUpdate().x+100,mCamera->getPositionForViewUpdate().y+100,mCamera->getPositionForViewUpdate().z+100);<br> <br> robot_AnimationState = Robot.rEntity->getAnimationState("Idle"); // 이부분입니다 이런식으로 접근하면 정의되지 않은 엔티티라는 에러가 나오더군여 혹시나 싶어서 protect에서 구조체를 선언해도 접근이 안되네여 ㅠㅠ<br> robot_AnimationState->setLoop(true);<br> robot_AnimationState->setEnabled(true);<br> Robot_list.push_back(NewRobot);<br>}</div> <div><br>#endif // #ifndef __basetutorial_h_<br>헤더의 소스는 위와 같습니다 로봇이 리스트쪽에서 생성되면 거기에 애니메이션을 주고 싶은데 방법이 도저히 생각이 안나네요 </div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.