vp1.0_impl.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include "nvparse_errors.h"
  2. #include "nvparse_externs.h"
  3. #include <string.h>
  4. #include <string>
  5. #include <ctype.h>
  6. #if CM_PLATFORM == CM_PLATFORM_APPLE
  7. # include <OpenGL/glu.h>
  8. #else
  9. # include <GL/glu.h>
  10. #endif
  11. using namespace std;
  12. namespace
  13. {
  14. void LoadProgram( GLenum target, GLuint id, char *instring );
  15. void StrToUpper(char * string);
  16. GLint vpid;
  17. }
  18. bool is_vp10(const char * s)
  19. {
  20. return ! strncmp(s, "!!VP1.0", 7);
  21. }
  22. bool vp10_init(char * s)
  23. {
  24. static bool vpinit = false;
  25. if (vpinit == false )
  26. {
  27. /*
  28. if(! glh_init_extensions("GL_NV_vertex_program"))
  29. {
  30. errors.set("unable to initialize GL_NV_vertex_program");
  31. return false;
  32. }
  33. else
  34. {
  35. */
  36. vpinit = true;
  37. /*
  38. }
  39. */
  40. }
  41. errors.reset();
  42. line_number = 1;
  43. myin = s;
  44. glGetIntegerv( GL_VERTEX_PROGRAM_BINDING_NV, &vpid );
  45. if ( vpid == 0 )
  46. {
  47. char str[128];
  48. sprintf( str, "No vertex program id bound for nvparse() invocation. Bound id = %d\n", (int)vpid );
  49. errors.set( str );
  50. return false;
  51. }
  52. return true;
  53. }
  54. int vp10_parse()
  55. {
  56. LoadProgram( GL_VERTEX_PROGRAM_NV, vpid, myin );
  57. return 0;
  58. }
  59. namespace
  60. {
  61. //.----------------------------------------------------------------------------.
  62. //| Function : LoadProgram |
  63. //| Description: Load a program into GL, and report any errors encountered. |
  64. //.----------------------------------------------------------------------------.
  65. void LoadProgram( GLenum target, GLuint id, char *instring )
  66. {
  67. GLint errPos;
  68. GLenum errCode;
  69. const GLubyte *errString;
  70. int len = strlen(instring);
  71. glLoadProgramNV( target, id, len, (const GLubyte *) instring );
  72. if ( (errCode = glGetError()) != GL_NO_ERROR )
  73. {
  74. errString = gluErrorString( errCode );
  75. glGetIntegerv( GL_PROGRAM_ERROR_POSITION_NV, &errPos );
  76. if (errPos == -1)
  77. return;
  78. int nlines = 1;
  79. int nchar = 1;
  80. int i;
  81. for ( i = 0; i < errPos; i++ )
  82. {
  83. if ( instring[i] == '\n' )
  84. {
  85. nlines++;
  86. nchar = 1;
  87. }
  88. else
  89. {
  90. nchar++;
  91. }
  92. }
  93. int start = 0;
  94. int end = 0;
  95. int flag = ((instring[errPos]==';') | (instring[errPos-1]==';')) ? 1 : 0;
  96. for ( i = errPos; i >= 0; i-- )
  97. {
  98. start = i;
  99. if ( flag && (start >= errPos-1) )
  100. continue;
  101. if ( instring[i] == ';' )
  102. {
  103. if ( !flag )
  104. {
  105. start = i+1;
  106. if ( instring[start] == '\n' )
  107. start++;
  108. }
  109. break;
  110. }
  111. }
  112. for ( i = errPos; i < len; i++ )
  113. {
  114. end = i;
  115. if ( instring[i] == ';' && end > start)
  116. {
  117. break;
  118. }
  119. }
  120. if ( errPos - start > 30 )
  121. {
  122. start = errPos - 30;
  123. }
  124. if ( end - errPos > 30 )
  125. {
  126. end = errPos + 30;
  127. }
  128. char substring[96];
  129. memset( substring, 0, 96 );
  130. strncpy( substring, &(instring[start]), end-start+1 );
  131. char str[256];
  132. //sprintf( str, "error at line %d character %d\n \"%s\"\n", nlines, nchar, substring );
  133. sprintf( str, "error at line %d character %d\n\"%s\"\n", nlines, nchar, substring );
  134. int width = errPos-start;
  135. for ( i = 0; i < width; i++ )
  136. {
  137. strcat( str, " " );
  138. }
  139. strcat( str, "|\n" );
  140. for ( i = 0; i < width; i++ )
  141. {
  142. strcat( str, " " );
  143. }
  144. strcat( str, "^\n" );
  145. errors.set( str );
  146. }
  147. }
  148. //.----------------------------------------------------------------------------.
  149. //| Function : StrToUpper |
  150. //| Description: Converts all lowercase chars in a string to uppercase. |
  151. //.----------------------------------------------------------------------------.
  152. void StrToUpper(char *string)
  153. {
  154. for (unsigned int i = 0; i < strlen(string); i++)
  155. string[i] = toupper(string[i]);
  156. }
  157. }
  158. /* else if(!strncmp(instring, "!!VP1.0", 7))
  159. {
  160. if (vpinit == 0 )
  161. {
  162. if(! glh_init_extensions("GL_NV_vertex_program"))
  163. {
  164. errors.set("unable to initialize GL_NV_vertex_program");
  165. free(instring);
  166. return;
  167. }
  168. else
  169. {
  170. vpinit = 1;
  171. }
  172. }
  173. errors.reset();
  174. line_number = 1;
  175. int vpid;
  176. glGetIntegerv( GL_VERTEX_PROGRAM_BINDING_NV, &vpid );
  177. if ( glGetError() != GL_NO_ERROR )
  178. {
  179. errors.set( "Previous GL_ERROR prior to vertex program parsing.\n" );
  180. }
  181. if ( vpid == 0 )
  182. {
  183. char str[128];
  184. sprintf( str, "No vertex program id bound for nvparse() invocation. Bound id = %d\n", vpid );
  185. errors.set( str );
  186. }
  187. else
  188. {
  189. LoadProgram( GL_VERTEX_PROGRAM_NV, vpid, instring );
  190. }
  191. }
  192. */