Polymer GPU program management stuff.

git-svn-id: https://svn.eduke32.com/eduke32@1152 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
plagman 2008-11-25 09:07:38 +00:00
parent c95e53c2d0
commit 08923413f2
2 changed files with 142 additions and 2 deletions

View File

@ -108,8 +108,34 @@ typedef struct s_pranimatespritesinfo {
int x, y, a, smoothratio;
} _pranimatespritesinfo;
extern _prsector* prsectors[MAXSECTORS];
extern _prwall* prwalls[MAXWALLS];
#define PR_MAXLIGHTS 128
typedef enum {
PR_LIGHT_POINT,
PR_LIGHT_SPOT,
PR_LIGHT_DIRECTIONAL
} prlighttype;
typedef struct s_prlight {
int x, y, z, horiz, range, faderange;
short angle, sector;
prlighttype type;
} _prlight;
#define PR_INFO_LOG_BUFFER_SIZE 512
typedef enum {
PR_BIT_DEFAULT, // must be just before last
PR_BIT_COUNT // must be last
} prbittype;
typedef struct s_prprogrambit {
int bit;
char* vert_def;
char* vert_prog;
char* frag_def;
char* frag_prog;
} _prprogrambit;
// CONTROL
extern int updatesectors;
@ -123,6 +149,8 @@ void polymer_drawmasks(void);
void polymer_rotatesprite(int sx, int sy, int z, short a, short picnum, signed char dashade, char dapalnum, char dastat, int cx1, int cy1, int cx2, int cy2);
void polymer_drawmaskwall(int damaskwallcnt);
void polymer_drawsprite(int snum);
void polymer_resetlights(void);
void polymer_addlight(_prlight light);
# ifdef POLYMER_C
@ -160,6 +188,8 @@ static void polymer_drawskybox(short tilenum);
// MDSPRITES
static void polymer_drawmdsprite(spritetype *tspr);
static void polymer_loadmodelvbos(md3model* m);
// GPU PROGRAMS
static void polymer_compileprogram(int programbits);
# endif // !POLYMER_C

View File

@ -118,6 +118,32 @@ GLuint skyboxdatavbo;
GLfloat artskydata[16];
_prlight prlights[PR_MAXLIGHTS];
int lightcount;
_prprogrambit prprogrambits[PR_BIT_COUNT] = {
{
.bit = 1 << PR_BIT_DEFAULT,
.vert_def =
"\n"
"void main(void)\n"
"{\n",
.vert_prog =
" gl_Position = ftransform();\n"
"}\n",
.frag_def =
"\n"
"void main(void)\n"
"{\n"
" vec4 result = vec4(1.0, 1.0, 1.0, 1.0);\n",
.frag_prog =
" gl_FragColor = result;\n"
"}\n",
}
};
GLhandleARB prprograms[1 << PR_BIT_COUNT];
// CONTROL
GLdouble spritemodelview[16];
GLdouble rootmodelviewmatrix[16];
@ -619,6 +645,17 @@ void polymer_setanimatesprites(animatespritesptr animatesprites,
asi.smoothratio = smoothratio;
}
void polymer_resetlights(void)
{
lightcount = 0;
}
void polymer_addlight(_prlight light)
{
if (lightcount < PR_MAXLIGHTS)
prlights[lightcount++] = light;
}
// CORE
static void polymer_displayrooms(short dacursectnum)
{
@ -2511,4 +2548,77 @@ static void polymer_loadmodelvbos(md3model* m)
}
}
// GPU PROGRAMS
static void polymer_compileprogram(int programbits)
{
int i, enabledbits;
GLhandleARB vert, frag, program;
GLcharARB* source[PR_BIT_COUNT * 2];
GLcharARB infobuffer[PR_INFO_LOG_BUFFER_SIZE];
// ========= VERTEX
vert = bglCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
enabledbits = 0;
while (i < PR_BIT_COUNT)
{
if (programbits & prprogrambits[i].bit)
{
source[i] = prprogrambits[i].vert_def;
enabledbits++;
}
i++;
}
i = 0;
while (i < PR_BIT_COUNT)
{
if (programbits & prprogrambits[i].bit)
source[enabledbits + i] = prprogrambits[i].vert_prog;
i++;
}
bglShaderSourceARB(vert, enabledbits * 2, (const GLcharARB**)source, NULL);
bglCompileShaderARB(vert);
// ========= FRAGMENT
frag = bglCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
enabledbits = i = 0;
while (i < PR_BIT_COUNT)
{
if (programbits & prprogrambits[i].bit)
{
source[i] = prprogrambits[i].frag_def;
enabledbits++;
}
i++;
}
i = 0;
while (i < PR_BIT_COUNT)
{
if (programbits & prprogrambits[i].bit)
source[enabledbits + i] = prprogrambits[i].frag_prog;
i++;
}
bglShaderSourceARB(frag, enabledbits * 2, (const GLcharARB**)source, NULL);
bglCompileShaderARB(frag);
// ========= PROGRAM
program = bglCreateProgramObjectARB();
bglAttachObjectARB(program, vert);
bglAttachObjectARB(program, frag);
bglLinkProgramARB(program);
bglGetInfoLogARB(program, PR_INFO_LOG_BUFFER_SIZE, NULL, infobuffer);
prprograms[programbits] = program;
OSD_Printf("Shader log info:\n%s\n", infobuffer);
}
#endif