Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. [SOLVED] Using a vtk renderer in QtQuick
Forum Updated to NodeBB v4.3 + New Features

[SOLVED] Using a vtk renderer in QtQuick

Scheduled Pinned Locked Moved QML and Qt Quick
30 Posts 7 Posters 23.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Z Offline
    Z Offline
    z.emb
    wrote on last edited by
    #13

    That is just a private member variable where I store all the variables. See "here":http://en.wikipedia.org/wiki/Pimpl for more information. This has nothing to do with OpenGL.

    You can also add a normal QOpenGLFramebufferObject* and QSGTexture* pointer to your class.

    1 Reply Last reply
    0
    • M Offline
      M Offline
      Martell Malone
      wrote on last edited by
      #14

      Hi z.emb,

      I'm working on this exact problem also.

      Could you tell me what QSGFboTexture is? and also fbo.get() fbo.reset() ?

      1 Reply Last reply
      0
      • Z Offline
        Z Offline
        z.emb
        wrote on last edited by
        #15

        [quote author="Martell Malone" date="1360770728"]
        What about setting the material and the opaque material do you even use them?

        Is there anything else we should know to get this working?
        I seem to be missing something as it keeps crashing.[/quote]

        No I don't use them. I derived my node from QSGSimpleTextureNode, which handles these things for me, I think. I just need to add my own QSGFboTexture and thats it.

        Like I said above, be sure that you don't access any objects in the preprocess() that are also accessed from the GUI thread.
        For debugging reasons you can do the rendering also in the updatePaintNode() method (in my example in the updateNode() method which is called from updatePaintNode() ) to be sure it is not a threading problem.

        Edit:
        [quote author="Martell Malone" date="1360770728"]
        Could you tell me what QSGFboTexture is? and also fbo.get() fbo.reset() ?
        [/quote]

        QSGFboTexture is my subclass for the FBO texture, just implement the pure virtual functions of QSGTexture:

        @
        void QSGFboTexture::setFbo(QOpenGLFramebufferObject* fbo)
        {
        if(d_data->fbo == fbo)
        return;

        d_data->fbo = fbo;
        d_data->firstTimeBound = true;
        

        }

        void QSGFboTexture::bind()
        {
        if(d_data->fbo == nullptr)
        return;

        auto fboTexture = textureId();
        glBindTexture(GL_TEXTURE_2D, fboTexture);
        
        if(d_data->firstTimeBound) {
            updateBindOptions(true);
            d_data->firstTimeBound = false;
        }
        

        }

        bool QSGFboTexture::hasAlphaChannel() const
        {
        return true;
        }

        bool QSGFboTexture::hasMipmaps() const
        {
        if(d_data->fbo == nullptr)
        return false;

        return d_data->fbo->format().mipmap();
        

        }

        int QSGFboTexture::textureId() const
        {
        if(d_data->fbo == nullptr)
        return 0;

        return d_data->fbo->texture();
        

        }

        QSize QSGFboTexture::textureSize() const
        {
        if(d_data->fbo == nullptr)
        return QSize();

        return d_data->fbo->size();
        

        @

        I use the "std::unique_ptr":http://www.cplusplus.com/reference/memory/unique_ptr/ template. Therefore the get() and reset().

        1 Reply Last reply
        0
        • M Offline
          M Offline
          Martell Malone
          wrote on last edited by
          #16

          Thansk for that z.emb

          I was working basing my code from qt3d before which is why I couldn't get it to work
          http://qt.gitorious.net/qt-labs/qt3d/blobs/83fd6411a16f09b81252d4a4398a1968451754c9/src/imports/threed/viewportfbonode_sg.cpp

          Seems you found the solution ;)

          1 Reply Last reply
          0
          • M Offline
            M Offline
            Martell Malone
            wrote on last edited by
            #17

            glPopAttrib and glPushAttrib are invalid functions?

            You can do beginNativePainting within QPainter to access these functions but I'm guessing thats not what you did.

            Im on qt 5.0.1 ANGLE GLES version

            What header did you include?

            1 Reply Last reply
            0
            • M Offline
              M Offline
              Martell Malone
              wrote on last edited by
              #18

              I've made more progress on getting it working on GLES systems.
              My window flickers for a frame and then goes gray.

              Also for that frame the scene is upside down and a texture is missing.

              The last two things that I wish to ask

              1. I noticed
                setFbo isn't called anywhere?

              and also I have two size methods setRect and setSize

              @void ColorNode::setSize(const QSize size)
              {
              if (size == m_size) return;

              m_size = size;
              //m_fbo = NULL;
              //m_texture = NULL;
              
              QSGGeometry::updateTexturedRectGeometry(&m_geometry,
                                                          QRectF(0, 0, m_size.width(), m_size.height()),
                                                          QRectF(0, 0, 1, 1));
              
              markDirty(DirtyGeometry);
              

              }

              void ColorNode::setRect(const QRectF rect)
              {
              if (m_rect == rect) return

                  markDirty(DirtyGeometry);
                  m_rect = rect;
              

              }@

              I'm guessing yous implementation is different?
              Could I get a quick look :)

              I think I'm really close

              1 Reply Last reply
              0
              • Z Offline
                Z Offline
                z.emb
                wrote on last edited by
                #19

                Actually, I posted almost the whole implementation already, but here you go: "Node":http://pastebin.com/8CgheNzm . The implementation of the texture and the item are already posted.

                bq. I noticed setFbo isn’t called anywhere?

                You may have noticed that I pass the FBO to the constructor of the texture ;-)

                bq. What header did you include?

                I compiled Qt 5.0.0 with ANGLE deactivated and the -opengl desktop flag, because I use VTK which also uses the native OpenGL system.

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  Martell Malone
                  wrote on last edited by
                  #20

                  I need to set the geometry in my setsize or I get nothing in the window.

                  @
                  QSGFboTexture::QSGFboTexture(QGLFramebufferObject* fbo)
                  :QSGTexture()
                  {
                  m_fbo = fbo;

                  // setFbo(fbo);
                  if (m_fbo != NULL)
                  firstTimeBound = true;

                  }
                  @

                  same as setFbo ;-)

                  The problem is that on ANGLE we are using a GLES emulator not OpenGL.
                  Those two functions don't exsist.

                  What happens to your window when you dont call the push and pop?

                  @void ColorNode::preprocess()
                  {
                  if(m_fbo == NULL) return; //will happen a few times

                  QOpenGLContext::currentContext()->functions()->glUseProgram(0);
                  m_fbo->bind();
                  

                  CCDirector::sharedDirector()->mainLoop();

                  m_fbo->release();
                  

                  m_fbo->toImage().save("name.png","png");

                  }@

                  1 Reply Last reply
                  0
                  • Z Offline
                    Z Offline
                    z.emb
                    wrote on last edited by
                    #21

                    Its not working without the push and pop (nothing is rendered, only the background). Unfortunatelly I cannot tell you why, I'm no OpenGL expert.

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      Martell Malone
                      wrote on last edited by
                      #22

                      I think I understand why.
                      The only problem is GLES doest support those functions so how do we get around them?

                      Maybe I should make a new thread to this issue?

                      1 Reply Last reply
                      0
                      • M Offline
                        M Offline
                        Martell Malone
                        wrote on last edited by
                        #23

                        I found a new way of solving this problem.

                        It Involves setting up a separate opengl context and switching between the two before and after binding and releasing the fbo.

                        Any idea how to draw correctly for a y inverted fbo.
                        On qquickpainteditem we can set it to flip but not for the qsgtexture :/

                        1 Reply Last reply
                        0
                        • Z Offline
                          Z Offline
                          z.emb
                          wrote on last edited by
                          #24

                          Hey, thanks for your reply. Can you provide some code how you do that?
                          In my case, it also seems to be the cleanest way to do the same thing and I wan't to try that. :-)

                          For the flipping problem I would naivly just scale (glScale) the y-Axis with -1. But as I mentioned, I'm no OpenGL expert.

                          1 Reply Last reply
                          0
                          • M Offline
                            M Offline
                            Martell Malone
                            wrote on last edited by
                            #25

                            Hey z.emb

                            I used what was on this thread.

                            http://qt-project.org/forums/viewthread/25268/

                            I just changed this line for the flip y.

                            QSGGeometry::updateTexturedRectGeometry(&m_geometry,
                            QRectF(0, 0, m_size.width(), m_size.height()),
                            QRectF(0, 0, 1, 1));

                            to

                            QSGGeometry::updateTexturedRectGeometry(&m_geometry,
                            QRectF(0, 0, m_size.width(), m_size.height()),
                            QRectF(0, 1, 1, -1));//0011 = old y fliped

                            1 Reply Last reply
                            0
                            • Z Offline
                              Z Offline
                              z.emb
                              wrote on last edited by
                              #26

                              Can you give me some code how you switched the GL-context?

                              1 Reply Last reply
                              0
                              • M Offline
                                M Offline
                                Martell Malone
                                wrote on last edited by
                                #27

                                Hey Guys,

                                Apologies about not replying.
                                I didn't realize I got a response.

                                I swapped the context at the very beginning by using the code in this thread

                                http://qt-project.org/forums/viewthread/25268/

                                Hope that helps Ricky, just got your pm.

                                Many Thanks
                                Martell

                                1 Reply Last reply
                                0
                                • R Offline
                                  R Offline
                                  rlonka
                                  wrote on last edited by
                                  #28

                                  Hi,

                                  I still did not get it.
                                  Could you, please, anyone post a full example about rendering vtk to qtquick?
                                  I was trying to understand the discussion but I did not get through...

                                  Best regards,

                                  radek

                                  1 Reply Last reply
                                  0
                                  • R Offline
                                    R Offline
                                    rpetryniak
                                    wrote on last edited by
                                    #29

                                    Hey, I join to this request. Even the simplest example would be helpful.

                                    Regards,
                                    rafal

                                    1 Reply Last reply
                                    0
                                    • N Offline
                                      N Offline
                                      niker91
                                      wrote on last edited by
                                      #30

                                      I have created a repository with code that integrates VTK with Qt QuickControls 2, tested with VTK 8 and Qt 5.9. You can find the code here https://github.com/nicanor-romero/QtVtk with building instructions in the README. Also a brief article about it,
                                      https://blog.bq.com/es/integrating-qtquickcontrols-2-with-vtk/

                                      1 Reply Last reply
                                      0

                                      • Login

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • Users
                                      • Groups
                                      • Search
                                      • Get Qt Extensions
                                      • Unsolved