https://github.com/python/cpython
Raw File
Tip revision: 81467b814626e35cc988791ff29b818f67e4a148 authored by cvs2svn on 26 September 2000, 18:00:20 UTC
This commit was manufactured by cvs2svn to create tag 'r20b2'.
Tip revision: 81467b8
nurbs.py
#! /usr/bin/env python

# Rotate a 3D surface created using NURBS.
#
# Press left mouse button to toggle surface trimming.
# Press ESC to quit.
#
# See the GL manual for an explanation of NURBS.

from gl import *
from GL import *
from DEVICE import *

TRUE = 1
FALSE = 0
ORDER = 4

idmat = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]

surfknots = [-1, -1, -1, -1, 1, 1, 1, 1]

def make_ctlpoints():
	c = []
	#
	ci = []
	ci.append((-2.5,  -3.7,  1.0))
	ci.append((-1.5,  -3.7,  3.0))
	ci.append((1.5,  -3.7, -2.5))
	ci.append((2.5,  -3.7,  -0.75))
	c.append(ci)
	#
	ci = []
	ci.append((-2.5,  -2.0,  3.0))
	ci.append((-1.5,  -2.0,  4.0))
	ci.append((1.5,  -2.0,  -3.0))
	ci.append((2.5,  -2.0,  0.0))
	c.append(ci)
	#
	ci = []
	ci.append((-2.5, 2.0,  1.0))
	ci.append((-1.5, 2.0,  0.0))
	ci.append((1.5,  2.0,  -1.0))
	ci.append((2.5,  2.0,  2.0))
	c.append(ci)
	#
	ci = []
	ci.append((-2.5,  2.7,  1.25))
	ci.append((-1.5,  2.7,  0.1))
	ci.append((1.5,  2.7,  -0.6))
	ci.append((2.5,  2.7,  0.2))
	c.append(ci)
	#
	return c

ctlpoints = make_ctlpoints()

trimknots = [0., 0., 0.,  1., 1.,  2., 2.,  3., 3.,   4., 4., 4.]

def make_trimpoints():
	c = []
	c.append((1.0, 0.0, 1.0))
	c.append((1.0, 1.0, 1.0))
	c.append((0.0, 2.0, 2.0))
	c.append((-1.0, 1.0, 1.0))
	c.append((-1.0, 0.0, 1.0))
	c.append((-1.0, -1.0, 1.0))
	c.append((0.0, -2.0, 2.0))
	c.append((1.0, -1.0, 1.0) )
	c.append((1.0, 0.0, 1.0))
	return c

trimpoints = make_trimpoints()

def main():
	init_windows()
	setup_queue()
	make_lights()
	init_view()
	#
	set_scene()
	setnurbsproperty( N_ERRORCHECKING, 1.0 )
	setnurbsproperty( N_PIXEL_TOLERANCE, 50.0 )
	trim_flag = 0
	draw_trim_surface(trim_flag)
	#
	while 1:
		while qtest():
			dev, val = qread()
			if dev == ESCKEY:
				return
			elif dev == WINQUIT:
				dglclose(-1)	# this for DGL only
				return
			elif dev == REDRAW:
				reshapeviewport()
				set_scene()
				draw_trim_surface(trim_flag)
			elif dev == LEFTMOUSE:
				if val:
					trim_flag = (not trim_flag)
		set_scene()
		draw_trim_surface(trim_flag)

def init_windows():
	foreground()
	#prefposition(0, 500, 0, 500)
	wid = winopen('nurbs')
	wintitle('NURBS Surface')
	doublebuffer()
	RGBmode()
	gconfig()
	lsetdepth(0x000, 0x7fffff)
	zbuffer( TRUE )

def setup_queue():
	qdevice(ESCKEY)
	qdevice(REDRAW)
	qdevice(RIGHTMOUSE)
	qdevice(WINQUIT)
	qdevice(LEFTMOUSE) #trimming

def init_view():
	mmode(MPROJECTION)
	ortho( -4., 4., -4., 4., -4., 4. )
	#
	mmode(MVIEWING)
	loadmatrix(idmat)
	#
	lmbind(MATERIAL, 1)

def set_scene():
	lmbind(MATERIAL, 0)
	RGBcolor(150,150,150)
	lmbind(MATERIAL, 1)
	clear()
	zclear()
	#
	rotate( 100, 'y' )
	rotate( 100, 'z' )

def draw_trim_surface(trim_flag):
	bgnsurface()
	nurbssurface(surfknots, surfknots, ctlpoints, ORDER, ORDER, N_XYZ)
	if trim_flag:
		bgntrim()
		nurbscurve(trimknots, trimpoints, ORDER-1, N_STW)
		endtrim()
	endsurface()
	swapbuffers()

def make_lights():
	lmdef(DEFLMODEL,1,[])
	lmdef(DEFLIGHT,1,[])
	#
	# define material #1
	#
	a = []
	a = a + [EMISSION, 0.0, 0.0, 0.0]
	a = a + [AMBIENT,  0.1, 0.1, 0.1]
	a = a + [DIFFUSE,  0.6, 0.3, 0.3]
	a = a + [SPECULAR,  0.0, 0.6, 0.0]
	a = a + [SHININESS, 2.0]
	a = a + [LMNULL]
	lmdef(DEFMATERIAL, 1, a)
	#
	# turn on lighting
	#
	lmbind(LIGHT0, 1)
	lmbind(LMODEL, 1)

main()
back to top