shaderMutator.h 8.06 KB
Newer Older
1 2 3
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
4
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg           *
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
*                                                                              *
* This library is free software; you can redistribute it and/or modify it      *
* under the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation; either version 2.1 of the License, or (at your     *
* option) any later version.                                                   *
*                                                                              *
* This library 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 Lesser General Public License  *
* for more details.                                                            *
*                                                                              *
* You should have received a copy of the GNU Lesser General Public License     *
* along with this library; if not, write to the Free Software Foundation,      *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.           *
*                                                                              *
20
* Web site: http://cgogn.unistra.fr/                                           *
21 22 23 24 25 26 27 28 29 30
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#ifndef _CGoGN_SHADERMUTATOR_H_
#define _CGoGN_SHADERMUTATOR_H_

#include "Utils/cgognStream.h"
#include <boost/regex.hpp>
#include <string>
31
#include <sstream>
32 33 34 35 36 37 38 39 40 41 42

namespace CGoGN
{

namespace Utils
{

class ShaderMutator
{
	
public:
43

44
	/// enum used to choose which shader src type to modify
45 46
	enum shaderSrcType { VERTEX_SHADER, FRAGMENT_SHADER, GEOMETRY_SHADER };

47 48
	/**
	 * constructor
49 50 51
	 * @param vertShaderSrc vertex shader source to store
	 * @param fragShaderSrc fragment shader source to store
	 * @param geomShaderSrc geometry shader source to store (optional)
52
	 */
53
	 ShaderMutator(const std::string& shaderName, const std::string& vertShaderSrc, const std::string& fragShaderSrc, const std::string& geomShaderSrc = "");
54 55
	 
	 /**
56 57 58
	  * checks if a variable is declared in the shader source
	  * @param srcType shader source to use
	  * @param variableName variable to search for
Maire Nicolas's avatar
Maire Nicolas committed
59
	  * @return true if the variable was declared
60
	  */
61
	 bool containsVariableDeclaration(shaderSrcType srcType, const std::string& variableName);
62 63
	 
	 /**
64
	  * sets or changes shading language version in the shader source
65
	  * - only if the current version is lower
66 67
	  * @param srcType shader source to use
	  * @param version version to set (110, 120, 150...)
Maire Nicolas's avatar
Maire Nicolas committed
68
	  * @return true if the version was set or changed
69
	  */
Maire Nicolas's avatar
Maire Nicolas committed
70
	 bool setMinShadingLanguageVersion(shaderSrcType srcType, int version);
71

72
	 /**
73 74 75
	  * changes int constant value in the shader source
	  * @param srcType shader source to use
	  * @param newVal new constant value
Maire Nicolas's avatar
Maire Nicolas committed
76
	  * @return true on success
77
	  */
Maire Nicolas's avatar
Maire Nicolas committed
78
	 bool changeIntConstantValue(shaderSrcType srcType, const std::string& constantName, int newVal);
79

80 81 82 83 84 85 86 87
	 /**
	  * changes float constant value in the shader source
	  * @param srcType shader source to use
	  * @param newVal new constant value
	  * @return true on success
	  */
	 bool changeFloatConstantValue(shaderSrcType srcType, const std::string& constantName, float newValue);

88
	 /**
89 90
	  * inserts code before main function in the shader source
	  * @param srcType shader source to use
91
	  * @param insertedCode source code to insert into shader
Maire Nicolas's avatar
Maire Nicolas committed
92
	  * @return true on success
93
	  */
Maire Nicolas's avatar
Maire Nicolas committed
94
	 bool insertCodeBeforeMainFunction(shaderSrcType srcType, const std::string& insertedCode);
95 96
	 
	 /**
97 98
	  * inserts code at the beginning of main function in the shader source
	  * @param srcType shader source to use
99
	  * @param insertedCode source code to insert into shader
Maire Nicolas's avatar
Maire Nicolas committed
100
	  * @return true on success
101
	  */
Maire Nicolas's avatar
Maire Nicolas committed
102
	 bool insertCodeAtMainFunctionBeginning(shaderSrcType srcType, const std::string& insertedCode);
103 104
	 
