169 lines
2.9 KiB
Python
Executable File
169 lines
2.9 KiB
Python
Executable File
#! /usr/bin/env python
|
|
|
|
# zrgb (Requires Z buffer.)
|
|
#
|
|
# This program demostrates zbuffering 3 intersecting RGB polygons while
|
|
# in doublebuffer mode where, movement of the mouse with the LEFTMOUSE
|
|
# button depressed will, rotate the 3 polygons. This is done by compound
|
|
# rotations allowing continuous screen-oriented rotations.
|
|
#
|
|
# Press the "Esc" key to exit.
|
|
|
|
from gl import *
|
|
from GL import *
|
|
from DEVICE import *
|
|
|
|
|
|
idmat=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]
|
|
|
|
def main() :
|
|
#
|
|
# old and new mouse position
|
|
#
|
|
#
|
|
mode = 0
|
|
omx = 0
|
|
mx = 0
|
|
omy = 0
|
|
my = 0
|
|
#
|
|
objmat=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]
|
|
#
|
|
initialize ()
|
|
#
|
|
draw_scene (objmat)
|
|
#
|
|
while (1) :
|
|
#
|
|
dev, val = qread()
|
|
#
|
|
if dev == ESCKEY :
|
|
if val :
|
|
break
|
|
# exit when key is going up, not down
|
|
# this avoids the scenario where a window
|
|
# underneath this program's window
|
|
# would otherwise "eat up" the up-
|
|
# event of the Esc key being released
|
|
return
|
|
#
|
|
elif dev == REDRAW :
|
|
reshapeviewport()
|
|
draw_scene(objmat)
|
|
#
|
|
elif dev == LEFTMOUSE:
|
|
omx = mx
|
|
omy = my
|
|
if val :
|
|
mode = 1
|
|
else :
|
|
mode = 0
|
|
elif dev == MOUSEX :
|
|
omx = mx
|
|
mx = val
|
|
#print omx, mx
|
|
objmat = update_scene(objmat,mx,my,omx,omy,mode)
|
|
#
|
|
elif dev == MOUSEY :
|
|
omy = my
|
|
my = val
|
|
#print omy, my
|
|
objmat = update_scene(objmat,mx,my,omx,omy,mode)
|
|
#
|
|
|
|
|
|
def initialize () :
|
|
#
|
|
foreground ()
|
|
keepaspect(5, 4)
|
|
w = winopen('Zbuffered RGB')
|
|
#
|
|
doublebuffer()
|
|
RGBmode()
|
|
gconfig()
|
|
zbuffer(1)
|
|
lsetdepth(0x0, 0x7FFFFF)
|
|
#
|
|
qdevice(ESCKEY)
|
|
qdevice(LEFTMOUSE)
|
|
qdevice(MOUSEX)
|
|
qdevice(MOUSEY)
|
|
|
|
def update_scene (mat, mx, my, omx, omy, mode) :
|
|
#
|
|
if mode == 1 :
|
|
mat = orient(mat, mx, my, omx, omy)
|
|
draw_scene(mat)
|
|
return mat
|
|
|
|
def orient (mat, mx, my, omx, omy) :
|
|
#
|
|
#
|
|
pushmatrix()
|
|
loadmatrix(idmat)
|
|
#
|
|
if mx - omx : rot (float (mx - omx), 'y')
|
|
if omy - my : rot (float (omy - my), 'x')
|
|
#
|
|
multmatrix(mat)
|
|
mat = getmatrix()
|
|
#
|
|
popmatrix()
|
|
#
|
|
return mat
|
|
|
|
def draw_scene (mat) :
|
|
RGBcolor(40, 100, 200)
|
|
clear()
|
|
zclear()
|
|
#
|
|
perspective(400, 1.25, 30.0, 60.0)
|
|
translate(0.0, 0.0, -40.0)
|
|
multmatrix(mat)
|
|
#
|
|
# skews original view to show all polygons
|
|
#
|
|
rotate(-580, 'y')
|
|
draw_polys()
|
|
#
|
|
swapbuffers()
|
|
|
|
polygon1 = [(-10.0,-10.0,0.0),(10.0,-10.0,0.0),(-10.0,10.0,0.0)]
|
|
|
|
polygon2 = [(0.0,-10.0,-10.0),(0.0,-10.0,10.0),(0.0,5.0,-10.0)]
|
|
|
|
polygon3 = [(-10.0,6.0,4.0),(-10.0,3.0,4.0),(4.0,-9.0,-10.0),(4.0,-6.0,-10.0)]
|
|
|
|
def draw_polys():
|
|
bgnpolygon()
|
|
cpack(0x0)
|
|
v3f(polygon1[0])
|
|
cpack(0x007F7F7F)
|
|
v3f(polygon1[1])
|
|
cpack(0x00FFFFFF)
|
|
v3f(polygon1[2])
|
|
endpolygon()
|
|
#
|
|
bgnpolygon()
|
|
cpack(0x0000FFFF)
|
|
v3f(polygon2[0])
|
|
cpack(0x007FFF00)
|
|
v3f(polygon2[1])
|
|
cpack(0x00FF0000)
|
|
v3f(polygon2[2])
|
|
endpolygon()
|
|
#
|
|
bgnpolygon()
|
|
cpack(0x0000FFFF)
|
|
v3f(polygon3[0])
|
|
cpack(0x00FF00FF)
|
|
v3f(polygon3[1])
|
|
cpack(0x00FF0000)
|
|
v3f(polygon3[2])
|
|
cpack(0x00FF00FF)
|
|
v3f(polygon3[3])
|
|
endpolygon()
|
|
|
|
|
|
main ()
|