• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 505  文章 - 1034  trackbacks - 0
            <2008年3月>
            2425262728291
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345


            子曾經曰過:編程無他,唯手熟爾!

            常用鏈接

            留言簿(94)

            隨筆分類(649)

            隨筆檔案(505)

            相冊

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 911842
            • 排名 - 14

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            用優秀的UI庫Qt試驗下 ^_^,折騰了接近一天,才能畫出來,但是動畫不動。
            截圖


            現在的問題是只有“臟”了才畫,也就是才去調用如下的method;不是三角形沒動,是動了但是沒畫出來,我們看不見。
            void QD3DWidget::paintEvent( QPaintEvent* )
            {
                
            if (updatesEnabled()) 
                {
                    d3dDraw();
                }
            }

            用個timer去解決這個問題?

            這老外的帖子對我幫助很大,不搞下面的兩條整個QD3DWidget都看不到:

            Using Direct3D 9 with Qt - flicker problem

            According to the Qt docs, if you want to use GDI or Direct3D on Windows with Qt, you need to:

            1) Override QWidget::paintEngine to return NULL
            2) Call QWidget::setAttribute(Qt::WA_PaintOnScreen, true)  

            部分代碼
            HRESULT InitD3D( HWND hWnd )
            {
                
            // Create the D3D object.
                if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
                    
            return E_FAIL;

                
            // Set up the structure used to create the D3DDevice
                D3DPRESENT_PARAMETERS d3dpp;
                ZeroMemory( 
            &d3dpp, sizeof(d3dpp) );
                d3dpp.Windowed 
            = TRUE;
                d3dpp.SwapEffect 
            = D3DSWAPEFFECT_DISCARD;
                d3dpp.BackBufferFormat 
            = D3DFMT_UNKNOWN;

                
            // Create the D3DDevice
                if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                    
            &d3dpp, &g_pd3dDevice ) ) )
                {
                    
            return E_FAIL;
                }

                
            // Turn off culling, so we see the front and back of the triangle
                
            // 關閉剔除,以便三角形的前后都能被我們看到
                g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

                
            // Turn off D3D lighting, since we are providing our own vertex colors
                
            // 關閉D3D光照,因為我們提供我們自己的頂點顏色
                g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

                
            return S_OK;
            }


            QD3DWidget.h
            #ifndef QD3DWIDGET_H
            #define QD3DWIDGET_H

            #include 
            <QWidget>

            class QD3DWidget : public QWidget
            {
                Q_OBJECT

            public:
                QD3DWidget(QWidget 
            *parent = 0);
                
            ~QD3DWidget();

                
            //QSize minimumSizeHint() const;
                
            //QSize sizeHint() const;

                QPaintEngine 
            *paintEngine() const;
            protected:
                
            virtual void initializeD3D();
                
            virtual void paintD3D();

                
            void paintEvent(QPaintEvent*);

                
            virtual void d3dInit();
                
            virtual void d3dDraw();

                
            bool initialized() constreturn m_bInit; }
            private:
                
            bool m_bInit;
            };

            #endif // QD3DWIDGET_H


            QD3DWidget.cpp
            #include "QD3DWidget.h"

            #include 
            "Matrices.h"

            QD3DWidget::QD3DWidget(QWidget 
            *parent)
                : QWidget(parent)
                , m_bInit(
            false)
            {
                resize(QSize(
            400300));
                setAttribute(Qt::WA_PaintOnScreen, 
            true);
            }

            QD3DWidget::
            ~QD3DWidget()
            {

            }

            void QD3DWidget::initializeD3D()
            {
                InitD3D(
            /*this->topLevelWidget()->*/winId());
                InitGeometry();

                m_bInit 
            = true;
            }

            void QD3DWidget::paintD3D()
            {
                
            // lyl: 真正要畫的東西放這兒
                Render();
            }

            void QD3DWidget::paintEvent( QPaintEvent* )
            {
                
            if (updatesEnabled()) 
                {
                    d3dDraw();
                }
            }

            void QD3DWidget::d3dInit()
            {
                initializeD3D();
            }

            void QD3DWidget::d3dDraw()
            {
                
            if (!initialized())
                {
                    d3dInit();
                }
                paintD3D();
            }

            //QSize QD3DWidget::minimumSizeHint() const
            //{
            //    return QSize(50, 50);
            //}
            //
            //QSize QD3DWidget::sizeHint() const
            //{
            //    return QSize(200, 200);
            //}

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


            2008-11-26 PM 21:30  用個timer讓動畫顯示出來了,每隔20ms就強制畫一下,參考了Qt 的例子opengl/textures
                QTimer *timer = new QTimer(this);
                connect(timer, SIGNAL(timeout()), 
            this, SLOT(rotateOneStep()));
                timer
            ->start(20);

            2010-09-06 AM 2:55 【重劍注:時光匆匆,竟然已是快過去兩年了!今日看了下Ogitor的代碼,0.4.2版本看起來已是相當完善,電腦上有0.3的代碼,隨便看下其render loop】

            Ogitor 0.3里面也是用的Timer的方式
            MainWindow.cpp   MainWindow的構造函數中
                mTimer = new QTimer(this);
                mTimer
            ->setInterval(0);
                connect(mTimer, SIGNAL(timeout()), 
            this, SLOT(timerLoop()));
                mTimer
            ->start();
            看timerLoop的代碼,可知窗口不最小化時,setInterval為50.
            void MainWindow::timerLoop()
            {
                if(mHasFileArgs)
                {
                    if(mOgreWidget->mOgreInitialised)
                    {
                        OgitorsRoot::getSingletonPtr()->LoadScene(mArgsFile.toStdString());
                        mHasFileArgs = false;
                        mOgreWidget->setDoLoadFile(false);
                    }
                }
                
                if(isMinimized())
                {
                    if(mTimer->interval() != 200)
                        mTimer->setInterval(200); 
                    return;
                }
                else
                {
                    if(mTimer->interval() != 50)
                        mTimer->setInterval(50); 
                }

                updateActions();

                if(OgitorsRoot::getSingletonPtr()->IsSceneLoaded())
                {
                    mOgreWidget->ProcessKeyActions();
                }

                LogDataVector messages;
                LOGBUFFER.getBuffer(messages);

                for(unsigned int i = 0;i < messages.size();i++)
                {
                    updateLog(new QListWidgetItem(messages[i].mMessage, 0, messages[i].mLevel) );
                }
                
                if(messages.size() > 0)
                    logWidget->scrollToBottom();
            }

            不過這個timerLoop里面沒有渲染的代碼啊!改天再看了!睡覺!
            ogrewidget.hxx
            public Q_SLOTS:
                
            void timerLoop();
            ogrewidget.cpp
            void OgreWidget::timerLoop()
            {
                
            if(mOgitorMainWindow->isMinimized())
                    
            return;

                
            if(mRenderStop)
                {
                    
            if(QMessageBox::information(this,"qtOgitor", tr("Render Device is Lost! Please click ok to continue.."), QMessageBox::Ok) == QMessageBox::Ok)
                        mRenderStop 
            = false;
                }
                update();
            }





            posted on 2008-11-26 17:25 七星重劍 閱讀(3983) 評論(0)  編輯 收藏 引用 所屬分類: PL--c/c++Game GraphicsC++ lib -- QtIDE -- visual c++
            久久久久久精品久久久久| 97精品伊人久久久大香线蕉| 亚洲国产精品成人久久蜜臀 | 久久精品欧美日韩精品| 国产国产成人精品久久| 日韩精品无码久久一区二区三| 久久精品天天中文字幕人妻| 国产精品激情综合久久| 久久WWW免费人成一看片| yellow中文字幕久久网| 亚洲精品高清国产一线久久| 久久久久九九精品影院| 99re久久精品国产首页2020| 中文字幕精品久久| 久久99精品久久久久久不卡| 午夜天堂精品久久久久| 亚洲人成无码久久电影网站| 精品一区二区久久| 久久国产免费观看精品3| 热久久视久久精品18| 久久精品国产亚洲5555| 久久伊人精品青青草原高清| 久久国内免费视频| 色偷偷88欧美精品久久久| 亚洲国产精品一区二区久久| 久久婷婷国产综合精品| 亚洲AV无码久久精品成人| 久久婷婷国产剧情内射白浆| 久久久久亚洲精品男人的天堂| 色综合久久久久网| 国内精品久久久久久麻豆| 青青国产成人久久91网| 99久久精品免费观看国产| 欧美伊香蕉久久综合类网站| 久久精品国产秦先生| 久久线看观看精品香蕉国产| 久久久久久国产精品无码超碰| 久久久久免费看成人影片| 99麻豆久久久国产精品免费| 国产一区二区三区久久精品| 7国产欧美日韩综合天堂中文久久久久 |