zoukankan      html  css  js  c++  java
  • 在Ogre中设置固定流水线的用户自定义裁剪平面的方法

    转载请注明出处!Pulas

    http://www.cnblogs.com/pulas/archive/2012/02/16/2354542.html

    首先自定义一个场景管理器的监听器.

    头文件:

    #ifndef __CustomSceneManagerListener_H__
    #define __CustomSceneManagerListener_H__
    
    #include <Ogre.h>
    
    class CCustomSceneManagerListener : public Ogre::SceneManager::Listener
    {
    public:
    	CCustomSceneManagerListener();
    	~CCustomSceneManagerListener();
     
    public:
    	/** Called prior to searching for visible objects in this SceneManager.
    	@remarks
    		Note that the render queue at this stage will be full of the last
    		render's contents and will be cleared after this method is called.
    	@param source The SceneManager instance raising this event.
    	@param irs The stage of illumination being dealt with. IRS_NONE for 
    		a regular render, IRS_RENDER_TO_TEXTURE for a shadow caster render.
    	@param v The viewport being updated. You can get the camera from here.
    	*/
    	virtual void preFindVisibleObjects(Ogre::SceneManager* source, Ogre::SceneManager::IlluminationRenderStage irs, Ogre::Viewport* v);
    
    public:
    	/** Sets the user clipping region.
    	*/
    	virtual void setClipPlanes(const Ogre::PlaneList& clipPlanes);
    
    	/** Add a user clipping plane. */
    	virtual void addClipPlane (const Ogre::Plane &p);
    	/** Add a user clipping plane. */
    	virtual void addClipPlane (Ogre::Real A, Ogre::Real B, Ogre::Real C, Ogre::Real D);
    
    	/** Clears the user clipping region.
    	*/
    	virtual void resetClipPlanes();
    
    	void enableClipPlane(bool bEnable);
    
    	bool isClipPlaneEnabled();
    
    protected:
    	// Recording user clip planes
    	Ogre::PlaneList m_ClipPlanes;
    
    	bool m_bEnableClipPlane;
    };
    
    #endif
     
    实现文件:
    #include "stdafx.h"
    #include "CustomSceneManagerListener.h"
    using namespace Ogre;
    
    CCustomSceneManagerListener::CCustomSceneManagerListener() : m_bEnableClipPlane(true)
    {
    }
    
    CCustomSceneManagerListener::~CCustomSceneManagerListener()
    {
    }
    
    void CCustomSceneManagerListener::preFindVisibleObjects(Ogre::SceneManager* source, Ogre::SceneManager::IlluminationRenderStage irs, Ogre::Viewport* v)
    {
    	if (m_bEnableClipPlane)
    	{
    		Ogre::Root::getSingletonPtr()->getRenderSystem()->setClipPlanes(m_ClipPlanes);
    	}
    }
    
    //---------------------------------------------------------------------
    void CCustomSceneManagerListener::addClipPlane (const Plane &p)
    {
    	m_ClipPlanes.push_back(p);
    }
    //---------------------------------------------------------------------
    void CCustomSceneManagerListener::addClipPlane (Real A, Real B, Real C, Real D)
    {
    	addClipPlane(Plane(A, B, C, D));
    }
    //---------------------------------------------------------------------
    void CCustomSceneManagerListener::setClipPlanes(const PlaneList& clipPlanes)
    {
    	if (clipPlanes != m_ClipPlanes)
    	{
    		m_ClipPlanes = clipPlanes;
    	}
    }
    //---------------------------------------------------------------------
    void CCustomSceneManagerListener::resetClipPlanes()
    {
    	if (!m_ClipPlanes.empty())
    	{
    		m_ClipPlanes.clear();
    	}
    }
    
    void CCustomSceneManagerListener::enableClipPlane( bool bEnable )
    {
    	m_bEnableClipPlane = bEnable;
    }
    
    bool CCustomSceneManagerListener::isClipPlaneEnabled()
    {
    	return m_bEnableClipPlane;
    }
     
    在初始化完Ogre后,添加自定义裁剪面:
    m_pCustomSceneManagerListener = new CCustomSceneManagerListener;
    mSceneMgr->addListener(m_pCustomSceneManagerListener);
    
    Ogre::Plane SectionClipPlane;
    SectionClipPlane.normal = Ogre::Vector3::NEGATIVE_UNIT_Y;
    SectionClipPlane.d = -4.9;
    m_pCustomSceneManagerListener->addClipPlane(SectionClipPlane);
  • 相关阅读:
    SqlDependency和SqlCacheDependency的若干说明
    sublime 3 随笔
    [有得]解决redmine写操作很慢的问题
    Java双重循环
    使用 Docker 打包 Rust Web 服务
    Centos8.3、hadoop-2.6.4 简单的日志分析实验
    广域网数据交换的三种方式
    计算机的起源与发展
    推荐两款生成数据库表结构说明文档工具
    Centos8.3、docker部署springboot项目实战记录
  • 原文地址:https://www.cnblogs.com/pulas/p/2354542.html
Copyright © 2011-2022 走看看