OgreSE的源码下载自http://blog.youkuaiyun.com/rainofei/article/category/693040,感谢Rainofei提供的源码,才能让我看到地形编辑器是如何制作的。
刚开始看,也开始学习ogre不久,所以看着还有点吃力。
今天看到 场景管理器的ObjectEditHandler.h ObjectEditHandler.cpp时候感觉有点吃力了,尤其是他的构造函数,不知道具体它要做什么。所以就抽出了一些代码,拿出来看了看 感觉好多了。以下是我的代码的以及简单的分析。
void GameState::createScene()
{
Ogre::SceneNode* m_pNodeTransScale; // 挂接移动和缩放指示器的节点
Ogre::SceneNode* m_pNodeRotate; // 挂接旋转指示器的节点
Ogre::MaterialPtr m_Material[5];
Ogre::SceneNode* m_pNode;
m_pNode=m_pSceneMgr->getRootSceneNode()->createChildSceneNode();
m_Material[0] = Ogre::MaterialManager::getSingletonPtr()->getByName("OgreSE/RedMat"); //red material
m_Material[1] = Ogre::MaterialManager::getSingletonPtr()->getByName("OgreSE/GreenMat");
m_Material[2] = Ogre::MaterialManager::getSingletonPtr()->getByName("OgreSE/BlueMat");
m_Material[3] = Ogre::MaterialManager::getSingletonPtr()->getByName("OgreSE/ObjectIndicatorYellowMat");
m_Material[4] = Ogre::MaterialManager::getSingletonPtr()->getByName("OgreSE/ObjectIndicatorWhiteMat");
std::string name="AxisManipulator";
Ogre::SceneNode *pNode;
Ogre::Entity* pEntity;
Ogre::MovableObjectFactory *factory=
Ogre::Root::getSingleton().getMovableObjectFactory(Ogre::EntityFactory::FACTORY_TYPE_NAME);
Ogre::NameValuePairList params;
m_pNodeTransScale = m_pNode->createChildSceneNode("<Trans_Scale_Manipulator>");// 挂接移动和缩放指示器的节点
m_pNodeTransScale->setScale(200,200,200);
pNode = m_pNodeTransScale->createChildSceneNode();
pNode->roll(Ogre::Degree(-90));
pEntity=m_pSceneMgr->createEntity(name+"TRANSLATE_X_LINE","MoveArrowLineVisible.mesh");
pEntity->setQueryFlags(0);
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[0]);//红
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
pEntity = m_pSceneMgr->createEntity(name + "TRANSLATE_X_CONE", "MoveArrowConeVisible.mesh");
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[0]);//红
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
params["mesh"] = "MoveArrowCollision.mesh";
pEntity =(Ogre::Entity*)factory->createInstance(name + "TRANSLATE_X_COL", m_pSceneMgr, ¶ms);
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pNode->attachObject(pEntity);
pEntity->setVisible(false);
pNode=m_pNodeTransScale;
pEntity = m_pSceneMgr->createEntity(name + "TRANSLATE_Y_LINE", "MoveArrowLineVisible.mesh");
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[1]);
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
pEntity = m_pSceneMgr->createEntity(name + "TRANSLATE_Y_CONE", "MoveArrowConeVisible.mesh");
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[1]);
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
params["mesh"] = "MoveArrowCollision.mesh";
pEntity =(Ogre::Entity*)factory->createInstance(name + "TRANSLATE_Y_COL", m_pSceneMgr, ¶ms);
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pNode->attachObject(pEntity);
pEntity->setVisible(false);
pNode = m_pNodeTransScale->createChildSceneNode();
pNode->pitch(Ogre::Degree(90));
pEntity = m_pSceneMgr->createEntity(name + "TRANSLATE_Z_LINE", "MoveArrowLineVisible.mesh");
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[2]);
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
pEntity = m_pSceneMgr->createEntity(name + "TRANSLATE_Z_CONE", "MoveArrowConeVisible.mesh");
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[2]);
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
params["mesh"] = "MoveArrowCollision.mesh";
pEntity =(Ogre::Entity*)factory->createInstance(name + "TRANSLATE_Z_COL", m_pSceneMgr, ¶ms);
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pNode->attachObject(pEntity);
pEntity->setVisible(false);
pNode = m_pNodeTransScale;
params["mesh"] = "Box1m.mesh";
pEntity =(Ogre::Entity*)factory->createInstance(name + "TRANSLATE_XYZ", m_pSceneMgr, ¶ms);
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[4]);
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
m_pNode->removeChild(m_pNodeTransScale);
m_pNodeRotate = m_pNode->createChildSceneNode("<Rotate_Manipulator>");
m_pNodeRotate->setScale(200,200,200);
pNode = m_pNodeRotate;
pEntity = m_pSceneMgr->createEntity(name + "ROTATE_Y", "RotationRingVisible.mesh");
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[1]);
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
params["mesh"] = "RotationRingCollision.mesh";
pEntity =(Ogre::Entity*)factory->createInstance(name + "ROTATE_Y_COL", m_pSceneMgr, ¶ms);
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pNode->attachObject(pEntity);
pEntity->setVisible(false);
pNode = m_pNodeRotate->createChildSceneNode();
pNode->roll(Ogre::Degree(90));
pEntity = m_pSceneMgr->createEntity(name + "ROTATE_X", "RotationRingVisible.mesh");
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[0]);
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
params["mesh"] = "RotationRingCollision.mesh";
pEntity =(Ogre::Entity*)factory->createInstance(name + "ROTATE_X_COL", m_pSceneMgr, ¶ms);
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pNode->attachObject(pEntity);
pEntity->setVisible(false);
pNode = m_pNodeRotate->createChildSceneNode();
pNode->pitch(Ogre::Degree(90));
pEntity = m_pSceneMgr->createEntity(name + "ROTATE_Z", "RotationRingVisible.mesh");
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pEntity->setMaterial(m_Material[2]);
pEntity->setRenderQueueGroup(Ogre::RENDER_QUEUE_8);
pNode->attachObject(pEntity);
params["mesh"] = "RotationRingCollision.mesh";
pEntity =(Ogre::Entity*)factory->createInstance(name + "ROTATE_Z_COL", m_pSceneMgr, ¶ms);
pEntity->setQueryFlags(0);
pEntity->setCastShadows(false);
pNode->attachObject(pEntity);
pEntity->setVisible(false);
m_pNode->removeChild(m_pNodeRotate);
}
所以,就得出的结论是,这个构造函数仅仅是为了存储7个实体对象,同时这7个实体对应的是8中状态AxisMode包含的。之后可以根据这7中状态来操作SceneNode了。