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
* Contact information: cgogn@unistra.fr                                        *
*                                                                              *
*******************************************************************************/

#ifndef _CGoGN_SHADERMUTATOR_H_
#define _CGoGN_SHADERMUTATOR_H_

28 29 30
#undef tolower
#undef toupper

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

namespace CGoGN
{

namespace Utils
{

class ShaderMutator
{
	
public:
45

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

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

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

82 83 84 85 86 87 88 89
	 /**
	  * 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);

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

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

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

179 180 181 182 183 184 185 186 187
	/**
	 * 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);

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

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

} // namespace Utils

} // namespace CGoGN

#endif