"""Primitiva GL_QUADS — dois quadriláteros lado a lado. Aula 02 — Visualização 2D: primitivas gráficas. Exemplo em Python com PySide6 e PyOpenGL (pipeline fixed-function). Execute com: python quadrados2d.py Pontos de atenção: * ``GL_QUADS`` consome os vértices de **quatro em quatro**, e eles devem ser dados **em sequência ao redor do contorno** (horário ou anti-horário). Se a ordem "pular" um vértice, o quadrilátero sai cruzado, em forma de laço. * ``glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)`` desenha só o contorno (*wireframe*) — útil para conferir como os vértices foram conectados. * ``GL_QUADS`` existe apenas no pipeline *fixed-function*: no OpenGL moderno (core 3.2+) todo quadrilátero é montado como dois triângulos. """ from __future__ import annotations import sys from PySide6.QtCore import Qt from PySide6.QtGui import QSurfaceFormat from PySide6.QtWidgets import QApplication from PySide6.QtOpenGLWidgets import QOpenGLWidget from OpenGL.GL import * from OpenGL.GLU import gluOrtho2D # Mude para True para ver apenas o contorno dos quadriláteros. WIREFRAME = False class Quadrados2D(QOpenGLWidget): """Desenha dois quadriláteros com GL_QUADS.""" def initializeGL(self) -> None: glClearColor(0.10, 0.11, 0.13, 1.0) if WIREFRAME: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glLineWidth(2.0) def resizeGL(self, w: int, h: int) -> None: w, h = max(1, w), max(1, h) glViewport(0, 0, w, h) glMatrixMode(GL_PROJECTION) glLoadIdentity() if w <= h: gluOrtho2D(-50.0, 50.0, -50.0 * h / w, 50.0 * h / w) else: gluOrtho2D(-50.0 * w / h, 50.0 * w / h, -50.0, 50.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() def paintGL(self) -> None: glClear(GL_COLOR_BUFFER_BIT) glColor3f(0.72, 0.72, 0.76) glBegin(GL_QUADS) glVertex2f(-45.0, -15.0) # v0, início do 1o. quadrilátero glVertex2f(-45.0, 15.0) # v1 glVertex2f(-15.0, 15.0) # v2 glVertex2f(-15.0, -15.0) # v3 glVertex2f( 15.0, -15.0) # v4, início do 2o. quadrilátero glVertex2f( 15.0, 15.0) # v5 glVertex2f( 45.0, 15.0) # v6 glVertex2f( 45.0, -15.0) # v7 glEnd() def keyPressEvent(self, event) -> None: if event.key() == Qt.Key.Key_Escape: self.close() def main() -> int: fmt = QSurfaceFormat() fmt.setVersion(2, 1) fmt.setProfile(QSurfaceFormat.OpenGLContextProfile.NoProfile) fmt.setDepthBufferSize(0) QSurfaceFormat.setDefaultFormat(fmt) app = QApplication(sys.argv) window = Quadrados2D() window.setWindowTitle("Primitivas 2D — GL_QUADS") window.resize(600, 400) window.show() return app.exec() if __name__ == "__main__": raise SystemExit(main())