def add_control_pane(self, fixed_width=270):
        self.vpane = ZVerticalPane(self, fixed_width)

        self.rotator = ZLabeledSlider(self, "Rotator", False, self.MIN_ANGLE,
                                      self.MAX_ANGLE, self.CUR_ANGLE)

        self.axisPositioner = ZPositioner(self, "AXISPositioner",
                                          ["X", "Y", "Z"], self.AXIS_RANGE,
                                          self.AXIS_POS)

        self.eyePositioner = ZEyePositioner(self, "EyePositioner",
                                            ["X", "Y", "Z"], self.EYE_RANGE,
                                            self.EYE_POS)

        self.lightPositioner = ZLightPositioner(self, "LightPositioner",
                                                ["X", "Y", "Z"],
                                                self.LIGHT_RANGE,
                                                self.LIGHT_POS)

        self.vpane.add(self.rotator)
        self.vpane.add(self.axisPositioner)

        self.vpane.add(self.eyePositioner)
        self.vpane.add(self.lightPositioner)

        self.set_right_dock(self.vpane)
  def add_control_pane(self, fixed_width=270):
    self.vpane = ZVerticalPane(self, fixed_width)

    self.colorPositioner = ZColorPositioner(self, "ColorPositioner",["R", "G", "B"],
                               self.COLOR_RANGE, self.COLOR_POS)

    self.eyePositioner   = ZEyePositioner(self, "EyePositioner", ["X", "Y", "Z"],
                               self.EYE_RANGE, self.EYE_POS)
    
    self.lightPositioner = ZLightPositioner(self, "LightPositioner", ["X", "Y", "Z"],
                               self.LIGHT_RANGE, self.LIGHT_POS)

    self.vpane.add(self.colorPositioner)
    self.vpane.add(self.eyePositioner)
    self.vpane.add(self.lightPositioner)

    self.set_right_dock(self.vpane)
class MainView(ZOpenGLMainView):
    ##--------------------------------------------
    class OpenGLView(ZOpenGLView):
        def __init__(self, parent, color, eye, light):
            #self.parent = parent
            super(ZOpenGLView, self).__init__(parent)
            self.angle = 0
            self.vcolor = color
            self.veye = eye
            self.vlight = light

        def initializeGL(self):
            glEnable(GL_DEPTH_TEST)
            glMatrixMode(GL_PROJECTION)
            glLoadIdentity()
            glMatrixMode(GL_MODELVIEW)

            self.light = ZOpenGLLight()
            self.material = ZOpenGLMaterial(GL_FRONT)
            self.geometry = ZOpenGLGeometry(None)

        def paintGL(self):
            glFrustum(1, -1, -1, 1, 1, 10)

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
            glLoadIdentity()
            glMatrixMode(GL_MODELVIEW)
            glClearColor(1.0, 1.0, 1.0, 1.0)
            glTranslate(-0.5, -0.5, 0.0)

            gluLookAt(self.veye[0], self.veye[1], self.veye[2], 0.0, 0.0, 0.0,
                      0.0, 1.0, 0.0)

            glRotate(0.0, 0.0, 1.0, 0.0)

            glEnable(GL_LIGHTING)
            self.light.position(self.vlight[0], self.vlight[1], self.vlight[2],
                                0.0)

            self.material.diffuse(self.vcolor[0] / 255.0,
                                  self.vcolor[1] / 255.0,
                                  self.vcolor[2] / 255.0, 0.0)

            self.material.specular(1.0, 1.0, 1.0, 0.0)
            self.material.shininess(100.0)

            glFrontFace(GL_CCW)

            glEnable(GL_CULL_FACE)
            glCullFace(GL_BACK)
            glEnable(GL_NORMALIZE)

            glPushMatrix()
            self.geometry.solidTeapot(2.0)
            glPopMatrix()

            glFlush()

        def resizeGL(self, width, height):
            side = min(width, height)
            if side < 0: return
            glViewport(0, 0, width, height)
            glMatrixMode(GL_PROJECTION)
            glLoadIdentity()
            gluPerspective(16.0, width / height, 0.5, 40.0)

            glMatrixMode(GL_MODELVIEW)

        def setColorPosition(self, color):
            self.vcolor = color
            self.update()

        def setEyePosition(self, eye):
            self.veye = eye
            self.update()

        def setLigtPosition(self, light):
            self.vlight = light
            self.update()

    ##--------------------------------------------

    # class variables
    COLOR_RANGE = [0, 255]
    COLOR_POS = [0.0, 0.0, 255.0]
    EYE_RANGE = [-40, 40]
    EYE_POS = [2.0, 0.0, 30.0]
    LIGHT_RANGE = [-40, 40]
    LIGHT_POS = [30.0, -10.0, -30.0]

    # MainView Constructor
    def __init__(self, title, x, y, width, height):
        super(ZOpenGLMainView, self).__init__(title, x, y, width, height)
        # 1 Create first imageview.

        self.opengl_view = self.OpenGLView(self, self.COLOR_POS, self.EYE_POS,
                                           self.LIGHT_POS)

        # 2 Add the image view to a main_layout of this main view.
        self.add(self.opengl_view)

        # 4 Add callbacks to positioners.
        self.colorPositioner.add_value_changed_callback(self.color_changed)
        self.eyePositioner.add_value_changed_callback(self.eye_changed)
        self.lightPositioner.add_value_changed_callback(self.light_changed)

        self.show()

    # Add control pane to MainView
    def add_control_pane(self, fixed_width=270):
        self.vpane = ZVerticalPane(self, fixed_width)

        self.colorPositioner = ZColorPositioner(self, "ColorPositioner",
                                                ["R", "G", "B"],
                                                self.COLOR_RANGE,
                                                self.COLOR_POS)

        self.eyePositioner = ZEyePositioner(self, "EyePositioner",
                                            ["X", "Y", "Z"], self.EYE_RANGE,
                                            self.EYE_POS)

        self.lightPositioner = ZLightPositioner(self, "LightPositioner",
                                                ["X", "Y", "Z"],
                                                self.LIGHT_RANGE,
                                                self.LIGHT_POS)

        self.vpane.add(self.colorPositioner)
        self.vpane.add(self.eyePositioner)
        self.vpane.add(self.lightPositioner)

        self.set_right_dock(self.vpane)

    def color_changed(self, v):
        values = self.colorPositioner.get_values()
        self.opengl_view.setColorPosition(values)

    def eye_changed(self, v):
        values = self.eyePositioner.get_values()
        self.opengl_view.setEyePosition(values)

    def light_changed(self, v):
        values = self.lightPositioner.get_values()
        self.opengl_view.setLigtPosition(values)
