void R_ProgramParameter1f (const char* name, GLfloat value) { r_progvar_t* v; if (!(v = R_ProgramVariable(GL_UNIFORM, name))) return; qglUniform1f(v->location, value); }
/* * R_ProgramParameter1f */ void R_ProgramParameter1f(r_uniform1f_t *variable, GLfloat value) { if (!variable || variable->location == -1) { Com_Warn("NULL or invalid variable\n"); return; } if (variable->value.f == value) return; qglUniform1f(variable->location, value); variable->value.f = value; R_GetError(variable->name); }
//Does a water warp on the pre-fragmented glpoly_t chain void EmitWaterPolys (msurface_t *fa) { glpoly_t *p; float *v, s, t, os, ot; int i; byte *col; extern cvar_t r_telecolor, r_watercolor, r_slimecolor, r_lavacolor; float wateralpha = bound((1 - r_refdef2.max_watervis), r_wateralpha.value, 1); vec3_t nv; GLint shader, u_gamma, u_contrast; GL_DisableMultitexture(); if (gl_fogenable.value) glEnable(GL_FOG); GL_Bind (fa->texinfo->texture->gl_texturenum); /* FIXME: do the uniforms somewhere else */ shader = glsl_shaders[SHADER_TURB].shader; qglUseProgram(shader); u_gamma = qglGetUniformLocation(shader, "gamma"); u_contrast = qglGetUniformLocation(shader, "contrast"); qglUniform1f(u_gamma, v_gamma.value); qglUniform1f(u_contrast, v_contrast.value); if (r_fastturb.value) { GL_Bind(whitetexture); if (strstr (fa->texinfo->texture->name, "water") || strstr (fa->texinfo->texture->name, "mwat")) col = r_watercolor.color; else if (strstr (fa->texinfo->texture->name, "slime")) col = r_slimecolor.color; else if (strstr (fa->texinfo->texture->name, "lava")) col = r_lavacolor.color; else if (strstr (fa->texinfo->texture->name, "tele")) col = r_telecolor.color; else col = (byte *) &fa->texinfo->texture->flatcolor3ub; glColor3ubv (col); if (wateralpha < 1.0 && wateralpha >= 0) { glEnable (GL_BLEND); col[3] = wateralpha*255; glColor4ubv (col); // 1, 1, 1, wateralpha glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); if (wateralpha < 0.9) glDepthMask (GL_FALSE); } EmitFlatWaterPoly (fa); if (wateralpha < 1.0 && wateralpha >= 0) { glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glColor3ubv (color_white); glDisable (GL_BLEND); if (wateralpha < 0.9) glDepthMask (GL_TRUE); } glColor3ubv (color_white); } else { for (p = fa->polys; p; p = p->next) { glBegin(GL_POLYGON); for (i = 0, v = p->verts[0]; i < p->numverts; i++, v += VERTEXSIZE) { os = v[3]; ot = v[4]; s = os + SINTABLE_APPROX(ot * 2 + r_refdef2.time); s *= (1.0 / 64); t = ot + SINTABLE_APPROX(os * 2 + r_refdef2.time); t *= (1.0 / 64); //VULT RIPPLE : Not sure where this came from first, but I've seen in it more than one engine //I got this one from the QMB engine though VectorCopy(v, nv); //Over 20 this setting gets pretty cheaty if (amf_waterripple.value && (cls.demoplayback || cl.spectator) && !strstr (fa->texinfo->texture->name, "tele")) nv[2] = v[2] + (bound(0, amf_waterripple.value, 20)) *sin(v[0]*0.02+r_refdef2.time)*sin(v[1]*0.02+r_refdef2.time)*sin(v[2]*0.02+r_refdef2.time); glTexCoord2f (s, t); glVertex3fv (nv); } glEnd(); } } qglUseProgram(0); if (gl_fogenable.value) glDisable(GL_FOG); }
GLvoid APIENTRY GLDSA_ProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0) { GL_UseProgram(program); qglUniform1f(location, v0); }