	 /**
105
	  * inserts code at the end of main function in the shader source
106
	  * @warning takes the number of opening and closing braces of main function into account
107
	  * @param srcType shader source to use
108
	  * @param insertedCode source code to insert into shader
Maire Nicolas's avatar
Maire Nicolas committed
109
	  * @return true on success
110
	  */
Maire Nicolas's avatar
Maire Nicolas committed
111
	 bool insertCodeAtMainFunctionEnd(shaderSrcType srcType, const std::string& insertedCode);
112
	 
113
	 /// returns the modified vertex shader source code
114 115
	 std::string getModifiedVertexShaderSrc() { return m_vShaderMutation; }
	 
116
	 /// returns the modified fragment shader source code
117 118
	 std::string getModifiedFragmentShaderSrc() { return m_fShaderMutation; }
	 
119
	 /// returns the modified geometry shader source code
120 121 122 123
	 std::string getModifiedGeometryShaderSrc() { return m_gShaderMutation; }
	
private:

124 125
	/// processed shader name stored for log purpose
	std::string m_shaderName;
126
	
127
	/// modified version of the original vertex shader source code
128 129
	std::string m_vShaderMutation;
	
130
	/// modified version of the original fragment shader source code
131 132
	std::string m_fShaderMutation;
	
133
	/// modified version of the original geometry shader source code
134 135 136
	std::string m_gShaderMutation;
	
	/**
137 138 139
	 * checks if the given position is commented
	 * @param pos position in the source (like in a string)
	 * @param src source to analyze
Maire Nicolas's avatar
Maire Nicolas committed
140
	 * @return true if the given position is commented
141
	 */
142
	bool srcIsCommented(size_t pos, const std::string& src);
143 144
	
	/**
Maire Nicolas's avatar
Maire Nicolas committed
145
	 * checks if the given position is one-line commented
146 147
	 * @param pos position in the source (like in a string)
	 * @param src source to analyze
Maire Nicolas's avatar
Maire Nicolas committed
148
	 * @return true if the given position is one-line commented
149
	 */
150
	bool srcIsOneLineCommented(size_t pos, const std::string& src);
151 152
	
	/**
153 154 155
	  * checks if a variable is declared
	  * @param variableName variable to search for
	  * @param src source to analyze
Maire Nicolas's avatar
Maire Nicolas committed
156
	  * @return true if the variable was declared
157
	 */
158
	bool srcContainsVariableDeclaration(const std::string& variableName, std::string& src);
159
	
160
	/**
161 162
	 * sets or changes shading language version if the current version is lower
	 * @param version version to set (110, 120, 150...)
163
	 * @param modifiedSrc shader source code to modify
Maire Nicolas's avatar
Maire Nicolas committed
164
	 * @return true if the version was set or changed
165
	 */
166 167 168
	bool srcSetMinShadingLanguageVersion(int version, std::string& modifiedSrc);

	/**
169 170 171
	 * changes int constant value
	 * @param newVal new constant value
	 * @param constantName constant name as it is declared
172
	 * @param modifiedSrc shader source code to modify
Maire Nicolas's avatar
Maire Nicolas committed
173
	 * @return true on success
174
	 */
175
	bool srcChangeIntConstantValue(int newVal, const std::string& constantName, std::string& modifiedSrc);
176

177 178 179 180 181 182 183 184 185
	/**
	 * changes float constant value
	 * @param newVal new constant value
	 * @param constantName constant name as it is declared
	 * @param modifiedSrc shader source code to modify
	 * @return true on success
	 */
	bool srcChangeFloatConstantValue(float newVal, const std::string& constantName, std::string& modifiedSrc);

186
	/**
187 188
	 * inserts code before main function
	 * @param insertedCode source code to insert
189
	 * @param modifiedSrc shader source code to modify
Maire Nicolas's avatar
Maire Nicolas committed
190
	 * @return true on success
191
	 */
192
	bool srcInsertCodeBeforeMainFunction(const std::string& insertedCode, std::string& modifiedSrc);
193 194
	
	/**
195 196
	 * inserts code at the beginning of main function
	 * @param insertedCode source code to insert
197
	 * @param modifiedSrc shader source code to modify
Maire Nicolas's avatar
Maire Nicolas committed
198
	 * @return true on success
199
	 */
200
	bool srcInsertCodeAtMainFunctionBeginning(const std::string& insertedCode, std::string& modifiedSrc);
201 202

	/**
203 204
	 * inserts code at the end of main function
	 * @param insertedCode source code to insert
205
	 * @param modifiedSrc shader source code to modify
Maire Nicolas's avatar
Maire Nicolas committed
206
	 * @return true on success
207
	 */
208
	bool srcInsertCodeAtMainFunctionEnd(const std::string& insertedCode, std::string& modifiedSrc);
209 210 211 212 213 214 215 216
	
};

} // namespace Utils

} // namespace CGoGN

#endif