This commit is contained in:
romkazvo
2023-08-07 19:29:24 +08:00
commit 34d6c5d489
4832 changed files with 1389451 additions and 0 deletions

View File

@@ -0,0 +1,163 @@
#include "RenderPCH.h"
#include "nvparse.h"
//using namespace std;
namespace
{
void LoadProgram( GLenum target, GLuint id, char *instring );
void StrToUpper(char * string);
int vpid;
}
bool is_vp10(const char * s)
{
return ! strncmp(s, "!!VP1.0", 7);
}
bool vp10_init(char * s)
{
static bool vpinit = false;
if (vpinit == false )
{
if(!SUPPORTS_GL_NV_vertex_program)
{
errors.set("unable to initialize GL_NV_vertex_program");
return false;
}
else
{
vpinit = true;
}
}
errors.reset();
line_number = 1;
myin = s;
glGetIntegerv( GL_VERTEX_PROGRAM_BINDING_NV, &vpid );
if ( vpid == 0 )
{
char str[128];
sprintf( str, "No vertex program id bound for nvparse() invocation. Bound id = %d\n", vpid );
errors.set( str );
return false;
}
return true;
}
int vp10_parse()
{
LoadProgram( GL_VERTEX_PROGRAM_NV, vpid, myin );
return 0;
}
namespace
{
//.----------------------------------------------------------------------------.
//| Function : LoadProgram |
//| Description: Load a program into GL, and report any errors encountered. |
//.----------------------------------------------------------------------------.
void LoadProgram( GLenum target, GLuint id, char *instring )
{
GLint errPos;
GLenum errCode;
const GLubyte *errString;
int len = strlen(instring);
glLoadProgramNV( target, id, len, (const GLubyte *) instring );
if ( (errCode = glGetError()) != GL_NO_ERROR )
{
errString = gluErrorString( errCode );
glGetIntegerv( GL_PROGRAM_ERROR_POSITION_NV, &errPos );
int nlines = 1;
int nchar = 1;
int i;
for ( i = 0; i < errPos; i++ )
{
if ( instring[i] == '\n' )
{
nlines++;
nchar = 1;
}
else
{
nchar++;
}
}
int start;
int end;
int flag = ((instring[errPos]==';') | (instring[errPos-1]==';')) ? 1 : 0;
for ( i = errPos; i >= 0; i-- )
{
start = i;
if ( flag && (start >= errPos-1) )
continue;
if ( instring[i] == ';' )
{
if ( !flag )
{
start = i+1;
if ( instring[start] == '\n' )
start++;
}
break;
}
}
for ( i = errPos; i < len; i++ )
{
end = i;
if ( instring[i] == ';' && end > start)
{
break;
}
}
if ( errPos - start > 30 )
{
start = errPos - 30;
}
if ( end - errPos > 30 )
{
end = errPos + 30;
}
char substring[96];
memset( substring, 0, 96 );
strncpy( substring, &(instring[start]), end-start+1 );
char str[256];
//sprintf( str, "error at line %d character %d\n \"%s\"\n", nlines, nchar, substring );
sprintf( str, "error at line %d character %d\n\"%s\"\n", nlines, nchar, substring );
int width = errPos-start;
for ( i = 0; i < width; i++ )
{
strcat( str, " " );
}
strcat( str, "|\n" );
for ( i = 0; i < width; i++ )
{
strcat( str, " " );
}
strcat( str, "^\n" );
errors.set( str );
}
}
//.----------------------------------------------------------------------------.
//| Function : StrToUpper |
//| Description: Converts all lowercase chars in a string to uppercase. |
//.----------------------------------------------------------------------------.
void StrToUpper(char *string)
{
for (unsigned int i = 0; i < strlen(string); i++)
string[i] = toupper(string[i]);
}
}