• <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
            <2006年7月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345


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

            常用鏈接

            留言簿(94)

            隨筆分類(649)

            隨筆檔案(505)

            相冊

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 914431
            • 排名 - 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 七星重劍 閱讀(3990) 評論(0)  編輯 收藏 引用 所屬分類: PL--c/c++Game GraphicsC++ lib -- QtIDE -- visual c++
            97久久超碰成人精品网站| 无码国内精品久久人妻| 国产精品福利一区二区久久| 久久久精品2019免费观看| 成人免费网站久久久| 久久久久久一区国产精品| 久久久久亚洲国产| 久久无码人妻一区二区三区午夜| 99久久成人国产精品免费| 久久国产视屏| 久久精品无码一区二区无码| 2020最新久久久视精品爱| 香蕉99久久国产综合精品宅男自 | 狠狠色婷婷久久一区二区| 亚洲欧美日韩久久精品第一区| 狠狠色丁香婷综合久久| 久久天天躁狠狠躁夜夜2020| 青草国产精品久久久久久| 久久精品国产黑森林| 久久精品www人人爽人人| 亚洲欧美一级久久精品| 色综合久久精品中文字幕首页| 久久久久久久久久久| 久久精品二区| 99久久婷婷国产综合精品草原| 伊人久久无码中文字幕| 久久久久久久综合日本| 99久久久精品免费观看国产| 久久久一本精品99久久精品88| 久久久精品久久久久久 | 欧洲性大片xxxxx久久久| 国产精品久久久久9999| 久久亚洲日韩看片无码| 热久久最新网站获取| 久久久久亚洲精品男人的天堂| 久久国产精品国产自线拍免费| 色欲久久久天天天综合网精品| 99久久人人爽亚洲精品美女| 久久精品国产亚洲欧美| 日韩精品国产自在久久现线拍 | 国产一级持黄大片99久久 |