ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

glinterface.cc
Go to the documentation of this file.
00001 /*
00002 ** License Applicability. Except to the extent portions of this file are
00003 ** made subject to an alternative license as permitted in the SGI Free
00004 ** Software License B, Version 1.1 (the "License"), the contents of this
00005 ** file are subject only to the provisions of the License. You may not use
00006 ** this file except in compliance with the License. You may obtain a copy
00007 ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
00008 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
00009 ** 
00010 ** http://oss.sgi.com/projects/FreeB
00011 ** 
00012 ** Note that, as provided in the License, the Software is distributed on an
00013 ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
00014 ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
00015 ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
00016 ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
00017 ** 
00018 ** Original Code. The Original Code is: OpenGL Sample Implementation,
00019 ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
00020 ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
00021 ** Copyright in any portions created by third parties is as indicated
00022 ** elsewhere herein. All Rights Reserved.
00023 ** 
00024 ** Additional Notice Provisions: The application programming interfaces
00025 ** established by SGI in conjunction with the Original Code are The
00026 ** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
00027 ** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
00028 ** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
00029 ** Window System(R) (Version 1.3), released October 19, 1998. This software
00030 ** was created using the OpenGL(R) version 1.2.1 Sample Implementation
00031 ** published by SGI, but has not been independently verified as being
00032 ** compliant with the OpenGL(R) version 1.2.1 Specification.
00033 **
00034 ** $Date: 2006-03-12 00:07:02 +0000 (Sun, 12 Mar 2006) $ $Revision: 1.1 $
00035 */
00036 /*
00037 ** $Header: /cygdrive/c/RCVS/CVS/ReactOS/reactos/lib/glu32/libnurbs/interface/glinterface.cc,v 1.1 2004/02/02 16:39:08 navaraf Exp $
00038 */
00039 
00040 #include "gluos.h"
00041 #include <GL/gl.h>
00042 #include <GL/glu.h>
00043 #include <stdio.h>
00044 #include "glimports.h"
00045 #include "glrenderer.h"
00046 #include "nurbsconsts.h"
00047 
00048 //#define DOWN_LOAD_NURBS
00049 #ifdef DOWN_LOAD_NURBS
00050 
00051 #include "oglTrimNurbs.h"
00052 static int surfcount = 0;
00053 static oglTrimNurbs* otn = NULL;
00054 nurbSurf* tempNurb = NULL;
00055 oglTrimLoops* tempTrim = NULL;
00056 #endif
00057 
00058 
00059 //for LOD
00060 extern "C" {void glu_LOD_eval_list(GLUnurbs *nurb, int level);}
00061 
00062 void glu_LOD_eval_list(GLUnurbs *nurb, int level)
00063 {
00064     nurb->LOD_eval_list(level);
00065 }
00066 
00067 GLUnurbs * GLAPIENTRY
00068 gluNewNurbsRenderer(void)
00069 {
00070   GLUnurbs *t;
00071   
00072   t = new GLUnurbs();
00073   return t;
00074 }
00075 
00076 void GLAPIENTRY
00077 gluDeleteNurbsRenderer(GLUnurbs *r)
00078 {
00079     delete r;
00080 }
00081 
00082 extern "C"
00083 void GLAPIENTRY
00084 
00085 gluDeleteNurbsTessellatorEXT(GLUnurbsObj *r)
00086 {
00087   delete r;
00088 }
00089 
00090 void GLAPIENTRY
00091 gluBeginSurface(GLUnurbs *r)
00092 {
00093 #ifdef DOWN_LOAD_NURBS
00094 surfcount++;
00095 tempTrim = OTL_make(10,10);
00096 #endif
00097     r->bgnsurface(0); 
00098 }
00099 
00100 void GLAPIENTRY
00101 gluBeginCurve(GLUnurbs *r)
00102 {
00103     r->bgncurve(0); 
00104 }
00105 
00106 void GLAPIENTRY
00107 gluEndCurve(GLUnurbs *r)
00108 {
00109     r->endcurve(); 
00110 }
00111 
00112 void GLAPIENTRY
00113 gluEndSurface(GLUnurbs *r)
00114 {
00115 #ifdef DOWN_LOAD_NURBS
00116 if(surfcount == 1)
00117   otn = OTN_make(1);
00118 OTN_insert(otn, tempNurb, tempTrim);
00119 if(surfcount  >= 1)
00120 {
00121 #ifdef DEBUG
00122 printf("write file\n");
00123 #endif
00124 OTN_write(otn, "out.otn");
00125 
00126 }
00127 #endif
00128 
00129     r->endsurface(); 
00130 }
00131 
00132 void GLAPIENTRY
00133 gluBeginTrim(GLUnurbs *r)
00134 {
00135 #ifdef DOWN_LOAD_NURBS
00136 OTL_bgnTrim(tempTrim);
00137 #endif
00138 
00139     r->bgntrim(); 
00140 }
00141 
00142 void GLAPIENTRY
00143 gluEndTrim(GLUnurbs *r)
00144 {
00145 #ifdef DOWN_LOAD_NURBS
00146 OTL_endTrim(tempTrim);
00147 #endif
00148     r->endtrim(); 
00149 }
00150 
00151 void GLAPIENTRY
00152 gluPwlCurve(GLUnurbs *r, GLint count, INREAL array[], 
00153         GLint stride, GLenum type)
00154 {
00155 #ifdef DOWN_LOAD_NURBS
00156 OTL_pwlCurve(tempTrim, count, array, stride, type);
00157 #endif
00158 
00159     int realType;
00160     switch(type) {
00161       case GLU_MAP1_TRIM_2:
00162     realType = N_P2D;
00163     break;
00164       case GLU_MAP1_TRIM_3:
00165     realType = N_P2DR;
00166     break;
00167       default:
00168     realType = type;
00169     break;
00170     }
00171     r->pwlcurve(count, array, sizeof(INREAL) * stride, realType);
00172 }
00173 
00174 void GLAPIENTRY
00175 gluNurbsCurve(GLUnurbs *r, GLint nknots, INREAL knot[], GLint stride, 
00176           INREAL ctlarray[], GLint order, GLenum type)
00177 {
00178 #ifdef DOWN_LOAD_NURBS
00179 OTL_nurbsCurve(tempTrim, nknots, knot, stride, ctlarray, order, type);
00180 #endif
00181 
00182     int realType;
00183 
00184     switch(type) {
00185       case GLU_MAP1_TRIM_2:
00186     realType = N_P2D;
00187     break;
00188       case GLU_MAP1_TRIM_3:
00189     realType = N_P2DR;
00190     break;
00191       default:
00192     realType = type;
00193     break;
00194     }
00195 
00196     r->nurbscurve(nknots, knot, sizeof(INREAL) * stride, ctlarray, order, 
00197         realType);
00198 }
00199 
00200 void GLAPIENTRY
00201 gluNurbsSurface(GLUnurbs *r, GLint sknot_count, GLfloat *sknot, 
00202                 GLint tknot_count, GLfloat *tknot, 
00203                 GLint s_stride, GLint t_stride, 
00204                 GLfloat *ctlarray, GLint sorder, GLint torder, 
00205                 GLenum type)
00206 {
00207 #ifdef DOWN_LOAD_NURBS
00208   {
00209     int dimension;
00210     switch(type){
00211     case GL_MAP2_VERTEX_3:
00212       dimension = 3;
00213       break;
00214     case GL_MAP2_VERTEX_4:
00215       dimension = 4;
00216       break;
00217     default:
00218       fprintf(stderr, "error in glinterface.c++, type no implemented\n");
00219       exit(1);
00220     }
00221 tempNurb = nurbSurfMake(sknot_count, sknot,
00222             tknot_count, tknot,
00223             sorder, torder,
00224             dimension,
00225             ctlarray,
00226             s_stride, t_stride);
00227             
00228   }
00229 #endif
00230 
00231     r->nurbssurface(sknot_count, sknot, tknot_count, tknot, 
00232         sizeof(INREAL) * s_stride, sizeof(INREAL) * t_stride, 
00233         ctlarray, sorder, torder, type);
00234 }
00235 
00236 void GLAPIENTRY
00237 gluLoadSamplingMatrices(GLUnurbs *r, const GLfloat modelMatrix[16],
00238                 const GLfloat projMatrix[16], 
00239                 const GLint viewport[4])
00240 {
00241     r->useGLMatrices(modelMatrix, projMatrix, viewport);
00242 }
00243 
00244 void GLAPIENTRY
00245 gluNurbsProperty(GLUnurbs *r, GLenum property, GLfloat value)
00246 {
00247     GLfloat nurbsValue;
00248     
00249     switch (property) {
00250       case GLU_AUTO_LOAD_MATRIX:      
00251         r->setautoloadmode(value);
00252     return;
00253 
00254       case GLU_CULLING:
00255     if (value != 0.0) {
00256         nurbsValue = N_CULLINGON;
00257     } else {
00258         nurbsValue = N_NOCULLING;
00259     }
00260     r->setnurbsproperty(GL_MAP2_VERTEX_3, N_CULLING, nurbsValue);
00261     r->setnurbsproperty(GL_MAP2_VERTEX_4, N_CULLING, nurbsValue);
00262     r->setnurbsproperty(GL_MAP1_VERTEX_3, N_CULLING, nurbsValue);
00263     r->setnurbsproperty(GL_MAP1_VERTEX_4, N_CULLING, nurbsValue);
00264         return;
00265 
00266       case GLU_SAMPLING_METHOD:
00267     if (value == GLU_PATH_LENGTH) {
00268         nurbsValue = N_PATHLENGTH;
00269     } else if (value == GLU_PARAMETRIC_ERROR) {
00270         nurbsValue = N_PARAMETRICDISTANCE;
00271     } else if (value == GLU_DOMAIN_DISTANCE) {
00272         nurbsValue = N_DOMAINDISTANCE;
00273             r->set_is_domain_distance_sampling(1); //optimzing untrimmed case
00274 
00275     } else if (value == GLU_OBJECT_PARAMETRIC_ERROR) {
00276         nurbsValue = N_OBJECTSPACE_PARA;
00277         r->setautoloadmode( 0.0 ); 
00278         r->setSamplingMatrixIdentity();
00279     } else if (value == GLU_OBJECT_PATH_LENGTH) {
00280         nurbsValue = N_OBJECTSPACE_PATH;
00281         r->setautoloadmode( 0.0 ); 
00282         r->setSamplingMatrixIdentity();
00283     } else {
00284             r->postError(GLU_INVALID_VALUE);
00285             return;
00286         }
00287 
00288     r->setnurbsproperty(GL_MAP2_VERTEX_3, N_SAMPLINGMETHOD, nurbsValue);
00289     r->setnurbsproperty(GL_MAP2_VERTEX_4, N_SAMPLINGMETHOD, nurbsValue);
00290     r->setnurbsproperty(GL_MAP1_VERTEX_3, N_SAMPLINGMETHOD, nurbsValue);
00291     r->setnurbsproperty(GL_MAP1_VERTEX_4, N_SAMPLINGMETHOD, nurbsValue);
00292     return;
00293 
00294       case GLU_SAMPLING_TOLERANCE:
00295     r->setnurbsproperty(GL_MAP2_VERTEX_3, N_PIXEL_TOLERANCE, value);
00296     r->setnurbsproperty(GL_MAP2_VERTEX_4, N_PIXEL_TOLERANCE, value);
00297     r->setnurbsproperty(GL_MAP1_VERTEX_3, N_PIXEL_TOLERANCE, value);
00298     r->setnurbsproperty(GL_MAP1_VERTEX_4, N_PIXEL_TOLERANCE, value);
00299     return;
00300 
00301       case GLU_PARAMETRIC_TOLERANCE:
00302     r->setnurbsproperty(GL_MAP2_VERTEX_3, N_ERROR_TOLERANCE, value);
00303         r->setnurbsproperty(GL_MAP2_VERTEX_4, N_ERROR_TOLERANCE, value);
00304         r->setnurbsproperty(GL_MAP1_VERTEX_3, N_ERROR_TOLERANCE, value);
00305         r->setnurbsproperty(GL_MAP1_VERTEX_4, N_ERROR_TOLERANCE, value);
00306         return;
00307     
00308 
00309       case GLU_DISPLAY_MODE:
00310     
00311     if (value == GLU_FILL) {
00312       nurbsValue = N_FILL;
00313     } else if (value == GLU_OUTLINE_POLYGON) {
00314       nurbsValue = N_OUTLINE_POLY;
00315     } else if (value == GLU_OUTLINE_PATCH) {
00316       nurbsValue = N_OUTLINE_PATCH;
00317     } else {
00318       r->postError(GLU_INVALID_VALUE);
00319       return;
00320     }
00321     r->setnurbsproperty(N_DISPLAY, nurbsValue);
00322     
00323     break;
00324 
00325       case GLU_U_STEP:
00326         r->setnurbsproperty(GL_MAP1_VERTEX_3, N_S_STEPS, value);
00327         r->setnurbsproperty(GL_MAP1_VERTEX_4, N_S_STEPS, value);
00328         r->setnurbsproperty(GL_MAP2_VERTEX_3, N_S_STEPS, value);
00329         r->setnurbsproperty(GL_MAP2_VERTEX_4, N_S_STEPS, value);
00330     
00331     //added for optimizing untrimmed case
00332         r->set_domain_distance_u_rate(value);
00333     break;
00334 
00335       case GLU_V_STEP:
00336         r->setnurbsproperty(GL_MAP1_VERTEX_3, N_T_STEPS, value);
00337         r->setnurbsproperty(GL_MAP1_VERTEX_4, N_T_STEPS, value);
00338         r->setnurbsproperty(GL_MAP2_VERTEX_3, N_T_STEPS, value);
00339         r->setnurbsproperty(GL_MAP2_VERTEX_4, N_T_STEPS, value);
00340 
00341     //added for optimizing untrimmed case
00342         r->set_domain_distance_v_rate(value);
00343     break;
00344     
00345       case GLU_NURBS_MODE:
00346     if(value == GLU_NURBS_RENDERER)
00347       r->put_callbackFlag(0);
00348     else if(value == GLU_NURBS_TESSELLATOR)
00349       r->put_callbackFlag(1);
00350     else
00351       r->postError(GLU_INVALID_ENUM);
00352     break;
00353 
00354       default:
00355     r->postError(GLU_INVALID_ENUM);
00356     return; 
00357     }
00358 }
00359 
00360 void GLAPIENTRY
00361 gluGetNurbsProperty(GLUnurbs *r, GLenum property, GLfloat *value)
00362 {
00363     GLfloat nurbsValue;
00364 
00365     switch(property) {
00366       case GLU_AUTO_LOAD_MATRIX:
00367     if (r->getautoloadmode()) {
00368         *value = GL_TRUE;
00369     } else {
00370         *value = GL_FALSE;
00371     }
00372     break;
00373       case GLU_CULLING:
00374     r->getnurbsproperty(GL_MAP2_VERTEX_3, N_CULLING, &nurbsValue);
00375     if (nurbsValue == N_CULLINGON) {
00376         *value = GL_TRUE;
00377     } else {
00378         *value = GL_FALSE;
00379     }
00380     break;
00381       case GLU_SAMPLING_METHOD:
00382     r->getnurbsproperty(GL_MAP2_VERTEX_3, N_SAMPLINGMETHOD, value);
00383     if(*value == N_PATHLENGTH)
00384       *value = GLU_PATH_LENGTH;
00385     else if(*value == N_PARAMETRICDISTANCE)
00386       *value = GLU_PARAMETRIC_ERROR;
00387     else if(*value == N_DOMAINDISTANCE)
00388       *value = GLU_DOMAIN_DISTANCE;
00389     else if(*value == N_OBJECTSPACE_PATH)
00390       *value = GLU_OBJECT_PATH_LENGTH;
00391     else if(*value == N_OBJECTSPACE_PARA)
00392       *value = GLU_OBJECT_PARAMETRIC_ERROR; 
00393     break;
00394       case GLU_SAMPLING_TOLERANCE:
00395     r->getnurbsproperty(GL_MAP2_VERTEX_3, N_PIXEL_TOLERANCE, value);
00396     break;
00397       case GLU_PARAMETRIC_TOLERANCE:
00398     r->getnurbsproperty(GL_MAP2_VERTEX_3, N_ERROR_TOLERANCE, value);
00399         break;
00400 
00401       case GLU_U_STEP:
00402         r->getnurbsproperty(GL_MAP2_VERTEX_3, N_S_STEPS, value);
00403     break;
00404       case GLU_V_STEP:
00405         r->getnurbsproperty(GL_MAP2_VERTEX_3, N_T_STEPS, value);
00406     break;
00407       case GLU_DISPLAY_MODE:
00408     r->getnurbsproperty(N_DISPLAY, &nurbsValue);
00409     if (nurbsValue == N_FILL) {
00410         *value = GLU_FILL;
00411     } else if (nurbsValue == N_OUTLINE_POLY) {
00412         *value = GLU_OUTLINE_POLYGON;
00413     } else {
00414         *value = GLU_OUTLINE_PATCH;
00415     }
00416     break;
00417 
00418       case GLU_NURBS_MODE:
00419     if(r->is_callback())
00420       *value = GLU_NURBS_TESSELLATOR;
00421     else
00422       *value = GLU_NURBS_RENDERER;
00423     break;
00424     
00425       default:
00426     r->postError(GLU_INVALID_ENUM);
00427     return;
00428     }
00429 }
00430 
00431 extern "C" void GLAPIENTRY
00432 gluNurbsCallback(GLUnurbs *r, GLenum which, _GLUfuncptr fn )
00433 {
00434     switch (which) {
00435     case GLU_NURBS_BEGIN:
00436     case GLU_NURBS_END:
00437     case GLU_NURBS_VERTEX:
00438     case GLU_NURBS_NORMAL:
00439     case GLU_NURBS_TEXTURE_COORD:
00440     case GLU_NURBS_COLOR:
00441     case GLU_NURBS_BEGIN_DATA:
00442     case GLU_NURBS_END_DATA:
00443     case GLU_NURBS_VERTEX_DATA:
00444     case GLU_NURBS_NORMAL_DATA:
00445     case GLU_NURBS_TEXTURE_COORD_DATA:
00446     case GLU_NURBS_COLOR_DATA: 
00447     r->putSurfCallBack(which, fn);
00448     break;
00449 
00450     case GLU_NURBS_ERROR:
00451     r->errorCallback = (void (APIENTRY *)( GLenum e )) fn;
00452     break;
00453     default:
00454     r->postError(GLU_INVALID_ENUM);
00455     return;
00456     }
00457 }
00458 
00459 extern "C"
00460 void GLAPIENTRY
00461 gluNurbsCallbackDataEXT(GLUnurbs* r, void* userData)
00462 {
00463   r->setNurbsCallbackData(userData);
00464 }
00465 
00466 extern "C"
00467 void GLAPIENTRY
00468 gluNurbsCallbackData(GLUnurbs* r, void* userData)
00469 {
00470   gluNurbsCallbackDataEXT(r,userData);
00471 }

Generated on Fri May 25 2012 04:21:45 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.