1 /****************************************************************************
2 * MeshLab                                                           o o     *
3 * A versatile mesh processing toolbox                             o     o   *
4 *                                                                _   O  _   *
5 * Copyright(C) 2005-2008                                           \/)\/    *
6 * Visual Computing Lab                                            /\/|      *
7 * ISTI - Italian National Research Council                           |      *
8 *                                                                    \      *
9 * All rights reserved.                                                      *
10 *                                                                           *
11 * This program is free software; you can redistribute it and/or modify      *
12 * it under the terms of the GNU General Public License as published by      *
13 * the Free Software Foundation; either version 2 of the License, or         *
14 * (at your option) any later version.                                       *
15 *                                                                           *
16 * This program is distributed in the hope that it will be useful,           *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
19 * GNU General Public License (http://www.gnu.org/licenses/gpl.txt)          *
20 * for more details.                                                         *
21 *                                                                           *
22 ****************************************************************************/
23 #ifndef __RMPASS_H__
24 #define __RMPASS_H__
25 
26 #include <QList>
27 #include <QString>
28 #include <QStringList>
29 #include <QDebug>
30 #include "GlState.h"
31 #include "UniformVar.h"
32 
33 class RenderTarget
34 {
35 public:
36 	RenderTarget(QString _name = QString(), bool _renderToScreen = false,
37 	             bool _colorClear = false, bool _depthClear = false,
38 	             float _clearColorValue = 0, float _depthClearValue = 0)
39 	{
40 		name = _name;
41 		renderToScreen = _renderToScreen;
42 		colorClear = _colorClear;
43 		depthClear = _depthClear;
44 		clearColorValue = _clearColorValue;
45 		depthClearValue = _depthClearValue;
46 	}
47 
48 	QString name;
49 	bool renderToScreen;
50 	bool colorClear;
51 	bool depthClear;
52 	float clearColorValue;
53 	float depthClearValue;
54 };
55 
56 
57 class RmPass
58 {
59 public:
60 
61 	RmPass(QString _name = QString(), int _index = -1) :
name(_name)62 		name(_name), index(_index)
63 	{}
64 
~RmPass()65 	virtual ~RmPass( ) {}
66 	enum CodeType { FRAGMENT, VERTEX };
67 
68 	UniformVar searchFragmentUniformVariable(QString &name);
69 	UniformVar searchVertexUniformVariable(QString &name);
addOpenGLState(GlState & state)70 	void addOpenGLState(GlState &state) { states.append(state); }
hasIndex()71 	bool hasIndex() { return index != -1; }
getIndex()72 	int getIndex() { return index; }
73 
setModelReference(QString _modelRef)74 	void setModelReference(QString _modelRef) { modelRef = _modelRef; }
getModelReference()75 	QString& getModelReference() { return modelRef; }
setModelReferenceFN(QString modRef)76 	void setModelReferenceFN(QString modRef) { modelRefFile = modRef; }
getModelReferenceFN()77 	QString& getModelReferenceFN() { return modelRefFile; }
78 
setFragment(QString _fragment)79 	void setFragment(QString _fragment) { fragment = _fragment; }
getFragment()80 	QString& getFragment() { return fragment; }
81 
setVertex(QString _vertex)82 	void setVertex(QString _vertex) { vertex = _vertex; }
getVertex()83 	QString& getVertex() { return vertex; }
84 
getName()85 	QString& getName() { return name; }
setRenderTarget(RenderTarget rt)86 	void setRenderTarget(RenderTarget rt) { renderTarget = rt; }
getRenderTarget()87 	RenderTarget& getRenderTarget() { return renderTarget; }
hasRenderTarget()88 	bool hasRenderTarget() { return !renderTarget.name.isNull(); }
89 
addFragmentUniform(UniformVar & var)90 	void addFragmentUniform(UniformVar &var) { fragUniform.append(var); }
addVertexUniform(UniformVar & var)91 	void addVertexUniform(UniformVar &var) { vertUniform.append(var); }
92 
fragmentUniformVariableSize()93 	int fragmentUniformVariableSize() { return fragUniform.size(); }
vertexUniformVariableSize()94 	int vertexUniformVariableSize() { return vertUniform.size(); }
95 
getFragmentUniform(int idx)96 	UniformVar& getFragmentUniform(int idx)
97 	{
98 		return getUniform(idx, FRAGMENT);
99 	}
getVertexUniform(int idx)100 	UniformVar& getVertexUniform(int idx)
101 	{
102 		return getUniform(idx, VERTEX);
103 	}
getUniform(int idx,CodeType codetype)104 	UniformVar& getUniform(int idx, CodeType codetype)
105 	{
106 		return (codetype == FRAGMENT) ?
107 			fragUniform[idx] : vertUniform[idx];
108 	}
109 
openGLStatesSize()110 	int openGLStatesSize() { return states.size(); }
getOpenGLState(int idx)111 	GlState& getOpenGLState(int idx) { return states[idx]; }
112 	bool operator<(const RmPass &p) const { return index < p.index; }
113 
114 private:
115 	QString name;
116 	int index;
117 
118 	QString fragment;
119 	QString vertex;
120 
121 	QList<UniformVar> fragUniform;
122 	QList<UniformVar> vertUniform;
123 
124 	QString modelRef;
125 	QString modelRefFile;
126 	QList<GlState> states;
127 
128 	RenderTarget renderTarget;
129 
130 	// we look for a variable declared as uniform in a specific
131 	// source code (fragment or vertex's one) and check for its type
132 	UniformVar searchUniformVariable(QString &name, CodeType codetype);
133 };
134 #endif /* __RMPASS_H__ */
135