예제 #1
0
 def RenderToDrawBuffer_SceneBoxWire(self, vpMat: QMatrix4x4,
                                     boxSize: QVector3D):
     with uglw.VAOBound(self._vao_blank):
         with uglw.ProgBound(self._sceneBoxWireProgramInfo.__progHandle__):
             glUniform3fv(self._sceneBoxWireProgramInfo.boxSize, 1,
                          utyp.GetTuple(boxSize))
             glUniformMatrix4fv(self._sceneBoxWireProgramInfo.vpMat, 1,
                                GL_FALSE, vpMat.data())
             glDrawArrays(GL_LINES, 0, 24)
예제 #2
0
    def RenderToDrawBuffer_VelocityLine(self, vpMat: QMatrix4x4,
                                        tex3DName_velocity: GLuint,
                                        cellScale: float, lineScale: float):
        with uglw.VAOBound(self._vao_blank):
            with uglw.TextureBound(GL_TEXTURE_3D, tex3DName_velocity):
                with uglw.ProgBound(
                        self._velocityLineProgramInfo.__progHandle__):
                    cellNx2 = self._fieldSize[0] * self._fieldSize[
                        1] * self._fieldSize[2] * 2

                    glUniform1fv(self._velocityLineProgramInfo.lineScale, 1,
                                 lineScale)
                    glUniform1fv(self._velocityLineProgramInfo.cellScale, 1,
                                 cellScale)
                    glUniformMatrix4fv(self._velocityLineProgramInfo.vpMat, 1,
                                       GL_FALSE, vpMat.data())
                    glDrawArrays(GL_LINES, 0, cellNx2)
                    glDrawArrays(GL_POINTS, 0, cellNx2)
예제 #3
0
    def GetSceneBoxCursorIntersection(self, vpMat: QMatrix4x4,
                                      boxSize: QVector3D,
                                      winspaceCursorPos: QPoint,
                                      winspaceDimension: QPoint) -> QVector3D:
        """
        :param winspaceCursorPos: lower-left corner as origin
        :return: 3D world position of cursor interaction
        """

        # render depthImage and get depthValue -------------------------------------------------------------------------
        self._depthInteractionBuffer.RequestBindFBO(winspaceDimension)

        glViewport(0, 0, winspaceDimension.x(), winspaceDimension.y())
        with uglw.VAOBound(self._vao_blank):
            with uglw.ProgBound(self._sceneBoxSurfProgramInfo.__progHandle__):
                with uglw.EnableScope(GL_DEPTH_TEST):
                    glClearBufferfv(GL_DEPTH, 0, (1., ))
                    glUniform3fv(self._sceneBoxSurfProgramInfo.boxSize, 1,
                                 utyp.GetTuple(boxSize))
                    glUniformMatrix4fv(self._sceneBoxSurfProgramInfo.vpMat, 1,
                                       GL_FALSE, vpMat.data())
                    glDrawArrays(GL_TRIANGLES, 0, 3 * 2 * 6)

        winspaceCursorDepthValue = glReadPixels(winspaceCursorPos.x(),
                                                winspaceCursorPos.y(), 1, 1,
                                                GL_DEPTH_COMPONENT,
                                                GL_FLOAT)[0][0]
        # print( winspaceCursorDepthValue )

        glBindFramebuffer(GL_FRAMEBUFFER, 0)

        # unproject cursor into worldCoord -----------------------------------------------------------------------------
        if winspaceCursorDepthValue == 1.0:
            raise ValueError  # cursor ray hit background, no object to manipulate

        return self.GetUnprojection(winspaceCursorPos,
                                    winspaceCursorDepthValue,
                                    winspaceDimension, vpMat)