Files
FC1/RenderDll/XRenderOGL/GLVPrograms.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

223 lines
4.8 KiB
C++

/*=============================================================================
GLVPrograms.h : OpenGL vertex programming interface declaration.
Copyright 1999 K&M. All Rights Reserved.
Revision history:
* Created by Honitch Andrey
=============================================================================*/
#ifndef __GLVPROGRAMS_H__
#define __GLVPROGRAMS_H__
#define VPF_TRACK_MATRIX 1
#define VPVST_FOGGLOBAL 1
#define VPVST_CLIPPLANES 2
#define VPVST_NOFOG 4
#define VPFI_NOFOG 1
#define VPFI_UNIFIEDPOS 2
#define VPFI_SUPPORTMULTVLIGHTS 4
class CVProgram_GLBase : public CVProgram
{
public:
CVProgram_GLBase(GLenum tgt)
{
m_Target = tgt;
for (int i=0; i<8; i++)
{
m_bValid[i] = false;
m_Program[i] = 0;
}
}
virtual ~CVProgram_GLBase()
{
for (int i=0; i<8; i++)
{
mfDel(i);
}
}
void mfBind(int Num)
{
if(!m_bValid[Num])
mfGen(Num);
glBindProgramNV(m_Target, m_Program[Num]);
}
void mfUnbind()
{
glBindProgramNV(m_Target, 0);
}
void mfLoad(GLuint size, const GLubyte * prog_text, int Num)
{
if(!m_bValid[Num])
mfGen(Num);
glLoadProgramNV(m_Target, m_Program[Num], size, prog_text);
GLint errpos;
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_NV, &errpos);
if(errpos != -1)
{
iLog->Log("program error:\n");
int bgn = errpos - 10;
bgn < 0 ? 0 : bgn;
const char * c = (const char *)(prog_text + bgn);
for(int i = 0; i < 30; i++)
{
if(bgn+i >= int(size-1))
break;
iLog->Log("%c", *c++);
}
iLog->Log("\n");
}
}
void mfLoad(GLuint size, const char * prog_text, int Num)
{
if(!m_bValid[Num])
mfGen(Num);
glLoadProgramNV(m_Target, m_Program[Num], size, (const GLubyte *) prog_text);
GLint errpos;
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_NV, &errpos);
if(errpos != -1)
{
char name[128];
sprintf(name, "%s.vps", m_Name);
FILE *fp = fopen(name, "w");
fprintf(fp, prog_text);
fclose(fp);
iLog->Log("program error: (see file '%s')\n", name);
int bgn = errpos - 10;
bgn < 0 ? 0 : bgn;
const char * c = (const char *)(prog_text + bgn);
for(int i = 0; i < 30; i++)
{
if(bgn+i >= int(size-1))
break;
iLog->Log("%c", *c++);
}
iLog->Log("\n");
}
}
void mfLoad(const char * prog_text, int Num)
{
mfLoad(strlen(prog_text), prog_text, Num);
}
// convenience methods
void mfParameter(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
{
glProgramParameter4fNV(m_Target, index, x, y, z, w);
}
void mfParameter(GLuint index, GLfloat * v)
{
glProgramParameter4fvNV(m_Target, index, v);
}
static void mfParameter(GLenum target, GLuint index, GLfloat * v)
{
glProgramParameter4fvNV(target, index, v);
}
void mfParameter3(GLuint index, const Vec3d& v)
{
GLfloat f[4];
f[0] = v[0];
f[1] = v[1];
f[2] = v[2];
f[3] = 1;
glProgramParameter4fvNV(m_Target, index, f);
}
void mfParameter4(GLuint index, const vec4_t v)
{
glProgramParameter4fvNV(m_Target, index, v);
}
void mfTrackMatrix(GLuint index, GLenum matrix, GLenum op)
{
glTrackMatrixNV(m_Target, index, matrix, op);
}
void mfEnable() { glEnable(m_Target); }
void mfDisable() { glDisable(m_Target); }
void mfDel(int Num)
{
if(m_bValid[Num])
glDeleteProgramsNV(1, &m_Program[Num]);
m_bValid[Num] = false;
}
bool mfIsValid(int Num) const { return m_bValid[Num]; }
protected:
void mfGen(int Num)
{
glGenProgramsNV(1, &m_Program[Num]);
m_bValid[Num] = true;
}
bool m_bValid[8];
GLenum m_Target;
GLuint m_Program[8];
};
struct STrackMatrix
{
GLuint m_Address;
GLenum m_Matrix;
GLenum m_Transform;
};
class CVProgram_GL : public CVProgram_GLBase
{
friend class CShader;
uint m_Flags;
char *m_Script;
TArray<STrackMatrix> m_TrackMatrix;
TArray<SParam> m_Params;
TArray<SArrayPointer *> m_Pointers;
void mfSetPointers(int nType);
bool mfActivate(int Num);
public:
char *mfCreateAdditionalVP(int Num);
CVProgram_GL() : CVProgram_GLBase(GL_VERTEX_PROGRAM_NV)
{
m_bCGType = false;
m_Flags = 0;
m_Script = NULL;
}
virtual int Size()
{
int nSize = sizeof(*this);
if (m_Script)
nSize += strlen(m_Script)+1;
nSize += m_Params.GetSize() * sizeof(SParam);
nSize += m_TrackMatrix.GetSize() * sizeof(STrackMatrix);
nSize += m_Pointers.GetSize() * sizeof(SArrayPointer *);
return nSize;
}
virtual ~CVProgram_GL();
virtual bool mfCompile(char *scr, SShader *ef);
virtual bool mfSet(bool bStat, int nSetPointers=1);
virtual void mfSetVariables(TArray<SParam>* Vars);
virtual void mfReset();
virtual bool mfHasPointer(EPointer ePtr);
};
#endif // __GLVPROGRAMS_H__