/* * @brief */ void R_ProgramVariable(r_variable_t *variable, GLenum type, const char *name) { memset(variable, 0, sizeof(*variable)); variable->location = -1; if (!r_state.active_program) { Com_Warn("No program currently bound\n"); return; } switch (type) { case R_ATTRIBUTE: variable->location = qglGetAttribLocation(r_state.active_program->id, name); break; default: variable->location = qglGetUniformLocation(r_state.active_program->id, name); break; } if (variable->location == -1) { Com_Warn("Failed to resolve variable %s in program %s\n", name, r_state.active_program->name); return; } variable->type = type; g_strlcpy(variable->name, name, sizeof(variable->name)); memset(&variable->value, 0xff, sizeof(variable->value)); }
static r_progvar_t* R_ProgramVariable (int type, const char* name) { r_progvar_t* v; int i; if (!r_state.active_program) { Com_DPrintf(DEBUG_RENDERER, "R_ProgramVariable: \"%s\" - No program bound.\n", name); return nullptr; } /* find the variable */ for (i = 0; i < MAX_PROGRAM_VARS; i++) { v = &r_state.active_program->vars[i]; if (!v->location) break; if (v->type == type && Q_streq(v->name, name)) return v; } if (i == MAX_PROGRAM_VARS) { Com_Printf("R_ProgramVariable: MAX_PROGRAM_VARS reached.\n"); return nullptr; } /* or query for it */ if (type == GL_UNIFORM) v->location = qglGetUniformLocation(r_state.active_program->id, name); else v->location = qglGetAttribLocation(r_state.active_program->id, name); if (v->location == -1) { Com_Printf("R_ProgramVariable: Could not find parameter %s in program %s.\n", name, r_state.active_program->name); v->location = 0; return nullptr; } v->type = type; Q_strncpyz(v->name, name, sizeof(v->name)); return v; }