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