+ // Register uniforms, such that they will automatically be set
+ // before the shader runs. This is more efficient than set_uniform_*
+ // in effect_util.h, because it doesn't need to do name lookups
+ // every time. Also, in the future, it will use uniform buffer objects
+ // (UBOs) if available to reduce the number of calls into the driver.
+ //
+ // May not be called after output_fragment_shader() has returned.
+ // The pointer must be valid for the entire lifetime of the Effect,
+ // since the value is pulled from it each execution. The value is
+ // guaranteed to be read after set_gl_state() for the effect has
+ // returned, so you can safely update its value from there.
+ //
+ // Note that this will also declare the uniform in the shader for you,
+ // so you should not do that yourself. (This is so it can be part of
+ // the right uniform block.) However, it is probably a good idea to
+ // have a commented-out declaration so that it is easier to see the
+ // type and thus understand the shader on its own.
+ //
+ // Calling register_* will automatically imply register_uniform_*,
+ // except for register_int as noted above.
+ void register_uniform_sampler2d(const std::string &key, const int *value);
+ void register_uniform_bool(const std::string &key, const bool *value);
+ void register_uniform_int(const std::string &key, const int *value);
+ void register_uniform_ivec2(const std::string &key, const int *values);
+ void register_uniform_float(const std::string &key, const float *value);
+ void register_uniform_vec2(const std::string &key, const float *values);
+ void register_uniform_vec3(const std::string &key, const float *values);
+ void register_uniform_vec4(const std::string &key, const float *values);
+ void register_uniform_float_array(const std::string &key, const float *values, size_t num_values);
+ void register_uniform_vec2_array(const std::string &key, const float *values, size_t num_values);
+ void register_uniform_vec3_array(const std::string &key, const float *values, size_t num_values);
+ void register_uniform_vec4_array(const std::string &key, const float *values, size_t num_values);
+ void register_uniform_mat3(const std::string &key, const Eigen::Matrix3d *matrix);
+