在Ogre中设置固定流水线的用户自定义裁剪平面的方法

转载请注明出处!Pulas

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

 

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

头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#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
 
实现文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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后,添加自定义裁剪面:
1
2
3
4
5
6
7
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);
posted @   Pulaski  阅读(769)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示