+public:
+ class Loader: public DataFile::ObjectLoader<Program>
+ {
+ public:
+ Loader(Program &);
+
+ private:
+ virtual void finish();
+
+ void attribute(unsigned, const std::string &);
+ void fragment_shader(const std::string &);
+ void standard();
+ void vertex_shader(const std::string &);
+ };
+
+ struct StandardFeatures
+ {
+ class Loader: public DataFile::ObjectLoader<StandardFeatures>
+ {
+ public:
+ Loader(StandardFeatures &);
+ };
+
+ bool texture;
+ bool material;
+ bool lighting;
+ bool specular;
+ bool normalmap;
+ bool shadow;
+ bool reflection;
+ bool transform;
+
+ StandardFeatures();
+
+ std::string create_flags() const;
+ };
+
+ struct UniformInfo
+ {
+ std::string name;
+ int location;
+ int size;
+ GLenum type;
+ };
+
+private:
+ unsigned id;
+ std::list<Shader *> shaders;
+ std::list<Shader *> owned_data;
+ bool linked;
+ std::map<std::string, UniformInfo> uniforms;
+ unsigned uniform_layout_hash;
+