home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyos2bin.zip / Demo / sgi / gl / nurbs.py < prev    next >
Text File  |  1996-11-27  |  3KB  |  172 lines

  1. #! /usr/bin/env python
  2.  
  3. # Rotate a 3D surface created using NURBS.
  4. #
  5. # Press left mouse button to toggle surface trimming.
  6. # Press ESC to quit.
  7. #
  8. # See the GL manual for an explanation of NURBS.
  9.  
  10. from gl import *
  11. from GL import *
  12. from DEVICE import *
  13.  
  14. TRUE = 1
  15. FALSE = 0
  16. ORDER = 4
  17.  
  18. idmat = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
  19.  
  20. surfknots = [-1, -1, -1, -1, 1, 1, 1, 1]
  21.  
  22. def make_ctlpoints():
  23.     c = []
  24.     #
  25.     ci = []
  26.     ci.append(-2.5,  -3.7,  1.0)
  27.     ci.append(-1.5,  -3.7,  3.0)
  28.     ci.append(1.5,  -3.7, -2.5)
  29.     ci.append(2.5,  -3.7,  -0.75)
  30.     c.append(ci)
  31.     #
  32.     ci = []
  33.     ci.append(-2.5,  -2.0,  3.0)
  34.     ci.append(-1.5,  -2.0,  4.0)
  35.     ci.append(1.5,  -2.0,  -3.0)
  36.     ci.append(2.5,  -2.0,  0.0)
  37.     c.append(ci)
  38.     #
  39.     ci = []
  40.     ci.append(-2.5, 2.0,  1.0)
  41.     ci.append(-1.5, 2.0,  0.0)
  42.     ci.append(1.5,  2.0,  -1.0)
  43.     ci.append(2.5,  2.0,  2.0)
  44.     c.append(ci)
  45.     #
  46.     ci = []
  47.     ci.append(-2.5,  2.7,  1.25)
  48.     ci.append(-1.5,  2.7,  0.1)
  49.     ci.append(1.5,  2.7,  -0.6)
  50.     ci.append(2.5,  2.7,  0.2)
  51.     c.append(ci)
  52.     #
  53.     return c
  54.  
  55. ctlpoints = make_ctlpoints()
  56.  
  57. trimknots = [0., 0., 0.,  1., 1.,  2., 2.,  3., 3.,   4., 4., 4.]
  58.  
  59. def make_trimpoints():
  60.     c = []
  61.     c.append(1.0, 0.0, 1.0)
  62.     c.append(1.0, 1.0, 1.0)
  63.     c.append(0.0, 2.0, 2.0)
  64.     c.append(-1.0, 1.0, 1.0)
  65.     c.append(-1.0, 0.0, 1.0)
  66.     c.append(-1.0, -1.0, 1.0)
  67.     c.append(0.0, -2.0, 2.0)
  68.     c.append(1.0, -1.0, 1.0) 
  69.     c.append(1.0, 0.0, 1.0)
  70.     return c
  71.  
  72. trimpoints = make_trimpoints()
  73.  
  74. def main():
  75.     init_windows()
  76.     setup_queue()
  77.     make_lights()
  78.     init_view()
  79.     #
  80.     set_scene()
  81.     setnurbsproperty( N_ERRORCHECKING, 1.0 )
  82.     setnurbsproperty( N_PIXEL_TOLERANCE, 50.0 )
  83.     trim_flag = 0
  84.     draw_trim_surface(trim_flag)
  85.     #
  86.     while 1:
  87.         while qtest():
  88.             dev, val = qread()
  89.             if dev == ESCKEY:
  90.                 return
  91.             elif dev == WINQUIT:
  92.                 dglclose(-1)    # this for DGL only
  93.                 return
  94.             elif dev == REDRAW:
  95.                 reshapeviewport()
  96.                 set_scene()
  97.                 draw_trim_surface(trim_flag)
  98.             elif dev == LEFTMOUSE:
  99.                 if val:
  100.                     trim_flag = (not trim_flag)
  101.         set_scene()
  102.         draw_trim_surface(trim_flag)
  103.  
  104. def init_windows():
  105.     foreground()
  106.     #prefposition(0, 500, 0, 500)
  107.     wid = winopen('nurbs')
  108.     wintitle('NURBS Surface')
  109.     doublebuffer()
  110.     RGBmode()
  111.     gconfig()
  112.     lsetdepth(0x000, 0x7fffff)
  113.     zbuffer( TRUE )
  114.  
  115. def setup_queue():
  116.     qdevice(ESCKEY)
  117.     qdevice(REDRAW)
  118.     qdevice(RIGHTMOUSE)
  119.     qdevice(WINQUIT)
  120.     qdevice(LEFTMOUSE) #trimming
  121.  
  122. def init_view():
  123.     mmode(MPROJECTION)
  124.     ortho( -4., 4., -4., 4., -4., 4. )
  125.     #
  126.     mmode(MVIEWING)
  127.     loadmatrix(idmat)
  128.     #
  129.     lmbind(MATERIAL, 1)
  130.  
  131. def set_scene():
  132.     lmbind(MATERIAL, 0)
  133.     RGBcolor(150,150,150)
  134.     lmbind(MATERIAL, 1)
  135.     clear()
  136.     zclear()
  137.     #
  138.     rotate( 100, 'y' )
  139.     rotate( 100, 'z' )
  140.  
  141. def draw_trim_surface(trim_flag):
  142.     bgnsurface()
  143.     nurbssurface(surfknots, surfknots, ctlpoints, ORDER, ORDER, N_XYZ)
  144.     if trim_flag:
  145.         bgntrim()
  146.         nurbscurve(trimknots, trimpoints, ORDER-1, N_STW)
  147.         endtrim()
  148.     endsurface()
  149.     swapbuffers()
  150.  
  151. def make_lights():
  152.     lmdef(DEFLMODEL,1,[])
  153.     lmdef(DEFLIGHT,1,[])
  154.     #
  155.     # define material #1
  156.     #
  157.     a = []
  158.     a = a + [EMISSION, 0.0, 0.0, 0.0]
  159.     a = a + [AMBIENT,  0.1, 0.1, 0.1]
  160.     a = a + [DIFFUSE,  0.6, 0.3, 0.3]
  161.     a = a + [SPECULAR,  0.0, 0.6, 0.0]
  162.     a = a + [SHININESS, 2.0]
  163.     a = a + [LMNULL]
  164.     lmdef(DEFMATERIAL, 1, a)
  165.     #
  166.     # turn on lighting
  167.     #
  168.     lmbind(LIGHT0, 1)
  169.     lmbind(LMODEL, 1)
  170.  
  171. main()
  172.