-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
#ifndef MSP_GL_PROGRAM_H_
#define MSP_GL_PROGRAM_H_
#include <list>
#include <string>
#include <msp/datafile/objectloader.h>
+#include "bindable.h"
#include "gl.h"
namespace Msp {
class Shader;
-class Program
+class Program: public Bindable<Program>
{
-private:
- unsigned id;
- std::list<Shader *> shaders;
- bool del_shaders;
- bool linked;
-
- static const Program *cur_prog;
-
public:
class Loader: public DataFile::ObjectLoader<Program>
{
Loader(Program &);
private:
- void vertex_shader(const std::string &);
- void fragment_shader(const std::string &);
- void attribute(unsigned, const std::string &);
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;
+
+ StandardFeatures();
+
+ std::string create_flags() const;
};
+ struct UniformInfo
+ {
+ std::string name;
+ int location;
+ int size;
+ GLenum type;
+ };
+
+private:
+ unsigned id;
+ std::list<Shader *> shaders;
+ bool del_shaders;
+ bool linked;
+ std::map<std::string, UniformInfo> uniforms;
+
+public:
Program();
+ Program(const StandardFeatures &);
Program(const std::string &, const std::string &);
private:
void init();
void attach_shader(Shader &shader);
void detach_shader(Shader &shader);
+ void add_standard_shaders(const StandardFeatures &);
+private:
+ static std::string process_standard_source(const char **, const std::string &);
+public:
const std::list<Shader *> &get_shaders() const { return shaders; }
void set_del_shaders(bool);
void bind_attribute(unsigned, const std::string &);
void link();
- int get_param(GLenum param) const;
- bool get_linked() const { return linked; }
+ bool is_linked() const { return linked; }
std::string get_info_log() const;
void bind() const;
int get_uniform_location(const std::string &) const;
static void unbind();
-
-private:
- void maybe_bind();
};
} // namespace GL