100 lines
2.9 KiB
Python
100 lines
2.9 KiB
Python
|
|
import math
|
|
import gtk
|
|
import gtk.gtkgl
|
|
|
|
from OpenGL.GL import *
|
|
|
|
from Line import Line
|
|
from Circle import Circle
|
|
|
|
class SketchWidget:
|
|
def __init__(self, sketch):
|
|
self.sketch = sketch
|
|
try:
|
|
# try double-buffered
|
|
self.glconfig = gtk.gdkgl.Config(mode = (gtk.gdkgl.MODE_RGB |
|
|
gtk.gdkgl.MODE_DOUBLE |
|
|
gtk.gdkgl.MODE_DEPTH))
|
|
except gtk.gdkgl.NoMatches:
|
|
# try single-buffered
|
|
self.glconfig = gtk.gdkgl.Config(mode = (gtk.gdkgl.MODE_RGB |
|
|
gtk.gdkgl.MODE_DEPTH))
|
|
|
|
self.widget = gtk.gtkgl.DrawingArea(self.glconfig)
|
|
|
|
self.widget.connect_after('realize', self.init)
|
|
self.widget.connect('configure_event', self.reshape)
|
|
self.widget.connect('expose_event', self.draw)
|
|
|
|
def init(self, glarea):
|
|
# get GLContext and GLDrawable
|
|
glcontext = glarea.get_gl_context()
|
|
gldrawable = glarea.get_gl_drawable()
|
|
|
|
# GL calls
|
|
if not gldrawable.gl_begin(glcontext): return
|
|
|
|
glLightfv(GL_LIGHT0, GL_POSITION, (1, 1, 1, 0))
|
|
glEnable(GL_CULL_FACE)
|
|
glEnable(GL_LIGHTING)
|
|
glEnable(GL_LIGHT0)
|
|
glEnable(GL_DEPTH_TEST)
|
|
|
|
gldrawable.gl_end()
|
|
|
|
def reshape(self, glarea, event):
|
|
# get GLContext and GLDrawable
|
|
glcontext = glarea.get_gl_context()
|
|
gldrawable = glarea.get_gl_drawable()
|
|
|
|
# GL calls
|
|
if not gldrawable.gl_begin(glcontext): return
|
|
|
|
x, y, width, height = glarea.get_allocation()
|
|
|
|
glViewport(0, 0, width, height)
|
|
glMatrixMode(GL_PROJECTION)
|
|
glOrtho(-2, 2, -1.5, 1.5, 1.0, -1.0)
|
|
|
|
glMatrixMode(GL_MODELVIEW)
|
|
glLoadIdentity()
|
|
|
|
gldrawable.gl_end()
|
|
|
|
return True
|
|
|
|
def draw(self, glarea, event):
|
|
# get GLContext and GLDrawable
|
|
glcontext = glarea.get_gl_context()
|
|
gldrawable = glarea.get_gl_drawable()
|
|
|
|
# GL calls
|
|
if not gldrawable.gl_begin(glcontext): return
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
|
|
|
for shape in self.sketch:
|
|
if isinstance(shape, Line):
|
|
glBegin(GL_LINES)
|
|
glVertex(shape.vars[0], shape.vars[1])
|
|
glVertex(shape.vars[2], shape.vars[3])
|
|
glEnd()
|
|
elif isinstance(shape, Circle):
|
|
glBegin(GL_LINE_LOOP)
|
|
for i in range(24):
|
|
glVertex(shape.vars[0] +
|
|
shape.vars[2] * math.sin(i * 2 * math.pi / 24.0),
|
|
shape.vars[1] +
|
|
shape.vars[2] * math.cos(i * 2 * math.pi / 24.0))
|
|
glEnd()
|
|
|
|
if gldrawable.is_double_buffered():
|
|
gldrawable.swap_buffers()
|
|
else:
|
|
glFlush()
|
|
|
|
gldrawable.gl_end()
|
|
|
|
return True
|