Home | History | Annotate | Line # | Download | only in interface
      1 /*
      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:
      9 **
     10 ** http://oss.sgi.com/projects/FreeB
     11 **
     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.
     17 **
     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.
     23 **
     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.
     33 **
     34 */
     35 /*
     36 */
     37 
     38 #include "gluos.h"
     39 #include <GL/gl.h>
     40 #include <GL/glu.h>
     41 #include <stdio.h>
     42 #include "glimports.h"
     43 #include "glrenderer.h"
     44 #include "nurbsconsts.h"
     45 
     46 //#define DOWN_LOAD_NURBS
     47 #ifdef DOWN_LOAD_NURBS
     48 
     49 #include "oglTrimNurbs.h"
     50 static int surfcount = 0;
     51 static oglTrimNurbs* otn = NULL;
     52 nurbSurf* tempNurb = NULL;
     53 oglTrimLoops* tempTrim = NULL;
     54 #endif
     55 
     56 
     57 //for LOD
     58 extern "C" {void glu_LOD_eval_list(GLUnurbs *nurb, int level);}
     59 
     60 void glu_LOD_eval_list(GLUnurbs *nurb, int level)
     61 {
     62 	nurb->LOD_eval_list(level);
     63 }
     64 
     65 GLUnurbs * GLAPIENTRY
     66 gluNewNurbsRenderer(void)
     67 {
     68   GLUnurbs *t;
     69 
     70   t = new GLUnurbs();
     71   return t;
     72 }
     73 
     74 void GLAPIENTRY
     75 gluDeleteNurbsRenderer(GLUnurbs *r)
     76 {
     77     delete r;
     78 }
     79 
     80 extern "C"
     81 void GLAPIENTRY
     82 
     83 gluDeleteNurbsTessellatorEXT(GLUnurbsObj *r)
     84 {
     85   delete r;
     86 }
     87 
     88 void GLAPIENTRY
     89 gluBeginSurface(GLUnurbs *r)
     90 {
     91 #ifdef DOWN_LOAD_NURBS
     92 surfcount++;
     93 tempTrim = OTL_make(10,10);
     94 #endif
     95     r->bgnsurface(0);
     96 }
     97 
     98 void GLAPIENTRY
     99 gluBeginCurve(GLUnurbs *r)
    100 {
    101     r->bgncurve(0);
    102 }
    103 
    104 void GLAPIENTRY
    105 gluEndCurve(GLUnurbs *r)
    106 {
    107     r->endcurve();
    108 }
    109 
    110 void GLAPIENTRY
    111 gluEndSurface(GLUnurbs *r)
    112 {
    113 #ifdef DOWN_LOAD_NURBS
    114 if(surfcount == 1)
    115   otn = OTN_make(1);
    116 OTN_insert(otn, tempNurb, tempTrim);
    117 if(surfcount  >= 1)
    118 {
    119 #ifdef DEBUG
    120 printf("write file\n");
    121 #endif
    122 OTN_write(otn, "out.otn");
    123 
    124 }
    125 #endif
    126 
    127     r->endsurface();
    128 }
    129 
    130 void GLAPIENTRY
    131 gluBeginTrim(GLUnurbs *r)
    132 {
    133 #ifdef DOWN_LOAD_NURBS
    134 OTL_bgnTrim(tempTrim);
    135 #endif
    136 
    137     r->bgntrim();
    138 }
    139 
    140 void GLAPIENTRY
    141 gluEndTrim(GLUnurbs *r)
    142 {
    143 #ifdef DOWN_LOAD_NURBS
    144 OTL_endTrim(tempTrim);
    145 #endif
    146     r->endtrim();
    147 }
    148 
    149 void GLAPIENTRY
    150 gluPwlCurve(GLUnurbs *r, GLint count, INREAL array[],
    151 		GLint stride, GLenum type)
    152 {
    153 #ifdef DOWN_LOAD_NURBS
    154 OTL_pwlCurve(tempTrim, count, array, stride, type);
    155 #endif
    156 
    157     int realType;
    158     switch(type) {
    159       case GLU_MAP1_TRIM_2:
    160 	realType = N_P2D;
    161 	break;
    162       case GLU_MAP1_TRIM_3:
    163 	realType = N_P2DR;
    164 	break;
    165       default:
    166 	realType = type;
    167 	break;
    168     }
    169     r->pwlcurve(count, array, sizeof(INREAL) * stride, realType);
    170 }
    171 
    172 void GLAPIENTRY
    173 gluNurbsCurve(GLUnurbs *r, GLint nknots, INREAL knot[], GLint stride,
    174 		  INREAL ctlarray[], GLint order, GLenum type)
    175 {
    176 #ifdef DOWN_LOAD_NURBS
    177 OTL_nurbsCurve(tempTrim, nknots, knot, stride, ctlarray, order, type);
    178 #endif
    179 
    180     int realType;
    181 
    182     switch(type) {
    183       case GLU_MAP1_TRIM_2:
    184 	realType = N_P2D;
    185 	break;
    186       case GLU_MAP1_TRIM_3:
    187 	realType = N_P2DR;
    188 	break;
    189       default:
    190 	realType = type;
    191 	break;
    192     }
    193 
    194     r->nurbscurve(nknots, knot, sizeof(INREAL) * stride, ctlarray, order,
    195 	    realType);
    196 }
    197 
    198 void GLAPIENTRY
    199 gluNurbsSurface(GLUnurbs *r, GLint sknot_count, GLfloat *sknot,
    200 			    GLint tknot_count, GLfloat *tknot,
    201 			    GLint s_stride, GLint t_stride,
    202 			    GLfloat *ctlarray, GLint sorder, GLint torder,
    203 			    GLenum type)
    204 {
    205 #ifdef DOWN_LOAD_NURBS
    206   {
    207     int dimension;
    208     switch(type){
    209     case GL_MAP2_VERTEX_3:
    210       dimension = 3;
    211       break;
    212     case GL_MAP2_VERTEX_4:
    213       dimension = 4;
    214       break;
    215     default:
    216       fprintf(stderr, "error in glinterface.c++, type no implemented\n");
    217       exit(1);
    218     }
    219 tempNurb = nurbSurfMake(sknot_count, sknot,
    220 			tknot_count, tknot,
    221 			sorder, torder,
    222 			dimension,
    223 			ctlarray,
    224 			s_stride, t_stride);
    225 
    226   }
    227 #endif
    228 
    229     r->nurbssurface(sknot_count, sknot, tknot_count, tknot,
    230 	    sizeof(INREAL) * s_stride, sizeof(INREAL) * t_stride,
    231 	    ctlarray, sorder, torder, type);
    232 }
    233 
    234 void GLAPIENTRY
    235 gluLoadSamplingMatrices(GLUnurbs *r, const GLfloat modelMatrix[16],
    236 			    const GLfloat projMatrix[16],
    237 			    const GLint viewport[4])
    238 {
    239     r->useGLMatrices(modelMatrix, projMatrix, viewport);
    240 }
    241 
    242 void GLAPIENTRY
    243 gluNurbsProperty(GLUnurbs *r, GLenum property, GLfloat value)
    244 {
    245     GLfloat nurbsValue;
    246 
    247     switch (property) {
    248       case GLU_AUTO_LOAD_MATRIX:
    249         r->setautoloadmode(value);
    250 	return;
    251 
    252       case GLU_CULLING:
    253 	if (value != 0.0) {
    254 	    nurbsValue = N_CULLINGON;
    255 	} else {
    256 	    nurbsValue = N_NOCULLING;
    257 	}
    258 	r->setnurbsproperty(GL_MAP2_VERTEX_3, N_CULLING, nurbsValue);
    259 	r->setnurbsproperty(GL_MAP2_VERTEX_4, N_CULLING, nurbsValue);
    260 	r->setnurbsproperty(GL_MAP1_VERTEX_3, N_CULLING, nurbsValue);
    261 	r->setnurbsproperty(GL_MAP1_VERTEX_4, N_CULLING, nurbsValue);
    262         return;
    263 
    264       case GLU_SAMPLING_METHOD:
    265 	if (value == GLU_PATH_LENGTH) {
    266 	    nurbsValue = N_PATHLENGTH;
    267 	} else if (value == GLU_PARAMETRIC_ERROR) {
    268 	    nurbsValue = N_PARAMETRICDISTANCE;
    269 	} else if (value == GLU_DOMAIN_DISTANCE) {
    270 	    nurbsValue = N_DOMAINDISTANCE;
    271             r->set_is_domain_distance_sampling(1); //optimzing untrimmed case
    272 
    273 	} else if (value == GLU_OBJECT_PARAMETRIC_ERROR) {
    274 	    nurbsValue = N_OBJECTSPACE_PARA;
    275 	    r->setautoloadmode( 0.0 );
    276 	    r->setSamplingMatrixIdentity();
    277 	} else if (value == GLU_OBJECT_PATH_LENGTH) {
    278 	    nurbsValue = N_OBJECTSPACE_PATH;
    279 	    r->setautoloadmode( 0.0 );
    280 	    r->setSamplingMatrixIdentity();
    281 	} else {
    282             r->postError(GLU_INVALID_VALUE);
    283             return;
    284         }
    285 
    286 	r->setnurbsproperty(GL_MAP2_VERTEX_3, N_SAMPLINGMETHOD, nurbsValue);
    287 	r->setnurbsproperty(GL_MAP2_VERTEX_4, N_SAMPLINGMETHOD, nurbsValue);
    288 	r->setnurbsproperty(GL_MAP1_VERTEX_3, N_SAMPLINGMETHOD, nurbsValue);
    289 	r->setnurbsproperty(GL_MAP1_VERTEX_4, N_SAMPLINGMETHOD, nurbsValue);
    290 	return;
    291 
    292       case GLU_SAMPLING_TOLERANCE:
    293 	r->setnurbsproperty(GL_MAP2_VERTEX_3, N_PIXEL_TOLERANCE, value);
    294 	r->setnurbsproperty(GL_MAP2_VERTEX_4, N_PIXEL_TOLERANCE, value);
    295 	r->setnurbsproperty(GL_MAP1_VERTEX_3, N_PIXEL_TOLERANCE, value);
    296 	r->setnurbsproperty(GL_MAP1_VERTEX_4, N_PIXEL_TOLERANCE, value);
    297 	return;
    298 
    299       case GLU_PARAMETRIC_TOLERANCE:
    300 	r->setnurbsproperty(GL_MAP2_VERTEX_3, N_ERROR_TOLERANCE, value);
    301         r->setnurbsproperty(GL_MAP2_VERTEX_4, N_ERROR_TOLERANCE, value);
    302         r->setnurbsproperty(GL_MAP1_VERTEX_3, N_ERROR_TOLERANCE, value);
    303         r->setnurbsproperty(GL_MAP1_VERTEX_4, N_ERROR_TOLERANCE, value);
    304         return;
    305 
    306 
    307       case GLU_DISPLAY_MODE:
    308 
    309 	if (value == GLU_FILL) {
    310 	  nurbsValue = N_FILL;
    311 	} else if (value == GLU_OUTLINE_POLYGON) {
    312 	  nurbsValue = N_OUTLINE_POLY;
    313 	} else if (value == GLU_OUTLINE_PATCH) {
    314 	  nurbsValue = N_OUTLINE_PATCH;
    315 	} else {
    316 	  r->postError(GLU_INVALID_VALUE);
    317 	  return;
    318 	}
    319 	r->setnurbsproperty(N_DISPLAY, nurbsValue);
    320 
    321 	break;
    322 
    323       case GLU_U_STEP:
    324     	r->setnurbsproperty(GL_MAP1_VERTEX_3, N_S_STEPS, value);
    325     	r->setnurbsproperty(GL_MAP1_VERTEX_4, N_S_STEPS, value);
    326     	r->setnurbsproperty(GL_MAP2_VERTEX_3, N_S_STEPS, value);
    327     	r->setnurbsproperty(GL_MAP2_VERTEX_4, N_S_STEPS, value);
    328 
    329 	//added for optimizing untrimmed case
    330         r->set_domain_distance_u_rate(value);
    331 	break;
    332 
    333       case GLU_V_STEP:
    334         r->setnurbsproperty(GL_MAP1_VERTEX_3, N_T_STEPS, value);
    335         r->setnurbsproperty(GL_MAP1_VERTEX_4, N_T_STEPS, value);
    336         r->setnurbsproperty(GL_MAP2_VERTEX_3, N_T_STEPS, value);
    337         r->setnurbsproperty(GL_MAP2_VERTEX_4, N_T_STEPS, value);
    338 
    339 	//added for optimizing untrimmed case
    340         r->set_domain_distance_v_rate(value);
    341 	break;
    342 
    343       case GLU_NURBS_MODE:
    344 	if(value == GLU_NURBS_RENDERER)
    345 	  r->put_callbackFlag(0);
    346 	else if(value == GLU_NURBS_TESSELLATOR)
    347 	  r->put_callbackFlag(1);
    348 	else
    349 	  r->postError(GLU_INVALID_ENUM);
    350 	break;
    351 
    352       default:
    353 	r->postError(GLU_INVALID_ENUM);
    354 	return;
    355     }
    356 }
    357 
    358 void GLAPIENTRY
    359 gluGetNurbsProperty(GLUnurbs *r, GLenum property, GLfloat *value)
    360 {
    361     GLfloat nurbsValue;
    362 
    363     switch(property) {
    364       case GLU_AUTO_LOAD_MATRIX:
    365 	if (r->getautoloadmode()) {
    366 	    *value = GL_TRUE;
    367 	} else {
    368 	    *value = GL_FALSE;
    369 	}
    370 	break;
    371       case GLU_CULLING:
    372 	r->getnurbsproperty(GL_MAP2_VERTEX_3, N_CULLING, &nurbsValue);
    373 	if (nurbsValue == N_CULLINGON) {
    374 	    *value = GL_TRUE;
    375 	} else {
    376 	    *value = GL_FALSE;
    377 	}
    378 	break;
    379       case GLU_SAMPLING_METHOD:
    380 	r->getnurbsproperty(GL_MAP2_VERTEX_3, N_SAMPLINGMETHOD, value);
    381 	if(*value == N_PATHLENGTH)
    382 	  *value = GLU_PATH_LENGTH;
    383 	else if(*value == N_PARAMETRICDISTANCE)
    384 	  *value = GLU_PARAMETRIC_ERROR;
    385 	else if(*value == N_DOMAINDISTANCE)
    386 	  *value = GLU_DOMAIN_DISTANCE;
    387 	else if(*value == N_OBJECTSPACE_PATH)
    388 	  *value = GLU_OBJECT_PATH_LENGTH;
    389 	else if(*value == N_OBJECTSPACE_PARA)
    390 	  *value = GLU_OBJECT_PARAMETRIC_ERROR;
    391 	break;
    392       case GLU_SAMPLING_TOLERANCE:
    393 	r->getnurbsproperty(GL_MAP2_VERTEX_3, N_PIXEL_TOLERANCE, value);
    394 	break;
    395       case GLU_PARAMETRIC_TOLERANCE:
    396 	r->getnurbsproperty(GL_MAP2_VERTEX_3, N_ERROR_TOLERANCE, value);
    397         break;
    398 
    399       case GLU_U_STEP:
    400     	r->getnurbsproperty(GL_MAP2_VERTEX_3, N_S_STEPS, value);
    401 	break;
    402       case GLU_V_STEP:
    403     	r->getnurbsproperty(GL_MAP2_VERTEX_3, N_T_STEPS, value);
    404 	break;
    405       case GLU_DISPLAY_MODE:
    406 	r->getnurbsproperty(N_DISPLAY, &nurbsValue);
    407 	if (nurbsValue == N_FILL) {
    408 	    *value = GLU_FILL;
    409 	} else if (nurbsValue == N_OUTLINE_POLY) {
    410 	    *value = GLU_OUTLINE_POLYGON;
    411 	} else {
    412 	    *value = GLU_OUTLINE_PATCH;
    413 	}
    414 	break;
    415 
    416       case GLU_NURBS_MODE:
    417 	if(r->is_callback())
    418 	  *value = GLU_NURBS_TESSELLATOR;
    419 	else
    420 	  *value = GLU_NURBS_RENDERER;
    421 	break;
    422 
    423       default:
    424 	r->postError(GLU_INVALID_ENUM);
    425 	return;
    426     }
    427 }
    428 
    429 extern "C" void GLAPIENTRY
    430 gluNurbsCallback(GLUnurbs *r, GLenum which, _GLUfuncptr fn )
    431 {
    432     switch (which) {
    433     case GLU_NURBS_BEGIN:
    434     case GLU_NURBS_END:
    435     case GLU_NURBS_VERTEX:
    436     case GLU_NURBS_NORMAL:
    437     case GLU_NURBS_TEXTURE_COORD:
    438     case GLU_NURBS_COLOR:
    439     case GLU_NURBS_BEGIN_DATA:
    440     case GLU_NURBS_END_DATA:
    441     case GLU_NURBS_VERTEX_DATA:
    442     case GLU_NURBS_NORMAL_DATA:
    443     case GLU_NURBS_TEXTURE_COORD_DATA:
    444     case GLU_NURBS_COLOR_DATA:
    445 	r->putSurfCallBack(which, fn);
    446 	break;
    447 
    448     case GLU_NURBS_ERROR:
    449 	r->errorCallback = (void (APIENTRY *)( GLenum e )) fn;
    450 	break;
    451     default:
    452 	r->postError(GLU_INVALID_ENUM);
    453 	return;
    454     }
    455 }
    456 
    457 extern "C"
    458 void GLAPIENTRY
    459 gluNurbsCallbackDataEXT(GLUnurbs* r, void* userData)
    460 {
    461   r->setNurbsCallbackData(userData);
    462 }
    463 
    464 extern "C"
    465 void GLAPIENTRY
    466 gluNurbsCallbackData(GLUnurbs* r, void* userData)
    467 {
    468   gluNurbsCallbackDataEXT(r,userData);
    469 }
    470