Skip to content

Commit 8b7378a

Browse files
committed
- Internal GLSL brightness shader, so gamma control can work without the glsl/brightness_fp.glsl file when r_ext_vertex_shader is 1 and r_alternateBrightness is 2.
- r_skyTess - an attempt to make the complexity of skydomes an option so it could use less polygons. Has no effect on skyboxes
1 parent 7749e7d commit 8b7378a

File tree

4 files changed

+332
-66
lines changed

4 files changed

+332
-66
lines changed

code/renderer_oa/tr_init.c

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ cvar_t *r_leifx; // Leilei - leifx nostalgia filter
213213
cvar_t *r_shadeMethod; // Leilei
214214
cvar_t *r_particles; // Leilei - particle effects motif
215215

216+
cvar_t *r_skytess; // leilei - lower detail of skies
217+
216218
cvar_t *r_leidebug; // Leilei - debug
217219
cvar_t *r_leidebugeye; // Leilei - eye debug
218220

@@ -1293,6 +1295,9 @@ void R_Register( void )
12931295
r_mockvr = ri.Cvar_Get( "r_mockvr", "0" , CVAR_CHEAT);
12941296
r_leifx = ri.Cvar_Get( "r_leifx", "0" , CVAR_ARCHIVE | CVAR_LATCH);
12951297
r_shadeMethod = ri.Cvar_Get( "r_shadeMethod", "0" , CVAR_ARCHIVE); // leilei - Alternative lightingDiffuse
1298+
1299+
r_skytess = ri.Cvar_Get( "r_skyTess", "8", CVAR_ARCHIVE ); // leilei - sky detail adjustment
1300+
12961301
r_detailTextureScale = ri.Cvar_Get( "r_detailtextureScale", "0", CVAR_ARCHIVE | CVAR_LATCH ); // leilei - adjust scale of detail textures
12971302
r_detailTextureLayers = ri.Cvar_Get( "r_detailtextureLayers", "0", CVAR_ARCHIVE | CVAR_LATCH ); // leilei - add more detail layers
12981303

@@ -1449,7 +1454,56 @@ void R_GLSL_Init(void)
14491454

14501455
Q_strncpyz(programVertexObjects[0], "glsl/brightness_vp.glsl", sizeof(programVertexObjects[0]));
14511456
Q_strncpyz(programFragmentObjects[0], "glsl/brightness_fp.glsl", sizeof(programFragmentObjects[0]));
1452-
tr.BrightnessProgram = RE_GLSL_RegisterProgram("brightness", (const char *)programVertexObjects, 1, (const char *)programFragmentObjects, 1);
1457+
if (!(tr.BrightnessProgram = RE_GLSL_RegisterProgram("brightness", (const char *)programVertexObjects, 1, (const char *)programFragmentObjects, 1)))
1458+
{
1459+
// load it through this code
1460+
ri.Printf( PRINT_ALL, "----- Trying to load Brightness Shader internally!!! \n" );
1461+
1462+
const GLchar *brightnessfp = \
1463+
"#version 120 \n"
1464+
"uniform sampler2D u_Texture0; \n"
1465+
"varying vec2 texture_coordinate;\n"
1466+
"uniform float u_CC_Overbright; \n"
1467+
"uniform float u_CC_Gamma; \n"
1468+
"void main()\n"
1469+
"{\n"
1470+
"gl_FragColor = texture2D(u_Texture0, texture_coordinate); \n"
1471+
"vec3 color;\n"
1472+
"vec3 colord;\n"
1473+
"int coloredr;\n"
1474+
"int coloredg;\n"
1475+
"int coloredb;\n"
1476+
"color.r = 1;\n"
1477+
"color.g = 1;\n"
1478+
"color.b = 1;\n"
1479+
"int yeh = 0;\n"
1480+
"float ohyes;\n"
1481+
"// Overbrights\n"
1482+
"gl_FragColor *= (u_CC_Overbright + 1);\n"
1483+
"// Gamma Correction\n"
1484+
"float gamma = u_CC_Gamma;\n"
1485+
"gl_FragColor.r = pow(gl_FragColor.r, 1.0 / gamma);\n"
1486+
"gl_FragColor.g = pow(gl_FragColor.g, 1.0 / gamma);\n"
1487+
"gl_FragColor.b = pow(gl_FragColor.b, 1.0 / gamma);\n"
1488+
"}\n";
1489+
1490+
const GLchar *brightnessvp = \
1491+
"varying vec2 texture_coordinate;\n"
1492+
"varying vec2 texture_coordinate2;\n"
1493+
"varying vec2 texture_coordinate3;\n"
1494+
"varying vec2 texture_coordinate4;\n"
1495+
"varying vec2 texture_coordinate5;\n"
1496+
"varying float scale;\n"
1497+
"uniform float u_CC_Overbright;\n"
1498+
"uniform float u_CC_Gamma;\n"
1499+
"void main()\n"
1500+
"{\n"
1501+
"gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; \n"
1502+
"texture_coordinate = vec2(gl_MultiTexCoord0); \n"
1503+
"}\n";
1504+
1505+
tr.BrightnessProgram = RE_GLSL_RegisterProgramRaw("brightnessInternal", (const char *)brightnessvp, 1, (const char *)brightnessfp, 1);
1506+
}
14531507

