• <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++
            久久精品亚洲日本波多野结衣 | 欧美激情精品久久久久| 久久天天躁狠狠躁夜夜网站| 久久精品aⅴ无码中文字字幕不卡| 久久久久亚洲av无码专区| av无码久久久久久不卡网站| 久久久久一本毛久久久| 五月丁香综合激情六月久久| 9191精品国产免费久久| 久久久无码精品亚洲日韩京东传媒 | 中文字幕无码久久久| 97精品伊人久久久大香线蕉 | 国产99久久久国产精品~~牛| 久久99久久无码毛片一区二区| 久久人人爽人人爽人人爽| 狠狠狠色丁香婷婷综合久久俺| 久久精品夜色噜噜亚洲A∨ | 久久久精品久久久久特色影视| 无码日韩人妻精品久久蜜桃| 久久精品无码一区二区app| 久久精品国产亚洲AV麻豆网站| 久久国产精品免费一区二区三区| 亚洲国产精品无码久久久秋霞2| 久久e热在这里只有国产中文精品99| 日产精品久久久一区二区| 亚洲综合精品香蕉久久网| 久久久久久精品免费看SSS| 亚洲成色999久久网站| 亚洲精品乱码久久久久久按摩 | 99久久精品国产一区二区三区| 久久精品免费全国观看国产| 99久久国产综合精品成人影院| 久久久噜噜噜www成人网| 无码人妻久久久一区二区三区| 日韩亚洲国产综合久久久| 久久精品国产亚洲av瑜伽| 婷婷久久综合九色综合98| 久久99精品国产麻豆| www久久久天天com| 97热久久免费频精品99| 97精品久久天干天天天按摩|