Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

glinterface.cc 12KB

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