vsp1.0_impl.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. }
  17. bool is_vsp10(const char * s)
  18. {
  19. return ! strncmp(s, "!!VSP1.0", 8);
  20. }
  21. bool vsp10_init(char * s)
  22. {
  23. static bool vpinit = false;
  24. if (vpinit == false )
  25. {
  26. /*
  27. if(! glh_init_extensions("GL_NV_vertex_program"))
  28. {
  29. errors.set("unable to initialize GL_NV_vertex_program");
  30. return false;
  31. }
  32. else
  33. {
  34. */
  35. vpinit = true;
  36. /*
  37. }
  38. */
  39. }
  40. errors.reset();
  41. line_number = 1;
  42. myin = s;
  43. return true;
  44. }
  45. int vsp10_parse(int vpsid)
  46. {
  47. LoadProgram( GL_VERTEX_STATE_PROGRAM_NV, vpsid, myin );
  48. return 0;
  49. }
  50. namespace
  51. {
  52. //.----------------------------------------------------------------------------.
  53. //| Function : LoadProgram |
  54. //| Description: Load a program into GL, and report any errors encountered. |
  55. //.----------------------------------------------------------------------------.
  56. void LoadProgram( GLenum target, GLuint id, char *instring )
  57. {
  58. GLint errPos;
  59. GLenum errCode;
  60. const GLubyte *errString;
  61. int len = strlen(instring);
  62. glLoadProgramNV( target, id, len, (const GLubyte *) instring );
  63. if ( (errCode = glGetError()) != GL_NO_ERROR )
  64. {
  65. errString = gluErrorString( errCode );
  66. glGetIntegerv( GL_PROGRAM_ERROR_POSITION_NV, &errPos );
  67. int nlines = 1;
  68. int nchar = 1;
  69. int i;
  70. for ( i = 0; i < errPos; i++ )
  71. {
  72. if ( instring[i] == '\n' )
  73. {
  74. nlines++;
  75. nchar = 1;
  76. }
  77. else
  78. {
  79. nchar++;
  80. }
  81. }
  82. int start = 0;
  83. int end = 0;
  84. int flag = ((instring[errPos]==';') | (instring[errPos-1]==';')) ? 1 : 0;
  85. for ( i = errPos; i >= 0; i-- )
  86. {
  87. start = i;
  88. if ( flag && (start >= errPos-1) )
  89. continue;
  90. if ( instring[i] == ';' )
  91. {
  92. if ( !flag )
  93. {
  94. start = i+1;
  95. if ( instring[start] == '\n' )
  96. start++;
  97. }
  98. break;
  99. }
  100. }
  101. for ( i = errPos; i < len; i++ )
  102. {
  103. end = i;
  104. if ( instring[i] == ';' && end > start)
  105. {
  106. break;
  107. }
  108. }
  109. if ( errPos - start > 30 )
  110. {
  111. start = errPos - 30;
  112. }
  113. if ( end - errPos > 30 )
  114. {
  115. end = errPos + 30;
  116. }
  117. char substring[96];
  118. memset( substring, 0, 96 );
  119. strncpy( substring, &(instring[start]), end-start+1 );
  120. char str[256];
  121. //sprintf( str, "error at line %d character %d\n \"%s\"\n", nlines, nchar, substring );
  122. sprintf( str, "error at line %d character %d\n\"%s\"\n", nlines, nchar, substring );
  123. int width = errPos-start;
  124. for ( i = 0; i < width; i++ )
  125. {
  126. strcat( str, " " );
  127. }
  128. strcat( str, "|\n" );
  129. for ( i = 0; i < width; i++ )
  130. {
  131. strcat( str, " " );
  132. }
  133. strcat( str, "^\n" );
  134. errors.set( str );
  135. }
  136. }
  137. //.----------------------------------------------------------------------------.
  138. //| Function : StrToUpper |
  139. //| Description: Converts all lowercase chars in a string to uppercase. |
  140. //.----------------------------------------------------------------------------.
  141. void StrToUpper(char *string)
  142. {
  143. for (unsigned int i = 0; i < strlen(string); i++)
  144. string[i] = toupper(string[i]);
  145. }
  146. }
  147. /*
  148. else if(!strncmp(instring, "!!VSP1.0", 8))
  149. {
  150. if (vpinit == 0 )
  151. {
  152. if(! glh_init_extensions("GL_NV_vertex_program"))
  153. {
  154. errors.set("unable to initialize GL_NV_vertex_program");
  155. free(instring);
  156. return;
  157. }
  158. else
  159. {
  160. vpinit = 1;
  161. }
  162. }
  163. errors.reset();
  164. line_number = 1;
  165. va_list ap;
  166. va_start(ap, input_string);
  167. int vpsid = va_arg(ap,int);
  168. va_end(ap);
  169. if ( glGetError() != GL_NO_ERROR )
  170. {
  171. errors.set( "Previous GL_ERROR prior to vertex state program parsing." );
  172. }
  173. LoadProgram( GL_VERTEX_STATE_PROGRAM_NV, vpsid, instring );
  174. }
  175. */