/*
================================================================================================
idRenderProgManager::CommitUnforms
================================================================================================
*/
void idRenderProgManager::CommitUniforms() {
	const int progID = GetGLSLCurrentProgram();
	const glslProgram_t & prog = glslPrograms[progID];

	if ( r_useUniformArrays.GetBool() ) {
		ALIGNTYPE16 idVec4 localVectors[RENDERPARM_USER + MAX_GLSL_USER_PARMS];

		if ( prog.vertexShaderIndex >= 0 ) {
			const idList<int> & vertexUniforms = vertexShaders[prog.vertexShaderIndex].uniforms;
			if ( prog.vertexUniformArray != -1 && vertexUniforms.Num() > 0 ) {
				for ( int i = 0; i < vertexUniforms.Num(); i++ ) {
					localVectors[i] = glslUniforms[vertexUniforms[i]];
				}
				qglUniform4fv( prog.vertexUniformArray, vertexUniforms.Num(), localVectors->ToFloatPtr() );
			}
		}

		if ( prog.fragmentShaderIndex >= 0 ) {
			const idList<int> & fragmentUniforms = fragmentShaders[prog.fragmentShaderIndex].uniforms;
			if ( prog.fragmentUniformArray != -1 && fragmentUniforms.Num() > 0 ) {
				for ( int i = 0; i < fragmentUniforms.Num(); i++ ) {
					localVectors[i] = glslUniforms[fragmentUniforms[i]];
				}
				qglUniform4fv( prog.fragmentUniformArray, fragmentUniforms.Num(), localVectors->ToFloatPtr() );
			}
		}
	} else {
		for ( int i = 0; i < prog.uniformLocations.Num(); i++ ) {
			const glslUniformLocation_t & uniformLocation = prog.uniformLocations[i];
			qglUniform4fv( uniformLocation.uniformIndex, 1, glslUniforms[uniformLocation.parmIndex].ToFloatPtr() );
		}
	}
}
Example #2
0
void R_ProgramParameter4fvs (const char* name, GLint size, GLfloat* value)
{
	r_progvar_t* v;

	if (!(v = R_ProgramVariable(GL_UNIFORM, name)))
		return;

	qglUniform4fv(v->location, size, value);
}