14541508
if (strcmp( (const char *)r_postprocess->string, "none" )) {
14551509
sprintf(p,"glsl/%s_vp.glsl",r_postprocess->string);

code/renderer_oa/tr_local.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,6 +1402,8 @@ extern cvar_t *r_detailTextureLayers; // leilei - add in more smaller detail t
14021402

14031403
extern cvar_t *r_textureDither; // leilei - apply dithering for lower texture bits
14041404

1405+
extern cvar_t *r_skytess; // leilei - adjusts the subdivisions of the sky (max 8, min 1)
1406+
14051407
//====================================================================
14061408

14071409
void R_SwapBuffers( int );
@@ -1948,6 +1950,7 @@ static ID_INLINE void R_GLSL_SetUniform_rubyOutputSize(glslProgram_t *program, c
19481950

19491951
void R_GLSL_Init(void);
19501952
qhandle_t RE_GLSL_RegisterProgram(const char *name, const char *programVertexObjects, int numVertexObjects, const char *programFragmentObjects, int numFragmentObjects);
1953+
qhandle_t RE_GLSL_RegisterProgramRaw(const char *name, const char *programVertexObjects, int numVertexObjects, const char *programFragmentObjects, int numFragmentObjects);
19511954
void R_GLSL_UseProgram(qhandle_t index);
19521955
void RB_GLSL_StageIteratorGeneric(void);
19531956
void RB_GLSL_StageIteratorVertexLitTexture(void);

code/renderer_oa/tr_shader.c

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,137 @@ static qboolean R_GLSL_LoadProgram(glslProgram_t *program, const char *name, con
456456
#endif
457457
}
458458

459+
static qboolean R_GLSL_LoadProgramRaw(glslProgram_t *program, const char *name, const char *programVertexObjects, int numVertexObjects, const char *programFragmentObjects, int numFragmentObjects) {
460+
#ifdef GLSL_BACKEND
461+
GLcharARB *buffer_vp[MAX_PROGRAM_OBJECTS];
462+
GLcharARB *buffer_fp[MAX_PROGRAM_OBJECTS];
463+
GLcharARB *buffer;
464+
GLhandleARB shader_vp;
465+
GLhandleARB shader_fp;
466+
GLint status;
467+
char *str;
468+
int size = 0;
469+
int i;
470+
471+
472+
/* create program */
473+
program->program = qglCreateProgramObjectARB();
474+
475+
/* vertex program */
476+
for (i = 0, str = (const char *)programVertexObjects; i < numVertexObjects; i++, str += MAX_QPATH) {
477+
buffer_vp[i] = str;
478+
size += sizeof(str)*32;
479+
if (!buffer_vp[i]) {
480+
ri.Printf( PRINT_WARNING, "Couldn't load %s", str);
481+
return qfalse;
482+
}
483+
484+
/* compile vertex shader */
485+
shader_vp = qglCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
486+
qglShaderSourceARB(shader_vp, 1, (const GLcharARB **)&buffer_vp, NULL);
487+
qglCompileShaderARB(shader_vp);
488+
489+
/* check for errors in vertex shader */
490+
qglGetObjectParameterivARB(shader_vp, GL_OBJECT_COMPILE_STATUS_ARB, &status);
491+
if (!status) {
492+
int length;
493+
char *msg;
494+
495+
/* print glsl error message */
496+
qglGetObjectParameterivARB(shader_vp, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
497+
msg = ri.Hunk_AllocateTempMemory(length);
498+
qglGetInfoLogARB(shader_vp, length, &length, msg);
499+
ri.Printf(PRINT_ALL, "Error:\n%s\n", msg);
500+
ri.Hunk_FreeTempMemory(msg);
501+
502+
/* exit */
503+
ri.Printf( PRINT_WARNING, "Couldn't compile vertex shader for program %s", name);
504+
return qfalse;
505+
}
506+
507+
/* attach vertex shader to program */
508+
qglAttachObjectARB(program->program, shader_vp);
509+
qglDeleteObjectARB(shader_vp);
510+
}
511+
512+
/* fragment program */
513+
for (i = 0, str = (const char *)programFragmentObjects; i < numFragmentObjects; i++, str += MAX_QPATH) {
514+
buffer_fp[i] = str;
515+
size += sizeof(str)*32;
516+
if (!buffer_fp[i]) {
517+
ri.Printf( PRINT_WARNING, "Couldn't load %s", str);
518+
return qfalse;
519+
}
520+
521+
/* compile fragment shader */
522+
shader_fp = qglCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
523+
qglShaderSourceARB(shader_fp, 1, (const GLcharARB **)&buffer_fp[i], NULL);
524+
qglCompileShaderARB(shader_fp);
525+
526+
/* check for errors in fragment shader */
527+
qglGetObjectParameterivARB(shader_fp, GL_OBJECT_COMPILE_STATUS_ARB, &status);
528+
if (!status) {
529+
int length;
530+
char *msg;
531+
532+
/* print glsl error message */
533+
534+
qglGetObjectParameterivARB(shader_fp, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
535+
msg = ri.Hunk_AllocateTempMemory(length);
536+
qglGetInfoLogARB(shader_fp, length, &length, msg);
537+
ri.Printf(PRINT_ALL, "Error:\n%s\n", msg);
538+
ri.Hunk_FreeTempMemory(msg);
539+
ri.Printf(PRINT_DEVELOPER, "oops\n");
540+
/* exit */
541+
ri.Printf( PRINT_WARNING, "Couldn't compile fragment shader for program %s", name);
542+
return qfalse;
543+
}
544+
545+
/* attach fragment shader to program */
546+
qglAttachObjectARB(program->program, shader_fp);
547+
qglDeleteObjectARB(shader_fp);
548+
}
549+
550+
/* link complete program */
551+
qglLinkProgramARB(program->program);
552+
/* check for linking errors */
553+
qglGetObjectParameterivARB(program->program, GL_OBJECT_LINK_STATUS_ARB, &status);
554+
if (!status) {
555+
int length;
556+
char *msg;
557+
/* print glsl error message */
558+
qglGetObjectParameterivARB(program->program, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
559+
msg = ri.Hunk_AllocateTempMemory(length);
560+
qglGetInfoLogARB(program->program, length, &length, msg);
561+
ri.Printf(PRINT_ALL, "Error:\n%s\n", msg);
562+
ri.Hunk_FreeTempMemory(msg);
563+
564+
/* exit */
565+
ri.Printf( PRINT_WARNING, "Couldn't link shaders for program %s", name);
566+
return qfalse;
567+
}
568+
/* build single large program file for parsing */
569+
buffer = ri.Hunk_AllocateTempMemory(++size);
570+
571+
Q_strncpyz(buffer, buffer_vp[0], size);
572+
573+
for (i = 1; i < numVertexObjects; i++)
574+
strncat(buffer, buffer_vp[i], size);
575+
for (i = 0; i < numFragmentObjects; i++)
576+
strncat(buffer, buffer_fp[i], size);
577+
/* get uniform locations */
578+
qglUseProgramObjectARB(program->program);
579+
R_GLSL_ParseProgram(program, buffer);
580+
qglUseProgramObjectARB(0);
581+
/* clean up */
582+
ri.Hunk_FreeTempMemory(buffer);
583+
584+
return qtrue;
585+
#endif
586+
}
587+
588+
589+
459590
/*
460591
* RE_GLSL_RegisterProgram
461592
* Loads in a program of given name
@@ -514,6 +645,65 @@ qhandle_t RE_GLSL_RegisterProgram(const char *name, const char *programVertexObj
514645
}
515646

516647

648+
/*
649+
* RE_GLSL_RegisterProgram
650+
* Loads in a program of given name
651+
*/
652+
qhandle_t RE_GLSL_RegisterProgramRaw(const char *name, const char *programVertexObjects, int numVertexObjects, const char *programFragmentObjects, int numFragmentObjects) {
653+
#ifdef GLSL_BACKEND
654+
glslProgram_t *program;
655+
qhandle_t hProgram;
656+
657+
if (!vertexShaders)
658+
return 0;
659+
660+
if (!name || !name[0]) {
661+
ri.Printf(PRINT_ALL, "RE_GLSL_RegisterProgram: NULL name\n");
662+
return 0;
663+
}
664+
665+
if (strlen(name) >= MAX_QPATH) {
666+
Com_Printf("Program name exceeds MAX_QPATH\n");
667+
return 0;
668+
}
669+
670+
/* search the currently loaded programs */
671+
for (hProgram = 0; hProgram < tr.numPrograms; hProgram++) {
672+
program = tr.programs[hProgram];
673+
if (!strcmp(program->name, name)) {
674+
if (!program->valid)
675+
return 0;
676+
677+
return hProgram;
678+
}
679+
}
680+
681+
/* allocate a new glslProgram_t */
682+
if ((program = R_GLSL_AllocProgram()) == NULL) {
683+
ri.Printf(PRINT_WARNING, "RE_GLSL_RegisterProgram: R_GLSL_AllocProgram() failed for '%s'\n", name);
684+
return 0;
685+
}
686+
687+
/* only set the name after the program has successfully loaded */
688+
Q_strncpyz(program->name, name, sizeof(program->name));
689+
690+
R_IssuePendingRenderCommands();
691+
692+
/* load the files */
693+
if (!R_GLSL_LoadProgramRaw(program, name, (const char*)programVertexObjects, numVertexObjects, (const char*)programFragmentObjects, numFragmentObjects)) {
694+
qglDeleteObjectARB(program->program);
695+
program->valid = qfalse;
696+
//vertexShaders=0; //If program in error disable the glsl feature altogether
697+
return 0;
698+
}
699+
700+
program->valid = qtrue;
701+
return program->index;
702+
#endif
703+
}
704+
705+
706+
517707
void R_RemapShader(const char *shaderName, const char *newShaderName, const char *timeOffset) {
518708
char strippedName[MAX_QPATH];
519709
int hash;

0 commit comments

Comments
 (0)