• <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
            <2016年11月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910


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

            常用鏈接

            留言簿(94)

            隨筆分類(649)

            隨筆檔案(505)

            相冊

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 917313
            • 排名 - 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 七星重劍 閱讀(3997) 評論(0)  編輯 收藏 引用 所屬分類: PL--c/c++Game GraphicsC++ lib -- QtIDE -- visual c++
            日本久久久久久中文字幕| 污污内射久久一区二区欧美日韩| 亚洲人成无码www久久久| 合区精品久久久中文字幕一区 | 无码人妻久久一区二区三区蜜桃| 久久久这里有精品| 久久Av无码精品人妻系列| 久久99精品国产99久久| 久久免费99精品国产自在现线 | 99久久精品免费看国产一区二区三区 | 一本大道久久东京热无码AV| 久久天堂AV综合合色蜜桃网| 久久精品无码av| 丰满少妇高潮惨叫久久久| 国产一区二区久久久| 91久久精品国产免费直播| 国产精品热久久毛片| 亚洲午夜久久久久妓女影院| 久久久久亚洲av无码专区导航 | 精品久久久久久久久久中文字幕 | 久久久噜噜噜久久| 九九精品99久久久香蕉| 亚洲欧美成人综合久久久| 久久久精品国产亚洲成人满18免费网站 | 国产亚洲成人久久| 国产成人久久精品激情 | 奇米影视7777久久精品人人爽| 久久综合九色综合久99| 久久精品亚洲一区二区三区浴池| 久久天天躁狠狠躁夜夜不卡| 久久精品日日躁夜夜躁欧美| 精品国际久久久久999波多野| 色播久久人人爽人人爽人人片aV| 青青草原综合久久大伊人精品| 久久棈精品久久久久久噜噜| 亚洲AV无码久久寂寞少妇| 久久亚洲国产精品成人AV秋霞| 久久精品视屏| 久久99热这里只频精品6| 四虎国产精品成人免费久久| 日韩精品久久久久久久电影|