]> git.tdb.fi Git - libs/gl.git/blob - source/program.h
System for generating standard shaders based on flags
[libs/gl.git] / source / program.h
1 /* $Id$
2
3 This file is part of libmspgl
4 Copyright © 2007 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #ifndef MSP_GL_PROGRAM_H_
9 #define MSP_GL_PROGRAM_H_
10
11 #include <list>
12 #include <string>
13 #include <msp/datafile/objectloader.h>
14 #include "bindable.h"
15 #include "gl.h"
16
17 namespace Msp {
18 namespace GL {
19
20 class Shader;
21
22 class Program: public Bindable<Program>
23 {
24 public:
25         class Loader: public DataFile::ObjectLoader<Program>
26         {
27         public:
28                 Loader(Program &);
29
30         private:
31                 virtual void finish();
32
33                 void attribute(unsigned, const std::string &);
34                 void fragment_shader(const std::string &);
35                 void standard();
36                 void vertex_shader(const std::string &);
37         };
38
39         struct StandardFeatures
40         {
41                 class Loader: public DataFile::ObjectLoader<StandardFeatures>
42                 {
43                 public:
44                         Loader(StandardFeatures &);
45                 };
46
47                 bool texture;
48                 bool material;
49                 bool lighting;
50                 bool specular;
51                 bool normalmap;
52                 bool shadow;
53
54                 StandardFeatures();
55
56                 std::string create_flags() const;
57         };
58
59 private:
60         unsigned id;
61         std::list<Shader *> shaders;
62         bool del_shaders;
63         bool linked;
64
65 public:
66         Program();
67         Program(const StandardFeatures &);
68         Program(const std::string &, const std::string &);
69 private:
70         void init();
71 public:
72         virtual ~Program();
73
74         void attach_shader(Shader &shader);
75         void detach_shader(Shader &shader);
76         void add_standard_shaders(const StandardFeatures &);
77 private:
78         static std::string process_standard_source(const char **, const std::string &);
79 public:
80         const std::list<Shader *> &get_shaders() const { return shaders; }
81         void set_del_shaders(bool);
82         void bind_attribute(unsigned, const std::string &);
83         void link();
84         int get_param(GLenum param) const;
85         bool get_linked() const { return linked; }
86         std::string get_info_log() const;
87         void bind() const;
88         int get_uniform_location(const std::string &) const;
89
90         static void unbind();
91 };
92
93 } // namespace GL
94 } // namespace Msp
95
96 #endif