- int i = find_uniform_index(tag);
- if(i<0)
- return add_uniform(tag, uni);
-
- uniforms[i].replace_value(uni);
- dirty |= 1<<i;
-}
-
-template<typename T, typename V>
-void ProgramData::uniform(Tag tag, V value)
-{
- if(!validate_tag(tag))
- return;
-
- int i = find_uniform_index(tag);
- if(i<0)
- return add_uniform(tag, new T(value));
-
- if(T *uni = dynamic_cast<T *>(uniforms[i].value))
- uni->set(value);
- else
- uniforms[i].replace_value(new T(value));
-
- dirty |= 1<<i;
-}
-
-template<typename T, typename V>
-void ProgramData::uniform_array(Tag tag, unsigned n, V value)
-{
- if(!validate_tag(tag))
- return;
-
- int i = find_uniform_index(tag);
- if(i<0)
- return add_uniform(tag, new UniformArray<T>(n, value));
-
- UniformArray<T> *uni = dynamic_cast<UniformArray<T> *>(uniforms[i].value);
- if(uni && n==uni->size())
- uni->set(value);
- else
- uniforms[i].replace_value(new UniformArray<T>(n, value));
+ const char *val_begin = static_cast<const char *>(value);
+ const char *val_end = val_begin+array_size*get_type_size(type);
+ char *store_begin = uniform_data.data()+i->data_offset;
+ copy(val_begin, val_end, store_begin);