Ejemplo n.º 4
0
class MainView(ZOpenGLMainView):
    ##--------------------------------------------
    class OpenGLView(ZOpenGLView):
        def __init__(self, parent, color, eye, light):
            #self.parent = parent
            super(ZOpenGLView, self).__init__(parent)
            self.angle = 0
            self.vcolor = color
            self.veye = eye
            self.vlight = light

        def initializeGL(self):
            glEnable(GL_DEPTH_TEST)
            glMatrixMode(GL_PROJECTION)
            glLoadIdentity()
            glMatrixMode(GL_MODELVIEW)

            self.light = ZOpenGLLight()
            self.material = ZOpenGLMaterial(GL_FRONT)

            self.vertices = [
                [-1.0, -1.0, 1.0],
                [1.0, -1.0, 1.0],
                [1.0, -1.0, -1.0],
                [-1.0, -1.0, -1.0],
                [0.0, 1.0, 0.0],
            ]

            self.indices = [
                [0, 1, 4],  #Triangle: face1
                [1, 2, 4],  #Triangle: face2
                [2, 3, 4],  #Triangle: face3
                [3, 0, 4],  #Triangle] face4
            ]

            self.surfaces = ZOpenGLTriangleSurfaces(self.vertices,
                                                    self.indices)
            self.normals = self.surfaces.calculateSurfaceNormals()

        def paintGL(self):
            glFrustum(1, -1, -1, 1, 1, 10)

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
            glLoadIdentity()
            glMatrixMode(GL_MODELVIEW)
            glClearColor(1.0, 1.0, 1.0, 1.0)
            glTranslate(-0.5, -0.5, 0.0)

            gluLookAt(self.veye[0], self.veye[1], self.veye[2], 0.0, 0.0, 0.0,
                      0.0, 1.0, 0.0)

            glRotate(0.0, 0.0, 1.0, 0.0)

            #glTranslate(0.0, 0.0, -1.0)

            #glEnableClientState(GL_VERTEX_ARRAY)
            #glEnableClientState(GL_COLOR_ARRAY)

            #avertices =  np.array(self.vertices, dtype="float32")

            #glVertexPointer(3, GL_FLOAT, 0, self.avertices)
            #nindices     =  np.array(self.indices, dtype="uint32")

            glEnable(GL_LIGHTING)
            self.light.position(self.vlight[0], self.vlight[1], self.vlight[2],
                                0.0)
            self.material.diffuse(self.vcolor[0] / 255.0,
                                  self.vcolor[1] / 255.0,
                                  self.vcolor[2] / 255.0, 0.0)

            self.material.specular(1.0, 1.0, 1.0, 0.0)
            self.material.shininess(100.0)

            glFrontFace(GL_CCW)

            glEnable(GL_CULL_FACE)
            glCullFace(GL_BACK)
            glEnable(GL_NORMALIZE)
            for i in range(len(self.indices)):
                glBegin(GL_TRIANGLES)
                tri = self.indices[i]
                self.draw(self.normals[i], self.vertices[tri[0]],
                          self.vertices[tri[1]], self.vertices[tri[2]])
                glEnd()
                glFlush()

            #glDisableClientState(GL_VERTEX_ARRAY)
            #glDisableClientState(GL_COLOR_ARRAY)

            glFlush()

        def resizeGL(self, width, height):
            side = min(width, height)
            if side < 0: return
            glViewport(0, 0, width, height)
            glMatrixMode(GL_PROJECTION)
            glLoadIdentity()
            gluPerspective(16.0, width / height, 0.5, 40.0)

            glMatrixMode(GL_MODELVIEW)

        def draw(self, n, v1, v2, v3):
            glNormal3fv(n)
            glVertex3fv(v1)
            glVertex3fv(v2)
            glVertex3fv(v3)

        def setColorPosition(self, color):
            self.vcolor = color
            self.update()

        def setEyePosition(self, eye):
            self.veye = eye
            self.update()

        def setLigtPosition(self, light):
            self.vlight = light
            self.update()

    ##--------------------------------------------

    # class variables
    COLOR_RANGE = [0, 255]
    COLOR_POS = [0.0, 0.0, 255.0]
    EYE_RANGE = [-40, 40]
    EYE_POS = [2.0, 0.0, 30.0]
    LIGHT_RANGE = [-40, 40]
    LIGHT_POS = [30.0, -10.0, -30.0]

    # MainView Constructor
    def __init__(self, title, x, y, width, height):
        super(ZOpenGLMainView, self).__init__(title, x, y, width, height)
        # 1 Create first imageview.

        self.opengl_view = self.OpenGLView(self, self.COLOR_POS, self.EYE_POS,
                                           self.LIGHT_POS)

        # 2 Add the image view to a main_layout of this main view.
        self.add(self.opengl_view)

        # 4 Add callbacks to positioners.
        self.colorPositioner.add_value_changed_callback(self.color_changed)
        self.eyePositioner.add_value_changed_callback(self.eye_changed)
        self.lightPositioner.add_value_changed_callback(self.light_changed)

        self.show()

    # Add control pane to MainView
    def add_control_pane(self, fixed_width=270):
        self.vpane = ZVerticalPane(self, fixed_width)

        self.colorPositioner = ZColorPositioner(self, "ColorPositioner",
                                                ["R", "G", "B"],
                                                self.COLOR_RANGE,
                                                self.COLOR_POS)

        self.eyePositioner = ZEyePositioner(self, "EyePositioner",
                                            ["X", "Y", "Z"], self.EYE_RANGE,
                                            self.EYE_POS)

        self.lightPositioner = ZLightPositioner(self, "LightPositioner",
                                                ["X", "Y", "Z"],
                                                self.LIGHT_RANGE,
                                                self.LIGHT_POS)

        self.vpane.add(self.colorPositioner)
        self.vpane.add(self.eyePositioner)
        self.vpane.add(self.lightPositioner)

        self.set_right_dock(self.vpane)

    def color_changed(self, v):
        values = self.colorPositioner.get_values()
        self.opengl_view.setColorPosition(values)

    def eye_changed(self, v):
        values = self.eyePositioner.get_values()
        self.opengl_view.setEyePosition(values)

    def light_changed(self, v):
        values = self.lightPositioner.get_values()
        self.opengl_view.setLigtPosition(values)
