[QT]在Qt中使用Direct3D

先发个找到的原文

http://www.cppblog.com/eros/archive/2009/05/13/82758.html

因为QT使用起来非常方便,也来用一下!

不过因为Dx的头文件在编译的时候N多警告!

不过没事!可以继续!

貌似没有idle事件,难道只能用定时器作更新?

ExpandedBlockStart.gif 代码
class  D3DWidget :  public  QWidget
{
    Q_OBJECT
public :
    
explicit  D3DWidget(QWidget  * parent  =   0 );
    
~ D3DWidget();
    
void  show();
protected :
    
void  init();
    
bool  supportedCheck( IDirect3D9  *  );
protected  slots:
    
void  creatResource();
    
void  frameMove();
    
void  render();
    
void  destory();
    
void  loop();
protected :
    QPaintEngine 
*  paintEngine()  const ;
    
void  paintEvent(QPaintEvent  * );
    
void  timerEvent ( QTimerEvent  *   event  );
private :
  //摄像机控制
    
void  wheelEvent(QWheelEvent  * );
    
void  mousePressEvent(QMouseEvent  * );
    
void  mouseMoveEvent(QMouseEvent  * );
    
void  keyPressEvent(QKeyEvent  * );
    
void  keyReleaseEvent(QKeyEvent  * );
private :
    Ui::D3DWidget 
* ui;
};

 

 

ExpandedBlockStart.gif 代码
D3DWidget::D3DWidget(QWidget  * parent) :
    QWidget(parent),
    ui(
new  Ui::D3DWidget),
    enableHdr(
false )
{
    setWindowTitle(
" Direct3D Window " );
    ui
-> setupUi( this );
    QWidget::setAttribute(Qt::WA_PaintOnScreen, 
true );
    setMouseTracking( 
true  );
}


QPaintEngine 
*  D3DWidget::paintEngine()  const
{
    
return  NULL;
}

void  D3DWidget::paintEvent(QPaintEvent  * )
{
}

void  D3DWidget::show()
{
    
// 初始化错误输出
    errorManager::getInstance().initChannel();
    
// 初始化
    init();
    
// 创建资源
    creatResource();

    QWidget::show();

    getState().lastTickCount.
ref ()  =  GetTickCount();

    startTimer( 
1000   /   40  );
}

void  D3DWidget::timerEvent ( QTimerEvent  *   event  )
{
    
float  curTickCount  =  GetTickCount();
    getState().elapsedTime.
ref ()  =  static_cast < float > ( curTickCount  -  getState().lastTickCount. get () )  /   1000.0f ;
    getState().time.
ref ()  +=  getState().elapsedTime. get ();
    loop();
    
// FPS更新频率
     static   float  update  =   0.5f ;
    update 
-=  getState().elapsedTime. get ();
    
if ( update  <=   0.0f  )
    {
        update 
=   0.5f ;
        setWindowTitle( tr(
" 3D FPS:%1 " ).arg( 1.0f   /  getState().elapsedTime. get ()) );
    }
    getState().lastTickCount.
ref ()  =  curTickCount;
    
event -> accept();
}

void  D3DWidget::loop()
{
    frameMove();

    
if ( isActiveWindow()  &&   ! isHidden() )
        render();
}

void  D3DWidget::render()
{
    LPDIRECT3DDEVICE9 device 
=  getState().d3dDevice. get ();

    device
-> SetTransform( D3DTS_VIEW , getState().camera. get () -> getViewMatrix() );
    device
-> SetTransform( D3DTS_PROJECTION , getState().camera. get () -> getProjectMatrix() );

    device
-> Clear(  0 , NULL, D3DCLEAR_TARGET  |  D3DCLEAR_ZBUFFER, 0  ,  1.0f 0  );
    device
-> BeginScene();

    device
-> EndScene();
    device
-> Present(  0  ,  0  ,  0  ,  0  );
}

 

转载于:https://www.cnblogs.com/olswcsr/archive/2010/12/02/1894393.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值