2 ** License Applicability. Except to the extent portions of this file are
3 ** made subject to an alternative license as permitted in the SGI Free
4 ** Software License B, Version 1.1 (the "License"), the contents of this
5 ** file are subject only to the provisions of the License. You may not use
6 ** this file except in compliance with the License. You may obtain a copy
7 ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
8 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
10 ** http://oss.sgi.com/projects/FreeB
12 ** Note that, as provided in the License, the Software is distributed on an
13 ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
14 ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
15 ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
16 ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
18 ** Original Code. The Original Code is: OpenGL Sample Implementation,
19 ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
20 ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
21 ** Copyright in any portions created by third parties is as indicated
22 ** elsewhere herein. All Rights Reserved.
24 ** Additional Notice Provisions: The application programming interfaces
25 ** established by SGI in conjunction with the Original Code are The
26 ** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
27 ** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
28 ** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
29 ** Window System(R) (Version 1.3), released October 19, 1998. This software
30 ** was created using the OpenGL(R) version 1.2.1 Sample Implementation
31 ** published by SGI, but has not been independently verified as being
32 ** compliant with the OpenGL(R) version 1.2.1 Specification.
34 ** $Date: 2001/07/16 15:46:42 $ $Revision: 1.2 $
37 ** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/glinterface.cc,v 1.2 2001/07/16 15:46:42 brianp Exp $
44 #include "glimports.h"
45 #include "glrenderer.h"
46 #include "nurbsconsts.h"
48 //#define DOWN_LOAD_NURBS
49 #ifdef DOWN_LOAD_NURBS
51 #include "oglTrimNurbs.h"
52 static int surfcount = 0;
53 static oglTrimNurbs* otn = NULL;
54 nurbSurf* tempNurb = NULL;
55 oglTrimLoops* tempTrim = NULL;
60 extern "C" {void glu_LOD_eval_list(GLUnurbs *nurb, int level);}
62 void glu_LOD_eval_list(GLUnurbs *nurb, int level)
64 nurb->LOD_eval_list(level);
68 gluNewNurbsRenderer(void)
77 gluDeleteNurbsRenderer(GLUnurbs *r)
85 gluDeleteNurbsTessellatorEXT(GLUnurbsObj *r)
91 gluBeginSurface(GLUnurbs *r)
93 #ifdef DOWN_LOAD_NURBS
95 tempTrim = OTL_make(10,10);
101 gluBeginCurve(GLUnurbs *r)
107 gluEndCurve(GLUnurbs *r)
113 gluEndSurface(GLUnurbs *r)
115 #ifdef DOWN_LOAD_NURBS
118 OTN_insert(otn, tempNurb, tempTrim);
122 printf("write file\n");
124 OTN_write(otn, "out.otn");
133 gluBeginTrim(GLUnurbs *r)
135 #ifdef DOWN_LOAD_NURBS
136 OTL_bgnTrim(tempTrim);
143 gluEndTrim(GLUnurbs *r)
145 #ifdef DOWN_LOAD_NURBS
146 OTL_endTrim(tempTrim);
152 gluPwlCurve(GLUnurbs *r, GLint count, INREAL array[],
153 GLint stride, GLenum type)
155 #ifdef DOWN_LOAD_NURBS
156 OTL_pwlCurve(tempTrim, count, array, stride, type);
161 case GLU_MAP1_TRIM_2:
164 case GLU_MAP1_TRIM_3:
171 r->pwlcurve(count, array, sizeof(INREAL) * stride, realType);
175 gluNurbsCurve(GLUnurbs *r, GLint nknots, INREAL knot[], GLint stride,
176 INREAL ctlarray[], GLint order, GLenum type)
178 #ifdef DOWN_LOAD_NURBS
179 OTL_nurbsCurve(tempTrim, nknots, knot, stride, ctlarray, order, type);
185 case GLU_MAP1_TRIM_2:
188 case GLU_MAP1_TRIM_3:
196 r->nurbscurve(nknots, knot, sizeof(INREAL) * stride, ctlarray, order,
201 gluNurbsSurface(GLUnurbs *r, GLint sknot_count, GLfloat *sknot,
202 GLint tknot_count, GLfloat *tknot,
203 GLint s_stride, GLint t_stride,
204 GLfloat *ctlarray, GLint sorder, GLint torder,
207 #ifdef DOWN_LOAD_NURBS
211 case GL_MAP2_VERTEX_3:
214 case GL_MAP2_VERTEX_4:
218 fprintf(stderr, "error in glinterface.c++, type no implemented\n");
221 tempNurb = nurbSurfMake(sknot_count, sknot,
231 r->nurbssurface(sknot_count, sknot, tknot_count, tknot,
232 sizeof(INREAL) * s_stride, sizeof(INREAL) * t_stride,
233 ctlarray, sorder, torder, type);
237 gluLoadSamplingMatrices(GLUnurbs *r, const GLfloat modelMatrix[16],
238 const GLfloat projMatrix[16],
239 const GLint viewport[4])
241 r->useGLMatrices(modelMatrix, projMatrix, viewport);
245 gluNurbsProperty(GLUnurbs *r, GLenum property, GLfloat value)
250 case GLU_AUTO_LOAD_MATRIX:
251 r->setautoloadmode(value);
256 nurbsValue = N_CULLINGON;
258 nurbsValue = N_NOCULLING;
260 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_CULLING, nurbsValue);
261 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_CULLING, nurbsValue);
262 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_CULLING, nurbsValue);
263 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_CULLING, nurbsValue);
266 case GLU_SAMPLING_METHOD:
267 if (value == GLU_PATH_LENGTH) {
268 nurbsValue = N_PATHLENGTH;
269 } else if (value == GLU_PARAMETRIC_ERROR) {
270 nurbsValue = N_PARAMETRICDISTANCE;
271 } else if (value == GLU_DOMAIN_DISTANCE) {
272 nurbsValue = N_DOMAINDISTANCE;
273 r->set_is_domain_distance_sampling(1); //optimzing untrimmed case
275 } else if (value == GLU_OBJECT_PARAMETRIC_ERROR) {
276 nurbsValue = N_OBJECTSPACE_PARA;
277 r->setautoloadmode( 0.0 );
278 r->setSamplingMatrixIdentity();
279 } else if (value == GLU_OBJECT_PATH_LENGTH) {
280 nurbsValue = N_OBJECTSPACE_PATH;
281 r->setautoloadmode( 0.0 );
282 r->setSamplingMatrixIdentity();
284 r->postError(GLU_INVALID_VALUE);
288 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_SAMPLINGMETHOD, nurbsValue);
289 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_SAMPLINGMETHOD, nurbsValue);
290 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_SAMPLINGMETHOD, nurbsValue);
291 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_SAMPLINGMETHOD, nurbsValue);
294 case GLU_SAMPLING_TOLERANCE:
295 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_PIXEL_TOLERANCE, value);
296 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_PIXEL_TOLERANCE, value);
297 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_PIXEL_TOLERANCE, value);
298 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_PIXEL_TOLERANCE, value);
301 case GLU_PARAMETRIC_TOLERANCE:
302 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_ERROR_TOLERANCE, value);
303 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_ERROR_TOLERANCE, value);
304 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_ERROR_TOLERANCE, value);
305 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_ERROR_TOLERANCE, value);
309 case GLU_DISPLAY_MODE:
311 if (value == GLU_FILL) {
313 } else if (value == GLU_OUTLINE_POLYGON) {
314 nurbsValue = N_OUTLINE_POLY;
315 } else if (value == GLU_OUTLINE_PATCH) {
316 nurbsValue = N_OUTLINE_PATCH;
318 r->postError(GLU_INVALID_VALUE);
321 r->setnurbsproperty(N_DISPLAY, nurbsValue);
326 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_S_STEPS, value);
327 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_S_STEPS, value);
328 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_S_STEPS, value);
329 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_S_STEPS, value);
331 //added for optimizing untrimmed case
332 r->set_domain_distance_u_rate(value);
336 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_T_STEPS, value);
337 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_T_STEPS, value);
338 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_T_STEPS, value);
339 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_T_STEPS, value);
341 //added for optimizing untrimmed case
342 r->set_domain_distance_v_rate(value);
346 if(value == GLU_NURBS_RENDERER)
347 r->put_callbackFlag(0);
348 else if(value == GLU_NURBS_TESSELLATOR)
349 r->put_callbackFlag(1);
351 r->postError(GLU_INVALID_ENUM);
355 r->postError(GLU_INVALID_ENUM);
361 gluGetNurbsProperty(GLUnurbs *r, GLenum property, GLfloat *value)
366 case GLU_AUTO_LOAD_MATRIX:
367 if (r->getautoloadmode()) {
374 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_CULLING, &nurbsValue);
375 if (nurbsValue == N_CULLINGON) {
381 case GLU_SAMPLING_METHOD:
382 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_SAMPLINGMETHOD, value);
383 if(*value == N_PATHLENGTH)
384 *value = GLU_PATH_LENGTH;
385 else if(*value == N_PARAMETRICDISTANCE)
386 *value = GLU_PARAMETRIC_ERROR;
387 else if(*value == N_DOMAINDISTANCE)
388 *value = GLU_DOMAIN_DISTANCE;
389 else if(*value == N_OBJECTSPACE_PATH)
390 *value = GLU_OBJECT_PATH_LENGTH;
391 else if(*value == N_OBJECTSPACE_PARA)
392 *value = GLU_OBJECT_PARAMETRIC_ERROR;
394 case GLU_SAMPLING_TOLERANCE:
395 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_PIXEL_TOLERANCE, value);
397 case GLU_PARAMETRIC_TOLERANCE:
398 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_ERROR_TOLERANCE, value);
402 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_S_STEPS, value);
405 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_T_STEPS, value);
407 case GLU_DISPLAY_MODE:
408 r->getnurbsproperty(N_DISPLAY, &nurbsValue);
409 if (nurbsValue == N_FILL) {
411 } else if (nurbsValue == N_OUTLINE_POLY) {
412 *value = GLU_OUTLINE_POLYGON;
414 *value = GLU_OUTLINE_PATCH;
420 *value = GLU_NURBS_TESSELLATOR;
422 *value = GLU_NURBS_RENDERER;
426 r->postError(GLU_INVALID_ENUM);
431 extern "C" void GLAPIENTRY
432 gluNurbsCallback(GLUnurbs *r, GLenum which, _GLUfuncptr fn )
435 case GLU_NURBS_BEGIN:
437 case GLU_NURBS_VERTEX:
438 case GLU_NURBS_NORMAL:
439 case GLU_NURBS_TEXTURE_COORD:
440 case GLU_NURBS_COLOR:
441 case GLU_NURBS_BEGIN_DATA:
442 case GLU_NURBS_END_DATA:
443 case GLU_NURBS_VERTEX_DATA:
444 case GLU_NURBS_NORMAL_DATA:
445 case GLU_NURBS_TEXTURE_COORD_DATA:
446 case GLU_NURBS_COLOR_DATA:
447 r->putSurfCallBack(which, fn);
450 case GLU_NURBS_ERROR:
451 r->errorCallback = (void (APIENTRY *)( GLenum e )) fn;
454 r->postError(GLU_INVALID_ENUM);
461 gluNurbsCallbackDataEXT(GLUnurbs* r, void* userData)
463 r->setNurbsCallbackData(userData);
468 gluNurbsCallbackData(GLUnurbs* r, void* userData)
470 gluNurbsCallbackDataEXT(r,userData);