source: trunk/src/opengl/glu/nurbs/interface/glinterface.cpp

Last change on this file was 3079, checked in by jeroen, 26 years ago

* empty log message *

File size: 12.9 KB
Line 
1/* $Id: glinterface.cpp,v 1.3 2000-03-11 09:05:02 jeroen Exp $ */
2/*
3** License Applicability. Except to the extent portions of this file are
4** made subject to an alternative license as permitted in the SGI Free
5** Software License B, Version 1.0 (the "License"), the contents of this
6** file are subject only to the provisions of the License. You may not use
7** this file except in compliance with the License. You may obtain a copy
8** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
9** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
10**
11** http://oss.sgi.com/projects/FreeB
12**
13** Note that, as provided in the License, the Software is distributed on an
14** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
15** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
16** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
17** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
18**
19** Original Code. The Original Code is: OpenGL Sample Implementation,
20** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
21** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
22** Copyright in any portions created by third parties is as indicated
23** elsewhere herein. All Rights Reserved.
24**
25** Additional Notice Provisions: The application programming interfaces
26** established by SGI in conjunction with the Original Code are The
27** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
28** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
29** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
30** Window System(R) (Version 1.3), released October 19, 1998. This software
31** was created using the OpenGL(R) version 1.2.1 Sample Implementation
32** published by SGI, but has not been independently verified as being
33** compliant with the OpenGL(R) version 1.2.1 Specification.
34**
35** $Date: 2000-03-11 09:05:02 $ $Revision: 1.3 $
36*/
37/*
38** $Header: /home/ktk/tmp/odin/2007/netlabs.cvs/odin32/src/opengl/glu/nurbs/interface/glinterface.cpp,v 1.3 2000-03-11 09:05:02 jeroen Exp $
39*/
40
41#include "gluos.h"
42#include "gl.h"
43#include "glu.h"
44#include <stdio.h>
45#include "glimports.h"
46#include "glrenderer.h"
47#include "nurbsconsts.h"
48
49//#define DOWN_LOAD_NURBS
50#ifdef DOWN_LOAD_NURBS
51
52#include "oglTrimNurbs.h"
53static int surfcount = 0;
54static oglTrimNurbs* otn = NULL;
55nurbSurf* tempNurb = NULL;
56oglTrimLoops* tempTrim = NULL;
57#endif
58
59
60//for LOD
61extern "C" {void glu_LOD_eval_list(GLUnurbs *nurb, int level);}
62
63void glu_LOD_eval_list(GLUnurbs *nurb, int level)
64{
65 nurb->LOD_eval_list(level);
66}
67
68GLUnurbs * GLAPI
69gluNewNurbsRenderer(void)
70{
71 GLUnurbs *t;
72
73 t = new GLUnurbs();
74 return t;
75}
76
77void GLAPI
78gluDeleteNurbsRenderer(GLUnurbs *r)
79{
80 delete r;
81}
82
83extern "C"
84void GLAPI
85
86gluDeleteNurbsTessellatorEXT(GLUnurbsObj *r)
87{
88 delete r;
89}
90
91void GLAPI
92gluBeginSurface(GLUnurbs *r)
93{
94#ifdef DOWN_LOAD_NURBS
95surfcount++;
96tempTrim = OTL_make(10,10);
97#endif
98 r->bgnsurface(0);
99}
100
101void GLAPI
102gluBeginCurve(GLUnurbs *r)
103{
104 r->bgncurve(0);
105}
106
107void GLAPI
108gluEndCurve(GLUnurbs *r)
109{
110 r->endcurve();
111}
112
113void GLAPI
114gluEndSurface(GLUnurbs *r)
115{
116#ifdef DOWN_LOAD_NURBS
117if(surfcount == 1)
118 otn = OTN_make(1);
119OTN_insert(otn, tempNurb, tempTrim);
120if(surfcount >= 1)
121{
122#ifdef DEBUG
123printf("write file\n");
124#endif
125OTN_write(otn, "out.otn");
126
127}
128#endif
129
130 r->endsurface();
131}
132
133void GLAPI
134gluBeginTrim(GLUnurbs *r)
135{
136#ifdef DOWN_LOAD_NURBS
137OTL_bgnTrim(tempTrim);
138#endif
139
140 r->bgntrim();
141}
142
143void GLAPI
144gluEndTrim(GLUnurbs *r)
145{
146#ifdef DOWN_LOAD_NURBS
147OTL_endTrim(tempTrim);
148#endif
149 r->endtrim();
150}
151
152void GLAPI
153gluPwlCurve(GLUnurbs *r, GLint count, INREAL array[],
154 GLint stride, GLenum type)
155{
156#ifdef DOWN_LOAD_NURBS
157OTL_pwlCurve(tempTrim, count, array, stride, type);
158#endif
159
160 int realType;
161 switch(type) {
162 case GLU_MAP1_TRIM_2:
163 realType = N_P2D;
164 break;
165 case GLU_MAP1_TRIM_3:
166 realType = N_P2DR;
167 break;
168 default:
169 realType = type;
170 break;
171 }
172 r->pwlcurve(count, array, sizeof(INREAL) * stride, realType);
173}
174
175void GLAPI
176gluNurbsCurve(GLUnurbs *r, GLint nknots, INREAL knot[], GLint stride,
177 INREAL ctlarray[], GLint order, GLenum type)
178{
179#ifdef DOWN_LOAD_NURBS
180OTL_nurbsCurve(tempTrim, nknots, knot, stride, ctlarray, order, type);
181#endif
182
183 int realType;
184
185 switch(type) {
186 case GLU_MAP1_TRIM_2:
187 realType = N_P2D;
188 break;
189 case GLU_MAP1_TRIM_3:
190 realType = N_P2DR;
191 break;
192 default:
193 realType = type;
194 break;
195 }
196
197 r->nurbscurve(nknots, knot, sizeof(INREAL) * stride, ctlarray, order,
198 realType);
199}
200
201void GLAPI
202gluNurbsSurface(GLUnurbs *r, GLint sknot_count, GLfloat *sknot,
203 GLint tknot_count, GLfloat *tknot,
204 GLint s_stride, GLint t_stride,
205 GLfloat *ctlarray, GLint sorder, GLint torder,
206 GLenum type)
207{
208#ifdef DOWN_LOAD_NURBS
209 {
210 int dimension;
211 switch(type){
212 case GL_MAP2_VERTEX_3:
213 dimension = 3;
214 break;
215 case GL_MAP2_VERTEX_4:
216 dimension = 4;
217 break;
218 default:
219 fprintf(stderr, "error in glinterface.c++, type no implemented\n");
220 exit(1);
221 }
222tempNurb = nurbSurfMake(sknot_count, sknot,
223 tknot_count, tknot,
224 sorder, torder,
225 dimension,
226 ctlarray,
227 s_stride, t_stride);
228
229 }
230#endif
231
232 r->nurbssurface(sknot_count, sknot, tknot_count, tknot,
233 sizeof(INREAL) * s_stride, sizeof(INREAL) * t_stride,
234 ctlarray, sorder, torder, type);
235}
236
237void GLAPI
238gluLoadSamplingMatrices(GLUnurbs *r, const GLfloat modelMatrix[16],
239 const GLfloat projMatrix[16],
240 const GLint viewport[4])
241{
242 r->useGLMatrices(modelMatrix, projMatrix, viewport);
243}
244
245void GLAPI
246gluNurbsProperty(GLUnurbs *r, GLenum property, GLfloat value)
247{
248 GLfloat nurbsValue;
249
250 switch (property) {
251 case GLU_AUTO_LOAD_MATRIX:
252 r->setautoloadmode(value);
253 return;
254
255 case GLU_CULLING:
256 if (value != 0.0) {
257 nurbsValue = N_CULLINGON;
258 } else {
259 nurbsValue = N_NOCULLING;
260 }
261 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_CULLING, nurbsValue);
262 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_CULLING, nurbsValue);
263 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_CULLING, nurbsValue);
264 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_CULLING, nurbsValue);
265 return;
266
267 case GLU_SAMPLING_METHOD:
268 if (value == GLU_PATH_LENGTH) {
269 nurbsValue = N_PATHLENGTH;
270 } else if (value == GLU_PARAMETRIC_ERROR) {
271 nurbsValue = N_PARAMETRICDISTANCE;
272 } else if (value == GLU_DOMAIN_DISTANCE) {
273 nurbsValue = N_DOMAINDISTANCE;
274 r->set_is_domain_distance_sampling(1); //optimzing untrimmed case
275
276 } else if (value == GLU_OBJECT_PARAMETRIC_ERROR) {
277 nurbsValue = N_OBJECTSPACE_PARA;
278 r->setautoloadmode( 0.0 );
279 r->setSamplingMatrixIdentity();
280 } else if (value == GLU_OBJECT_PATH_LENGTH) {
281 nurbsValue = N_OBJECTSPACE_PATH;
282 r->setautoloadmode( 0.0 );
283 r->setSamplingMatrixIdentity();
284 } else {
285 r->postError(GLU_INVALID_VALUE);
286 return;
287 }
288
289 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_SAMPLINGMETHOD, nurbsValue);
290 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_SAMPLINGMETHOD, nurbsValue);
291 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_SAMPLINGMETHOD, nurbsValue);
292 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_SAMPLINGMETHOD, nurbsValue);
293 return;
294
295 case GLU_SAMPLING_TOLERANCE:
296 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_PIXEL_TOLERANCE, value);
297 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_PIXEL_TOLERANCE, value);
298 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_PIXEL_TOLERANCE, value);
299 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_PIXEL_TOLERANCE, value);
300 return;
301
302 case GLU_PARAMETRIC_TOLERANCE:
303 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_ERROR_TOLERANCE, value);
304 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_ERROR_TOLERANCE, value);
305 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_ERROR_TOLERANCE, value);
306 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_ERROR_TOLERANCE, value);
307 return;
308
309
310 case GLU_DISPLAY_MODE:
311
312 if (value == GLU_FILL) {
313 nurbsValue = N_FILL;
314 } else if (value == GLU_OUTLINE_POLYGON) {
315 nurbsValue = N_OUTLINE_POLY;
316 } else if (value == GLU_OUTLINE_PATCH) {
317 nurbsValue = N_OUTLINE_PATCH;
318 } else {
319 r->postError(GLU_INVALID_VALUE);
320 return;
321 }
322 r->setnurbsproperty(N_DISPLAY, nurbsValue);
323
324 break;
325
326 case GLU_U_STEP:
327 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_S_STEPS, value);
328 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_S_STEPS, value);
329 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_S_STEPS, value);
330 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_S_STEPS, value);
331
332 //added for optimizing untrimmed case
333 r->set_domain_distance_u_rate(value);
334 break;
335
336 case GLU_V_STEP:
337 r->setnurbsproperty(GL_MAP1_VERTEX_3, N_T_STEPS, value);
338 r->setnurbsproperty(GL_MAP1_VERTEX_4, N_T_STEPS, value);
339 r->setnurbsproperty(GL_MAP2_VERTEX_3, N_T_STEPS, value);
340 r->setnurbsproperty(GL_MAP2_VERTEX_4, N_T_STEPS, value);
341
342 //added for optimizing untrimmed case
343 r->set_domain_distance_v_rate(value);
344 break;
345
346 case GLU_NURBS_MODE:
347 if(value == GLU_NURBS_RENDERER)
348 r->put_callbackFlag(0);
349 else if(value == GLU_NURBS_TESSELLATOR)
350 r->put_callbackFlag(1);
351 else
352 r->postError(GLU_INVALID_ENUM);
353 break;
354
355 default:
356 r->postError(GLU_INVALID_ENUM);
357 return;
358 }
359}
360
361void GLAPI
362gluGetNurbsProperty(GLUnurbs *r, GLenum property, GLfloat *value)
363{
364 GLfloat nurbsValue;
365
366 switch(property) {
367 case GLU_AUTO_LOAD_MATRIX:
368 if (r->getautoloadmode()) {
369 *value = GL_TRUE;
370 } else {
371 *value = GL_FALSE;
372 }
373 break;
374 case GLU_CULLING:
375 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_CULLING, &nurbsValue);
376 if (nurbsValue == N_CULLINGON) {
377 *value = GL_TRUE;
378 } else {
379 *value = GL_FALSE;
380 }
381 break;
382 case GLU_SAMPLING_METHOD:
383 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_SAMPLINGMETHOD, value);
384 if(*value == N_PATHLENGTH)
385 *value = GLU_PATH_LENGTH;
386 else if(*value == N_PARAMETRICDISTANCE)
387 *value = GLU_PARAMETRIC_ERROR;
388 else if(*value == N_DOMAINDISTANCE)
389 *value = GLU_DOMAIN_DISTANCE;
390 else if(*value == N_OBJECTSPACE_PATH)
391 *value = GLU_OBJECT_PATH_LENGTH;
392 else if(*value == N_OBJECTSPACE_PARA)
393 *value = GLU_OBJECT_PARAMETRIC_ERROR;
394 break;
395 case GLU_SAMPLING_TOLERANCE:
396 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_PIXEL_TOLERANCE, value);
397 break;
398 case GLU_PARAMETRIC_TOLERANCE:
399 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_ERROR_TOLERANCE, value);
400 break;
401
402 case GLU_U_STEP:
403 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_S_STEPS, value);
404 break;
405 case GLU_V_STEP:
406 r->getnurbsproperty(GL_MAP2_VERTEX_3, N_T_STEPS, value);
407 break;
408 case GLU_DISPLAY_MODE:
409 r->getnurbsproperty(N_DISPLAY, &nurbsValue);
410 if (nurbsValue == N_FILL) {
411 *value = GLU_FILL;
412 } else if (nurbsValue == N_OUTLINE_POLY) {
413 *value = GLU_OUTLINE_POLYGON;
414 } else {
415 *value = GLU_OUTLINE_PATCH;
416 }
417 break;
418
419 case GLU_NURBS_MODE:
420 if(r->is_callback())
421 *value = GLU_NURBS_TESSELLATOR;
422 else
423 *value = GLU_NURBS_RENDERER;
424 break;
425
426 default:
427 r->postError(GLU_INVALID_ENUM);
428 return;
429 }
430}
431
432GLUAPI void GLAPIENTRY gluNurbsCallback( GLUnurbsObj *nobj, GLenum which,
433 void (GLCALLBACK *fn)() )
434{
435 switch (which) {
436 case GLU_NURBS_BEGIN:
437 case GLU_NURBS_END:
438 case GLU_NURBS_VERTEX:
439 case GLU_NURBS_NORMAL:
440 case GLU_NURBS_TEXTURE_COORD:
441 case GLU_NURBS_COLOR:
442 case GLU_NURBS_BEGIN_DATA:
443 case GLU_NURBS_END_DATA:
444 case GLU_NURBS_VERTEX_DATA:
445 case GLU_NURBS_NORMAL_DATA:
446 case GLU_NURBS_TEXTURE_COORD_DATA:
447 case GLU_NURBS_COLOR_DATA:
448 nobj->putSurfCallBack(which, (GLvoid (* GLCALLBACK)(...))fn);
449 break;
450
451 case GLU_NURBS_ERROR:
452 nobj->errorCallback = (void (* GLCALLBACK)( GLenum )) fn;
453 break;
454 default:
455 nobj->postError(GLU_INVALID_ENUM);
456 return;
457 }
458}
459
460extern "C"
461void GLAPI
462gluNurbsCallbackDataEXT(GLUnurbs* r, void* userData)
463{
464 r->setNurbsCallbackData(userData);
465}
466
467extern "C"
468void GLAPI
469gluNurbsCallbackData(GLUnurbs* r, void* userData)
470{
471 gluNurbsCallbackDataEXT(r,userData);
472}
Note: See TracBrowser for help on using the repository browser.