class MainView(ZOpenGLMainView):
    ##--------------------------------------------
    class OpenGLView(ZOpenGLView):
        def __init__(self, parent, angle, axis, eye, light):
            self.parent = parent
            super(ZOpenGLView, self).__init__(parent)
            self.angle = angle
            self.axis = axis
            self.veye = eye
            self.vlight = light

        def initializeGL(self):
            #glShadeModel(GL_FLAT)
            #glEnable(GL_DEPTH_TEST)
            #glMatrixMode(GL_PROJECTION)
            #glLoadIdentity()
            #glMatrixMode(GL_MODELVIEW)

            self.light = ZOpenGLLight(GL_LIGHT0)

            #self.material = ZOpenGLMaterial(GL_FRONT)
            self.sphere = None

            filename = "./images/ven0aaa2.jpg"

            self.createTexture(filename)
            self.parent.set_filenamed_title(filename)

        def paintGL(self):
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
            glClearColor(0.0, 0.0, 0.0, 0.0)
            glLoadIdentity()

            #gluLookAt(0.0, 2.0, -1.0, 0.0, 0.0, 0.0, 0.0, 30.0, 0.0);
            gluLookAt(self.veye[0], self.veye[1], self.veye[2], 0.0, 0.0, 0.0,
                      0.0, 1.0, 0.0)

            glEnable(GL_LIGHTING)
            self.light.position(self.vlight[0], self.vlight[1], self.vlight[2],
                                0.0)

            glTranslatef(0.0, 0.0, 0.0)
            glRotate(self.angle, self.axis[0], self.axis[1], self.axis[2])
            #self.material.diffuse(0.0, 0.0, 1.0, 1.0);

            #self.material.specular(1.0, 1.0, 1.0, 0.0);
            #self.material.shininess(100.0);

            if self.sphere != None:
                self.sphere.draw()

        def resizeGL(self, width, height):
            if width == 0 or height == 0:
                return
            glViewport(0, 0, width, height)
            glMatrixMode(GL_PROJECTION)
            glLoadIdentity()
            glFrustum(width / height, -width / height, -1.0, 1.0, 2.0, 30.0)
            glMatrixMode(GL_MODELVIEW)

        def createTexture(self, filename):
            self.sphere = ZOpenGLTexturedSphere(filename, None, 1.0, 40, 40)

        def setAngle(self, angle):
            self.angle = angle
            self.update()

        def setAxisPosition(self, axis):
            self.vaxis = axis
            self.update()

        def setEyePosition(self, eye):
            self.veye = eye
            self.update()

        def setLigtPosition(self, light):
            self.vlight = light
            self.update()

    ##--------------------------------------------
    # class variables
    MIN_ANGLE = -180
    MAX_ANGLE = 180
    CUR_ANGLE = 128
    AXIS_RANGE = [-100, 100]
    AXIS_POS = [-10, -50, 80.0]
    EYE_RANGE = [-200, 200]
    EYE_POS = [0.0, 1.0, 2]
    LIGHT_RANGE = [-200, 200]
    LIGHT_POS = [-14.0, -10, -70.0]

    # MainView Constructor
    def __init__(self, title, x, y, width, height):
        super(ZOpenGLMainView, self).__init__(title, x, y, width, height)

        # 1 Create first imageview.
        self.opengl_view = self.OpenGLView(self, self.CUR_ANGLE, self.AXIS_POS,
                                           self.EYE_POS, self.LIGHT_POS)

        # 2 Add the image view to a main_layout of this main view.
        self.add(self.opengl_view)

        # 3 Add callbacks to positioners.
        self.rotator.add_value_changed_callback(self.angle_changed)
        self.axisPositioner.add_value_changed_callback(self.axis_changed)
        self.eyePositioner.add_value_changed_callback(self.eye_changed)
        self.lightPositioner.add_value_changed_callback(self.light_changed)

        self.show()

    # Add control pane to MainView
    def add_control_pane(self, fixed_width=270):
        self.vpane = ZVerticalPane(self, fixed_width)

        self.rotator = ZLabeledSlider(self, "Rotator", False, self.MIN_ANGLE,
                                      self.MAX_ANGLE, self.CUR_ANGLE)

        self.axisPositioner = ZPositioner(self, "AXISPositioner",
                                          ["X", "Y", "Z"], self.AXIS_RANGE,
                                          self.AXIS_POS)

        self.eyePositioner = ZEyePositioner(self, "EyePositioner",
                                            ["X", "Y", "Z"], self.EYE_RANGE,
                                            self.EYE_POS)

        self.lightPositioner = ZLightPositioner(self, "LightPositioner",
                                                ["X", "Y", "Z"],
                                                self.LIGHT_RANGE,
                                                self.LIGHT_POS)

        self.vpane.add(self.rotator)
        self.vpane.add(self.axisPositioner)

        self.vpane.add(self.eyePositioner)
        self.vpane.add(self.lightPositioner)

        self.set_right_dock(self.vpane)

    def angle_changed(self, value):
        self.rotator.set_value_text(str(value))
        self.opengl_view.setAngle(value)

    def axis_changed(self, v):
        values = self.axisPositioner.get_values()
        self.opengl_view.setAxisPosition(values)

    def eye_changed(self, v):
        values = self.eyePositioner.get_values()
        self.opengl_view.setEyePosition(values)

    def light_changed(self, v):
        values = self.lightPositioner.get_values()
        self.opengl_view.setLigtPosition(values)

    # Show FileOpenDialog and select an image file.
    def file_open(self):
        options = QFileDialog.Options()
        filename, _ = QFileDialog.getOpenFileName(
            self,
            "FileOpenDialog",
            "",
            "All Files (*);;Image Files (*.png;*jpg;*.jpeg)",
            options=options)
        if filename:
            self.load_file(filename)

    def load_file(self, filename):
        self.opengl_view.createTexture(filename)
        self.set_filenamed_title(filename)