int size;
GLenum type;
glGetActiveAttrib(id, i, sizeof(name), &len, &size, &type, name);
- if(len && !strncmp(name, "gl_", 3))
+ if(len && strncmp(name, "gl_", 3))
+ {
+ if(len>3 && !strcmp(name+len-3, "[0]"))
+ name[len-3] = 0;
+
+ AttributeInfo &info = attributes[name];
+ info.name = name;
+ info.location = glGetAttribLocation(id, name);
+ info.size = size;
+ info.type = type;
+ }
+ else
legacy_vars = true;
}
}
return i->second.block->bind_point<0 ? i->second.location : -1;
}
+const Program::AttributeInfo &Program::get_attribute_info(const string &name) const
+{
+ return get_item(attributes, name);
+}
+
+int Program::get_attribute_location(const string &n) const
+{
+ if(n[n.size()-1]==']')
+ throw invalid_argument("Program::get_attribute_location");
+
+ AttributeMap::const_iterator i = attributes.find(n);
+ return i!=attributes.end() ? i->second.location : -1;
+}
+
void Program::bind() const
{
if(!linked)
LayoutHash layout_hash;
};
+ struct AttributeInfo
+ {
+ std::string name;
+ unsigned location;
+ unsigned size;
+ GLenum type;
+ };
+
typedef std::vector<Shader *> ShaderList;
typedef std::map<std::string, UniformInfo> UniformMap;
typedef std::map<std::string, UniformBlockInfo> UniformBlockMap;
+ typedef std::map<std::string, AttributeInfo> AttributeMap;
private:
unsigned id;
UniformBlockMap uniform_blocks;
UniformMap uniforms;
LayoutHash uniform_layout_hash;
+ AttributeMap attributes;
bool legacy_vars;
public:
const UniformMap &get_uniforms() const { return uniforms; }
const UniformInfo &get_uniform_info(const std::string &) const;
int get_uniform_location(const std::string &) const;
+ const AttributeMap &get_attributes() const { return attributes; }
+ const AttributeInfo &get_attribute_info(const std::string &) const;
+ int get_attribute_location(const std::string &) const;
bool uses_legacy_variables() const { return legacy_vars; }