1f220fa62Smrg/*
2f220fa62Smrg** License Applicability. Except to the extent portions of this file are
3f220fa62Smrg** made subject to an alternative license as permitted in the SGI Free
4f220fa62Smrg** Software License B, Version 1.1 (the "License"), the contents of this
5f220fa62Smrg** file are subject only to the provisions of the License. You may not use
6f220fa62Smrg** this file except in compliance with the License. You may obtain a copy
7f220fa62Smrg** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
8f220fa62Smrg** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
9f220fa62Smrg**
10f220fa62Smrg** http://oss.sgi.com/projects/FreeB
11f220fa62Smrg**
12f220fa62Smrg** Note that, as provided in the License, the Software is distributed on an
13f220fa62Smrg** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
14f220fa62Smrg** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
15f220fa62Smrg** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
16f220fa62Smrg** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
17f220fa62Smrg**
18f220fa62Smrg** Original Code. The Original Code is: OpenGL Sample Implementation,
19f220fa62Smrg** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
20f220fa62Smrg** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
21f220fa62Smrg** Copyright in any portions created by third parties is as indicated
22f220fa62Smrg** elsewhere herein. All Rights Reserved.
23f220fa62Smrg**
24f220fa62Smrg** Additional Notice Provisions: The application programming interfaces
25f220fa62Smrg** established by SGI in conjunction with the Original Code are The
26f220fa62Smrg** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
27f220fa62Smrg** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
28f220fa62Smrg** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
29f220fa62Smrg** Window System(R) (Version 1.3), released October 19, 1998. This software
30f220fa62Smrg** was created using the OpenGL(R) version 1.2.1 Sample Implementation
31f220fa62Smrg** published by SGI, but has not been independently verified as being
32f220fa62Smrg** compliant with the OpenGL(R) version 1.2.1 Specification.
33f220fa62Smrg*/
34f220fa62Smrg
35f220fa62Smrg/*
36f220fa62Smrg * nurbsinterfac.c++
37f220fa62Smrg *
38f220fa62Smrg */
39f220fa62Smrg
40f220fa62Smrg#include "glimports.h"
41f220fa62Smrg#include "mystdio.h"
42f220fa62Smrg#include "nurbsconsts.h"
43f220fa62Smrg#include "nurbstess.h"
44f220fa62Smrg#include "bufpool.h"
45f220fa62Smrg#include "quilt.h"
46f220fa62Smrg#include "displaylist.h"
47f220fa62Smrg#include "knotvector.h"
48f220fa62Smrg#include "mapdesc.h"
49f220fa62Smrg
50f220fa62Smrg#define THREAD( work, arg, cleanup ) \
51f220fa62Smrg	if( dl ) {\
52f220fa62Smrg	    arg->save = 1;\
53f220fa62Smrg	    dl->append( (PFVS)&NurbsTessellator::work, (void *) arg, (PFVS)&NurbsTessellator::cleanup );\
54f220fa62Smrg 	} else {\
55f220fa62Smrg	    arg->save = 0;\
56f220fa62Smrg	    work( arg );\
57f220fa62Smrg	}
58f220fa62Smrg
59f220fa62Smrg#define THREAD2( work ) \
60f220fa62Smrg	if( dl ) {\
61f220fa62Smrg	    dl->append( (PFVS)&NurbsTessellator::work, 0, 0 );\
62f220fa62Smrg 	} else {\
63f220fa62Smrg	    work( );\
64f220fa62Smrg	}
65f220fa62Smrg
66f220fa62SmrgNurbsTessellator::NurbsTessellator( BasicCurveEvaluator &c, BasicSurfaceEvaluator& e)
67f220fa62Smrg	: maplist( backend ),
68f220fa62Smrg	  backend( c, e ),
69f220fa62Smrg          subdivider( renderhints, backend ),
70f220fa62Smrg	  o_pwlcurvePool( sizeof( O_pwlcurve ), 32, "o_pwlcurvePool" ),
71f220fa62Smrg	  o_nurbscurvePool( sizeof( O_nurbscurve ), 32, "o_nurbscurvePool"),
72f220fa62Smrg	  o_curvePool( sizeof( O_curve ), 32,  "o_curvePool" ),
73f220fa62Smrg	  o_trimPool( sizeof( O_trim ), 32,  "o_trimPool" ),
74f220fa62Smrg	  o_surfacePool( sizeof( O_surface ), 1, "o_surfacePool" ),
75f220fa62Smrg	  o_nurbssurfacePool( sizeof( O_nurbssurface ), 4, "o_nurbssurfacePool" ),
76f220fa62Smrg	  propertyPool( sizeof( Property ), 32, "propertyPool" ),
77f220fa62Smrg          quiltPool( sizeof( Quilt  ), 32, "quiltPool" )
78f220fa62Smrg{
79f220fa62Smrg    dl		= 0;
80f220fa62Smrg    inSurface	= 0;
81f220fa62Smrg    inCurve	= 0;
82f220fa62Smrg    inTrim	= 0;
83f220fa62Smrg    playBack	= 0;
84f220fa62Smrg    jumpbuffer  = newJumpbuffer();
85f220fa62Smrg    subdivider.setJumpbuffer( jumpbuffer );
86f220fa62Smrg}
87f220fa62Smrg
88f220fa62SmrgNurbsTessellator::~NurbsTessellator( void )
89f220fa62Smrg{
90f220fa62Smrg    if( inTrim ) {
91f220fa62Smrg	do_nurbserror( 12 );
92f220fa62Smrg	endtrim();
93f220fa62Smrg    }
94f220fa62Smrg
95f220fa62Smrg    if( inSurface ) {
96f220fa62Smrg        *nextNurbssurface = 0;
97f220fa62Smrg        do_freeall();
98f220fa62Smrg    }
99f220fa62Smrg
100f220fa62Smrg    if (jumpbuffer) {
101f220fa62Smrg        deleteJumpbuffer(jumpbuffer);
102f220fa62Smrg	jumpbuffer= 0;
103f220fa62Smrg    }
104f220fa62Smrg}
105f220fa62Smrg
106f220fa62Smrg/*-----------------------------------------------------------------------------
107f220fa62Smrg * bgnsurface - allocate and initialize an o_surface structure
108f220fa62Smrg *
109f220fa62Smrg * Client: GL user
110f220fa62Smrg *-----------------------------------------------------------------------------
111f220fa62Smrg */
112f220fa62Smrgvoid
113f220fa62SmrgNurbsTessellator::bgnsurface( long nuid )
114f220fa62Smrg{
115f220fa62Smrg    O_surface *o_surface = new(o_surfacePool) O_surface;
116f220fa62Smrg    o_surface->nuid = nuid;
117f220fa62Smrg    THREAD( do_bgnsurface, o_surface, do_freebgnsurface );
118f220fa62Smrg}
119f220fa62Smrg
120f220fa62Smrg/*-----------------------------------------------------------------------------
121f220fa62Smrg * bgncurve - allocate an initialize an o_curve structure
122f220fa62Smrg *
123f220fa62Smrg * Client: GL user
124f220fa62Smrg *-----------------------------------------------------------------------------
125f220fa62Smrg */
126f220fa62Smrgvoid
127f220fa62SmrgNurbsTessellator::bgncurve( long nuid )
128f220fa62Smrg{
129f220fa62Smrg    O_curve *o_curve = new(o_curvePool) O_curve;
130f220fa62Smrg    o_curve->nuid = nuid;
131f220fa62Smrg    THREAD( do_bgncurve, o_curve, do_freebgncurve );
132f220fa62Smrg}
133f220fa62Smrg/*-----------------------------------------------------------------------------
134f220fa62Smrg * endcurve -
135f220fa62Smrg *
136f220fa62Smrg * Client:
137f220fa62Smrg *-----------------------------------------------------------------------------
138f220fa62Smrg */
139f220fa62Smrg
140f220fa62Smrgvoid
141f220fa62SmrgNurbsTessellator::endcurve( void )
142f220fa62Smrg{
143f220fa62Smrg    THREAD2( do_endcurve );
144f220fa62Smrg}
145f220fa62Smrg
146f220fa62Smrg/*-----------------------------------------------------------------------------
147f220fa62Smrg * endsurface - user level end of surface call
148f220fa62Smrg *
149f220fa62Smrg * Client: GL user
150f220fa62Smrg *-----------------------------------------------------------------------------
151f220fa62Smrg */
152f220fa62Smrgvoid
153f220fa62SmrgNurbsTessellator::endsurface( void )
154f220fa62Smrg{
155f220fa62Smrg    THREAD2( do_endsurface );
156f220fa62Smrg}
157f220fa62Smrg
158f220fa62Smrg
159f220fa62Smrg/*-----------------------------------------------------------------------------
160f220fa62Smrg * bgntrim - allocate and initialize a new trim loop structure (o_trim )
161f220fa62Smrg *
162f220fa62Smrg * Client: GL user
163f220fa62Smrg *-----------------------------------------------------------------------------
164f220fa62Smrg */
165f220fa62Smrgvoid
166f220fa62SmrgNurbsTessellator::bgntrim( void )
167f220fa62Smrg{
168f220fa62Smrg    O_trim *o_trim = new(o_trimPool) O_trim;
169f220fa62Smrg    THREAD( do_bgntrim, o_trim, do_freebgntrim );
170f220fa62Smrg}
171f220fa62Smrg
172f220fa62Smrg/*-----------------------------------------------------------------------------
173f220fa62Smrg * endtrim -
174f220fa62Smrg *
175f220fa62Smrg * Client: GL user
176f220fa62Smrg *-----------------------------------------------------------------------------
177f220fa62Smrg */
178f220fa62Smrgvoid
179f220fa62SmrgNurbsTessellator::endtrim( void )
180f220fa62Smrg{
181f220fa62Smrg    THREAD2( do_endtrim );
182f220fa62Smrg}
183f220fa62Smrg
184f220fa62Smrg
185f220fa62Smrg/*-----------------------------------------------------------------------------
186f220fa62Smrg * pwlcurve -
187f220fa62Smrg *
188f220fa62Smrg *      count        - number of points on curve
189f220fa62Smrg *      array        - array of points on curve
190f220fa62Smrg *      byte_stride  - distance between points in bytes
191f220fa62Smrg *      type         - valid data flag
192f220fa62Smrg *
193f220fa62Smrg * Client: Gl user
194f220fa62Smrg *-----------------------------------------------------------------------------
195f220fa62Smrg */
196f220fa62Smrgvoid
197f220fa62SmrgNurbsTessellator::pwlcurve( long count, INREAL array[], long byte_stride, long type )
198f220fa62Smrg{
199f220fa62Smrg    Mapdesc *mapdesc = maplist.locate( type );
200f220fa62Smrg
201f220fa62Smrg    if( mapdesc == 0 ) {
202f220fa62Smrg	do_nurbserror( 35 );
203f220fa62Smrg	isDataValid = 0;
204f220fa62Smrg	return;
205f220fa62Smrg    }
206f220fa62Smrg
207f220fa62Smrg    if ( (type != N_P2D) && (type != N_P2DR) ) {
208f220fa62Smrg	do_nurbserror( 22 );
209f220fa62Smrg	isDataValid = 0;
210f220fa62Smrg	return;
211f220fa62Smrg    }
212f220fa62Smrg    if( count < 0 ) {
213f220fa62Smrg	do_nurbserror( 33 );
214f220fa62Smrg	isDataValid = 0;
215f220fa62Smrg	return;
216f220fa62Smrg    }
217f220fa62Smrg    if( byte_stride < 0 ) {
218f220fa62Smrg	do_nurbserror( 34 );
219f220fa62Smrg	isDataValid = 0;
220f220fa62Smrg	return;
221f220fa62Smrg    }
222f220fa62Smrg
223f220fa62Smrg#ifdef NOTDEF
224f220fa62Smrg    if( mapdesc->isRational() ) {
225f220fa62Smrg	INREAL *p = array;
226f220fa62Smrg	INREAL x = p[0]; INREAL y = p[1]; INREAL w = p[2];
227f220fa62Smrg	p = (INREAL *) (((char *) p) + byte_stride);
228f220fa62Smrg	for( long i = 1; i != count; i++ ) {
229f220fa62Smrg	    if( p[0] == x && p[1] == y && p[2] == w ) break;
230f220fa62Smrg	    x = p[0]; y = p[1]; w = p[2];
231f220fa62Smrg	    p = (INREAL *) (((char *) p) + byte_stride);
232f220fa62Smrg	}
233f220fa62Smrg	if( i != count ) {
234f220fa62Smrg	    do_nurbserror( 37 );
235f220fa62Smrg	    _glu_dprintf( "point %d (%f,%f)\n", i, x, y );
236f220fa62Smrg	    isDataValid = 0;
237f220fa62Smrg	    return;
238f220fa62Smrg	}
239f220fa62Smrg    } else {
240f220fa62Smrg	INREAL *p = array;
241f220fa62Smrg	INREAL x = p[0]; INREAL y = p[1];
242f220fa62Smrg	p = (INREAL *) (((char *) p) + byte_stride);
243f220fa62Smrg	for( long i = 1; i != count; i++ ) {
244f220fa62Smrg	    if( p[0] == x && p[1] == y ) break;
245f220fa62Smrg	    x = p[0]; y = p[1];
246f220fa62Smrg	    p = (INREAL *) (((char *) p) + byte_stride);
247f220fa62Smrg	}
248f220fa62Smrg	if( i != count ) {
249f220fa62Smrg	    do_nurbserror( 37 );
250f220fa62Smrg	    _glu_dprintf( "point %d (%f,%f)\n", i, x, y );
251f220fa62Smrg	    isDataValid = 0;
252f220fa62Smrg	    return;
253f220fa62Smrg	}
254f220fa62Smrg    }
255f220fa62Smrg#endif
256f220fa62Smrg
257f220fa62Smrg    O_pwlcurve	*o_pwlcurve = new(o_pwlcurvePool) O_pwlcurve( type, count, array, byte_stride, extTrimVertexPool.get((int)count) );
258f220fa62Smrg    THREAD( do_pwlcurve, o_pwlcurve, do_freepwlcurve );
259f220fa62Smrg}
260f220fa62Smrg
261f220fa62Smrg
262f220fa62Smrg/*-----------------------------------------------------------------------------
263f220fa62Smrg * nurbscurve -
264f220fa62Smrg *
265f220fa62Smrg * Client: GL user
266f220fa62Smrg *-----------------------------------------------------------------------------
267f220fa62Smrg */
268f220fa62Smrgvoid
269f220fa62SmrgNurbsTessellator::nurbscurve(
270f220fa62Smrg    long nknots, 		/* number of p knots */
271f220fa62Smrg    INREAL knot[], 		/* nondecreasing knot values in p */
272f220fa62Smrg    long byte_stride,		/* distance in bytes between control points */
273f220fa62Smrg    INREAL ctlarray[], 		/* pointer to first control point */
274f220fa62Smrg    long order,			/* order of spline */
275f220fa62Smrg    long type )			/* description of range space */
276f220fa62Smrg{
277f220fa62Smrg
278f220fa62Smrg    Mapdesc *mapdesc = maplist.locate( type );
279f220fa62Smrg
280f220fa62Smrg    if( mapdesc == 0 ) {
281f220fa62Smrg	do_nurbserror( 35 );
282f220fa62Smrg	isDataValid = 0;
283f220fa62Smrg	return;
284f220fa62Smrg    }
285f220fa62Smrg
286f220fa62Smrg    if( ctlarray == 0 ) {
287f220fa62Smrg	do_nurbserror( 36 );
288f220fa62Smrg	isDataValid = 0;
289f220fa62Smrg	return;
290f220fa62Smrg    }
291f220fa62Smrg
292f220fa62Smrg    if( byte_stride < 0 ) {
293f220fa62Smrg	do_nurbserror( 34 );
294f220fa62Smrg	isDataValid = 0;
295f220fa62Smrg	return;
296f220fa62Smrg    }
297f220fa62Smrg
298f220fa62Smrg    Knotvector knots;
299f220fa62Smrg
300f220fa62Smrg    knots.init( nknots, byte_stride, order, knot );
301f220fa62Smrg    if( do_check_knots( &knots, "curve" ) ) return;
302f220fa62Smrg
303f220fa62Smrg    O_nurbscurve *o_nurbscurve = new(o_nurbscurvePool) O_nurbscurve(type);
304f220fa62Smrg    o_nurbscurve->bezier_curves = new(quiltPool) Quilt(mapdesc);
305f220fa62Smrg    o_nurbscurve->bezier_curves->toBezier( knots,ctlarray, mapdesc->getNcoords() );
306f220fa62Smrg
307f220fa62Smrg    THREAD( do_nurbscurve, o_nurbscurve, do_freenurbscurve );
308f220fa62Smrg}
309f220fa62Smrg
310f220fa62Smrg
311f220fa62Smrg/*-----------------------------------------------------------------------------
312f220fa62Smrg * nurbssurface -
313f220fa62Smrg *
314f220fa62Smrg * Client: User routine
315f220fa62Smrg *-----------------------------------------------------------------------------
316f220fa62Smrg */
317f220fa62Smrgvoid
318f220fa62SmrgNurbsTessellator::nurbssurface(
319f220fa62Smrg    long sknot_count,		/* number of s knots */
320f220fa62Smrg    INREAL sknot[],		/* nondecreasing knot values in s */
321f220fa62Smrg    long tknot_count, 		/* number of t knots */
322f220fa62Smrg    INREAL tknot[],		/* nondecreasing knot values in t */
323f220fa62Smrg    long s_byte_stride,		/* s step size in memory bytes */
324f220fa62Smrg    long t_byte_stride,		/* t step size in memory bytes */
325f220fa62Smrg    INREAL ctlarray[],		/* pointer to first control point */
326f220fa62Smrg    long sorder,		/* order of the spline in s parameter */
327f220fa62Smrg    long torder,		/* order of the spline in t parameter */
328f220fa62Smrg    long type)			/* description of range space */
329f220fa62Smrg{
330f220fa62Smrg    Mapdesc *mapdesc = maplist.locate( type );
331f220fa62Smrg
332f220fa62Smrg    if( mapdesc == 0 ) {
333f220fa62Smrg	do_nurbserror( 35 );
334f220fa62Smrg	isDataValid = 0;
335f220fa62Smrg	return;
336f220fa62Smrg    }
337f220fa62Smrg
338f220fa62Smrg    if( s_byte_stride < 0 ) {
339f220fa62Smrg	do_nurbserror( 34 );
340f220fa62Smrg	isDataValid = 0;
341f220fa62Smrg	return;
342f220fa62Smrg    }
343f220fa62Smrg
344f220fa62Smrg    if( t_byte_stride < 0 ) {
345f220fa62Smrg	do_nurbserror( 34 );
346f220fa62Smrg	isDataValid = 0;
347f220fa62Smrg	return;
348f220fa62Smrg    }
349f220fa62Smrg
350f220fa62Smrg    Knotvector sknotvector, tknotvector;
351f220fa62Smrg
352f220fa62Smrg    sknotvector.init( sknot_count, s_byte_stride, sorder, sknot );
353f220fa62Smrg    if( do_check_knots( &sknotvector, "surface" ) ) return;
354f220fa62Smrg
355f220fa62Smrg    tknotvector.init( tknot_count, t_byte_stride, torder, tknot );
356f220fa62Smrg    if( do_check_knots( &tknotvector, "surface" ) ) return;
357f220fa62Smrg
358f220fa62Smrg    O_nurbssurface *o_nurbssurface = new(o_nurbssurfacePool) O_nurbssurface(type);
359f220fa62Smrg    o_nurbssurface->bezier_patches = new(quiltPool) Quilt(mapdesc);
360f220fa62Smrg
361f220fa62Smrg    o_nurbssurface->bezier_patches->toBezier( sknotvector, tknotvector,
362f220fa62Smrg	ctlarray, mapdesc->getNcoords() );
363f220fa62Smrg    THREAD( do_nurbssurface, o_nurbssurface, do_freenurbssurface );
364f220fa62Smrg}
365f220fa62Smrg
366f220fa62Smrg
367f220fa62Smrg/*-----------------------------------------------------------------------------
368f220fa62Smrg * setnurbsproperty -
369f220fa62Smrg *
370f220fa62Smrg *-----------------------------------------------------------------------------
371f220fa62Smrg */
372f220fa62Smrgvoid
373f220fa62SmrgNurbsTessellator::setnurbsproperty( long tag, INREAL value )
374f220fa62Smrg{
375f220fa62Smrg    if( ! renderhints.isProperty( tag ) ) {
376f220fa62Smrg	do_nurbserror( 26 );
377f220fa62Smrg    } else {
378f220fa62Smrg	Property *prop = new(propertyPool) Property( tag, value );
379f220fa62Smrg	THREAD( do_setnurbsproperty, prop, do_freenurbsproperty );
380f220fa62Smrg    }
381f220fa62Smrg}
382f220fa62Smrg
383f220fa62Smrg/*-----------------------------------------------------------------------------
384f220fa62Smrg * setnurbsproperty -
385f220fa62Smrg *
386f220fa62Smrg *-----------------------------------------------------------------------------
387f220fa62Smrg */
388f220fa62Smrgvoid
389f220fa62SmrgNurbsTessellator::setnurbsproperty( long type, long tag, INREAL value )
390f220fa62Smrg{
391f220fa62Smrg    Mapdesc *mapdesc = maplist.locate( type );
392f220fa62Smrg
393f220fa62Smrg    if( mapdesc == 0 ) {
394f220fa62Smrg	do_nurbserror( 35 );
395f220fa62Smrg	return;
396f220fa62Smrg    }
397f220fa62Smrg
398f220fa62Smrg    if( ! mapdesc->isProperty( tag ) ) {
399f220fa62Smrg	do_nurbserror( 26 );
400f220fa62Smrg	return;
401f220fa62Smrg    }
402f220fa62Smrg
403f220fa62Smrg    Property *prop = new(propertyPool) Property( type, tag, value );
404f220fa62Smrg    THREAD( do_setnurbsproperty2, prop, do_freenurbsproperty );
405f220fa62Smrg}
406f220fa62Smrg
407f220fa62Smrg
408f220fa62Smrg/*-----------------------------------------------------------------------------
409f220fa62Smrg * getnurbsproperty -
410f220fa62Smrg *
411f220fa62Smrg *-----------------------------------------------------------------------------
412f220fa62Smrg */
413f220fa62Smrg
414f220fa62Smrgvoid
415f220fa62SmrgNurbsTessellator::getnurbsproperty( long tag, INREAL *value )
416f220fa62Smrg{
417f220fa62Smrg    if( renderhints.isProperty( tag ) ) {
418f220fa62Smrg	*value = renderhints.getProperty( tag );
419f220fa62Smrg    } else {
420f220fa62Smrg	do_nurbserror( 26 );
421f220fa62Smrg    }
422f220fa62Smrg}
423f220fa62Smrg
424f220fa62Smrg/*-----------------------------------------------------------------------------
425f220fa62Smrg * getnurbsproperty -
426f220fa62Smrg *
427f220fa62Smrg *-----------------------------------------------------------------------------
428f220fa62Smrg */
429f220fa62Smrg
430f220fa62Smrgvoid
431f220fa62SmrgNurbsTessellator::getnurbsproperty( long type, long tag, INREAL *value )
432f220fa62Smrg{
433f220fa62Smrg    Mapdesc *mapdesc = maplist.locate( type );
434f220fa62Smrg
435f220fa62Smrg    if( mapdesc == 0 )
436f220fa62Smrg	do_nurbserror( 35 );
437f220fa62Smrg
438f220fa62Smrg    if( mapdesc->isProperty( tag  ) ) {
439f220fa62Smrg	*value = mapdesc->getProperty( tag );
440f220fa62Smrg    } else {
441f220fa62Smrg	do_nurbserror( 26 );
442f220fa62Smrg    }
443f220fa62Smrg}
444f220fa62Smrg
445f220fa62Smrg/*--------------------------------------------------------------------------
446f220fa62Smrg * setnurbsproperty - accept a user supplied matrix as culling or sampling mat
447f220fa62Smrg *--------------------------------------------------------------------------
448f220fa62Smrg */
449f220fa62Smrg
450f220fa62Smrgvoid
451f220fa62SmrgNurbsTessellator::setnurbsproperty( long type, long purpose, INREAL *mat )
452f220fa62Smrg{
453f220fa62Smrg    // XXX - cannot be put in display list
454f220fa62Smrg    Mapdesc *mapdesc = maplist.locate( type );
455f220fa62Smrg
456f220fa62Smrg    if( mapdesc == 0 ) {
457f220fa62Smrg	do_nurbserror( 35 );
458f220fa62Smrg	isDataValid = 0;
459f220fa62Smrg    } else if( purpose == N_BBOXSIZE ) {
460f220fa62Smrg	mapdesc->setBboxsize( mat );
461f220fa62Smrg    } else {
462f220fa62Smrg#ifndef NDEBUG
463f220fa62Smrg        _glu_dprintf( "ERRORRORRORR!!!\n");
464f220fa62Smrg#endif
465f220fa62Smrg    }
466f220fa62Smrg}
467f220fa62Smrg
468f220fa62Smrg/*--------------------------------------------------------------------------
469f220fa62Smrg * setnurbsproperty - accept a user supplied matrix as culling or sampling mat
470f220fa62Smrg *--------------------------------------------------------------------------
471f220fa62Smrg */
472f220fa62Smrg
473f220fa62Smrgvoid
474f220fa62SmrgNurbsTessellator::setnurbsproperty( long type, long purpose, INREAL *mat,
475f220fa62Smrg    long rstride, long cstride )
476f220fa62Smrg{
477f220fa62Smrg    // XXX - cannot be put in display list
478f220fa62Smrg    Mapdesc *mapdesc = maplist.locate( type );
479f220fa62Smrg
480f220fa62Smrg    if( mapdesc == 0 ) {
481f220fa62Smrg	do_nurbserror( 35 );
482f220fa62Smrg	isDataValid = 0;
483f220fa62Smrg    } else if( purpose == N_CULLINGMATRIX ) {
484f220fa62Smrg	mapdesc->setCmat( mat, rstride, cstride );
485f220fa62Smrg    } else if( purpose == N_SAMPLINGMATRIX ) {
486f220fa62Smrg	mapdesc->setSmat( mat, rstride, cstride );
487f220fa62Smrg    } else if( purpose == N_BBOXMATRIX ) {
488f220fa62Smrg	mapdesc->setBmat( mat, rstride, cstride );
489f220fa62Smrg    } else {
490f220fa62Smrg#ifndef NDEBUG
491f220fa62Smrg        _glu_dprintf( "ERRORRORRORR!!!\n");
492f220fa62Smrg#endif
493f220fa62Smrg    }
494f220fa62Smrg}
495f220fa62Smrg
496f220fa62Smrgvoid
497f220fa62SmrgNurbsTessellator::redefineMaps( void )
498f220fa62Smrg{
499f220fa62Smrg    maplist.initialize();
500f220fa62Smrg}
501f220fa62Smrg
502f220fa62Smrgvoid
503f220fa62SmrgNurbsTessellator::defineMap( long type, long rational, long ncoords )
504f220fa62Smrg{
505f220fa62Smrg    maplist.define( type, (int) rational, (int) ncoords );
506f220fa62Smrg}
507f220fa62Smrg
508f220fa62Smrgvoid
509f220fa62SmrgNurbsTessellator::discardRecording( void *_dl )
510f220fa62Smrg{
511f220fa62Smrg    delete (DisplayList *) _dl;
512f220fa62Smrg}
513f220fa62Smrg
514f220fa62Smrgvoid *
515f220fa62SmrgNurbsTessellator::beginRecording( void )
516f220fa62Smrg{
517f220fa62Smrg    dl = new DisplayList( this );
518f220fa62Smrg    return (void *) dl;
519f220fa62Smrg}
520f220fa62Smrg
521f220fa62Smrgvoid
522f220fa62SmrgNurbsTessellator::endRecording( void )
523f220fa62Smrg{
524f220fa62Smrg    dl->endList();
525f220fa62Smrg    dl = 0;
526f220fa62Smrg}
527f220fa62Smrg
528f220fa62Smrgvoid
529f220fa62SmrgNurbsTessellator::playRecording( void *_dl )
530f220fa62Smrg{
531f220fa62Smrg    playBack = 1;
532f220fa62Smrg    bgnrender();
533f220fa62Smrg    ((DisplayList *)_dl)->play();
534f220fa62Smrg    endrender();
535f220fa62Smrg    playBack = 0;
536f220fa62Smrg}
537f220fa62Smrg
538