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$ $Revision: 1.1 $
37 ** $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/lib/glu32/libnurbs/interface/glinterface.cc,v 1.1 2004/02/02 16:39:08 navaraf 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
);