/
GLSLShader.h
113 lines (94 loc) · 3.6 KB
/
GLSLShader.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright (C) 2005 Dave Griffiths
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef FLUXUS_GLSL_SHADER
#define FLUXUS_GLSL_SHADER
#include "OpenGL.h"
#include <string>
#include <vector>
#include "dada.h"
#include "Allocator.h"
using namespace std;
namespace Fluxus
{
//////////////////////////////////////////////////////
/// A pair of shaders, loaded and compiled -
/// needs to be made into a GLSLShader for use
class GLSLShaderPair
{
public:
/// If load is true, the constructor attempts to load the shader pair immediately
/// if it's false, the strings are treated as the shader source.
GLSLShaderPair(bool load, const string &vertex, const string &fragment);
~GLSLShaderPair();
unsigned int GetVertexShader() const { return m_VertexShader; }
unsigned int GetFragmentShader() const { return m_FragmentShader; }
private:
/// Returns a handle to a compiled and linked GLSL program
bool Load(const string &vertexfilename, const string &fragmentfilename);
bool Make(const string &vertexsource, const string &fragmentsource);
unsigned int LoadShader(string filename, unsigned int type);
unsigned int MakeShader(const string &filename, const string &source, unsigned int type);
unsigned int m_VertexShader;
unsigned int m_FragmentShader;
};
//////////////////////////////////////////////////////
/// A hardware shader for use on an object
class GLSLShader
{
public:
/// The constructor attempts to load the shader pair immediately
GLSLShader() : m_RefCount(1), m_IsValid(false) {}
GLSLShader(const GLSLShaderPair &pair);
~GLSLShader();
// Temp fix, maybe
void IncRef() { m_RefCount++; }
bool DecRef() { m_RefCount--; return (m_RefCount==0); }
/////////////////////////////////////////////
///@name Renderer interface
///@{
static void Init();
void Apply();
static void Unapply();
bool IsValid() { return m_IsValid; }
///@}
/////////////////////////////////////////////
///@name Uniform variables
///@{
void SetInt(const string &name, int s);
void SetFloat(const string &name, float s);
void SetVector(const string &name, dVector s, int size = 4);
void SetColour(const string &name, dColour s);
void SetIntArray(const string &name, const vector<int,FLX_ALLOC(int) > &s);
void SetFloatArray(const string &name, const vector<float,FLX_ALLOC(float) > &s);
void SetMatrix(const string &name, dMatrix &m);
void SetVectorArray(const string &name, const vector<dVector,FLX_ALLOC(dVector) > &s);
void SetColourArray(const string &name, const vector<dColour,FLX_ALLOC(dColour) > &s);
///@}
/////////////////////////////////////////////
///@name Attribute variables
///@{
void SetFloatAttrib(const string &name, const vector<float,FLX_ALLOC(float) > &s);
void SetVectorAttrib(const string &name, const vector<dVector,FLX_ALLOC(dVector) > &s);
void SetColourAttrib(const string &name, const vector<dColour,FLX_ALLOC(dColour) > &s);
///@}
static bool m_Enabled;
private:
unsigned int m_Program;
unsigned int m_RefCount;
bool m_IsValid;
};
}
#endif