• <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
            <2007年11月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678


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

            常用鏈接

            留言簿(94)

            隨筆分類(649)

            隨筆檔案(505)

            相冊

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 911346
            • 排名 - 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++
            久久精品国产亚洲一区二区| 午夜精品久久久久久毛片| 久久青青草原亚洲av无码app| 欧美国产成人久久精品| 久久精品无码一区二区app| 丰满少妇人妻久久久久久4| 亚洲午夜久久影院| 国产L精品国产亚洲区久久| 99久久精品国产一区二区蜜芽| 99久久精品国产一区二区| 99国内精品久久久久久久| 嫩草影院久久国产精品| 精品熟女少妇aⅴ免费久久| 久久精品无码av| 国产精品久久久久久久人人看| 精品久久久久久国产| 久久久一本精品99久久精品66 | 久久青青草原精品影院| 久久国产精品久久国产精品| 99热精品久久只有精品| 欧洲国产伦久久久久久久| 亚洲综合伊人久久综合| 久久精品国产亚洲网站| 欧美麻豆久久久久久中文| 亚洲AV无码久久精品成人| 2020久久精品国产免费| 久久人妻少妇嫩草AV蜜桃| 久久天天躁狠狠躁夜夜avapp | 色综合久久中文字幕无码| 精品999久久久久久中文字幕| 热综合一本伊人久久精品| 国产亚洲精久久久久久无码77777| 99久久精品国产高清一区二区 | 2021久久精品国产99国产精品| 久久国产精品免费一区二区三区 | 国内精品久久久久影院优 | 久久无码国产专区精品| 国产免费久久精品99久久| 伊人久久大香线蕉av不卡| 精品欧美一区二区三区久久久| 久久久久久夜精品精品免费啦|