解析OgreSE源码0

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了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值