shaderMutator.h 7.47 KB
Newer Older
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
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps  *
* version 0.1                                                                  *
* Copyright (C) 2009-2011, IGG Team, LSIIT, University of Strasbourg           *
*                                                                              *
* 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.           *
*                                                                              *
* Web site: http://cgogn.u-strasbg.fr/                                         *
* 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
	  * inserts code before main function in the shader source
	  * @param srcType shader source to use
83
	  * @param insertedCode source code to insert into shader
Maire Nicolas's avatar
Maire Nicolas committed
84
	  * @return true on success
85
	  */
Maire Nicolas's avatar
Maire Nicolas committed
86
	 bool insertCodeBeforeMainFunction(shaderSrcType srcType, const std::string& insertedCode);
87 88
	 
	 /**
89 90
	  * inserts code at the beginning of 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 insertCodeAtMainFunctionBeginning(shaderSrcType srcType, const std::string& insertedCode);
95 96
	 
	 /**
97
	  * inserts code at the end of main function in the shader source
98
	  * @warning takes the number of opening and closing braces of main function into account
99
	  * @param srcType shader source to use
100
	  * @param insertedCode source code to insert into shader
Maire Nicolas's avatar
Maire Nicolas committed
101
	  * @return true on success
102
	  */
Maire Nicolas's avatar
Maire Nicolas committed
103
	 bool insertCodeAtMainFunctionEnd(shaderSrcType srcType, const std::string& insertedCode);
104
	 
105
	 /// returns the modified vertex shader source code
106 107
	 std::string getModifiedVertexShaderSrc() { return m_vShaderMutation; }
	 
108
	 /// returns the modified fragment shader source code
109 110
	 std::string getModifiedFragmentShaderSrc() { return m_fShaderMutation; }
	 
111
	 /// returns the modified geometry shader source code
112 113 114 115
	 std::string getModifiedGeometryShaderSrc() { return m_gShaderMutation; }
	
private:

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

	/**
161 162 163
	 * changes int constant value
	 * @param newVal new constant value
	 * @param constantName constant name as it is declared
164
	 * @param modifiedSrc shader source code to modify
Maire Nicolas's avatar
Maire Nicolas committed
165
	 * @return true on success
166
	 */
167
	bool srcChangeIntConstantValue(int newVal, const std::string& constantName, std::string& modifiedSrc);
168

169
	/**
170 171
	 * inserts code before main function
	 * @param insertedCode source code to insert
172
	 * @param modifiedSrc shader source code to modify
Maire Nicolas's avatar
Maire Nicolas committed
173
	 * @return true on success
174
	 */
175
	bool srcInsertCodeBeforeMainFunction(const std::string& insertedCode, std::string& modifiedSrc);
176 177
	
	/**
178 179
	 * inserts code at the beginning of main function
	 * @param insertedCode source code to insert
180
	 * @param modifiedSrc shader source code to modify
Maire Nicolas's avatar
Maire Nicolas committed
181
	 * @return true on success
182
	 */
183
	bool srcInsertCodeAtMainFunctionBeginning(const std::string& insertedCode, std::string& modifiedSrc);
184 185

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

} // namespace Utils

} // namespace CGoGN

#endif