| #! /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 () |