Création d'un compte pour un collaborateur extérieur au laboratoire depuis l'intranet ICube : https://intranet.icube.unistra.fr/fr/labs/member/profile

shaderMutator.h 7.04 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

	/**
45
	 * enum used to choose which shader src type to modify
46
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
	  */
62
	 bool containsVariableDeclaration(shaderSrcType srcType, const std::string& variableName);
63
64
	 
	 /**
65
	  * sets or changes shading language version in the shader source
66
	  * - only if the current version is lower
67
68
	  * @param srcType shader source to use
	  * @param version version to set (110, 120, 150...)
69
	  */
70
	 void 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
76
	  */
77
	 void changeIntConstantValue(shaderSrcType srcType, const std::string& constantName, int newVal);
78

79
	 /**
80
81
	  * inserts code before main function in the shader source
	  * @param srcType shader source to use
82
83
	  * @param insertedCode source code to insert into shader
	  */
84
	 void insertCodeBeforeMainFunction(shaderSrcType srcType, const std::string& insertedCode);
85
86
	 
	 /**
87
88
	  * inserts code at the beginning of main function in the shader source
	  * @param srcType shader source to use
89
90
	  * @param insertedCode source code to insert into shader
	  */
91
	 void insertCodeAtMainFunctionBeginning(shaderSrcType srcType, const std::string& insertedCode);
92
93
	 
	 /**
94
	  * inserts code at the end of main function in the shader source
95
	  * @warning takes the number of opening and closing braces of main function into account
96
	  * @param srcType shader source to use
97
98
	  * @param insertedCode source code to insert into shader
	  */
99
	 void insertCodeAtMainFunctionEnd(shaderSrcType srcType, const std::string& insertedCode);
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
	 
	 /**
	  * returns the modified vertex shader source code
	  */
	 std::string getModifiedVertexShaderSrc() { return m_vShaderMutation; }
	 
	 /**
	  * returns the modified fragment shader source code
	  */
	 std::string getModifiedFragmentShaderSrc() { return m_fShaderMutation; }
	 
	 /**
	  * returns the modified geometry shader source code
	  */
	 std::string getModifiedGeometryShaderSrc() { return m_gShaderMutation; }
	
private:

	 /**
	  * processed shader name stored for log purpose
	  */
	 std::string m_shaderName;
	
	/**
	 * modified version of the original vertex shader source code
	 */
	std::string m_vShaderMutation;
	
	/**
	 * modified version of the original fragment shader source code
	 */
	std::string m_fShaderMutation;
	
	/**
	 * modified version of the original geometry shader source code
	 */
	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
	 */
143
	bool srcIsCommented(size_t pos, const std::string& src);
144
145
	
	/**
146
147
148
	 * checks if the given position is commented with a one-line comment
	 * @param pos position in the source (like in a string)
	 * @param src source to analyze
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
156
	 */
157
	bool srcContainsVariableDeclaration(const std::string& variableName, std::string& src);
158
	
159
	/**
160
161
	 * sets or changes shading language version if the current version is lower
	 * @param version version to set (110, 120, 150...)
162
163
	 * @param modifiedSrc shader source code to modify
	 */
164
165
166
	bool srcSetMinShadingLanguageVersion(int version, std::string& modifiedSrc);

	/**
167
168
169
	 * changes int constant value
	 * @param newVal new constant value
	 * @param constantName constant name as it is declared
170
171
	 * @param modifiedSrc shader source code to modify
	 */
172
	bool srcChangeIntConstantValue(int newVal, const std::string& constantName, std::string& modifiedSrc);
173

174
	/**
175
176
	 * inserts code before main function
	 * @param insertedCode source code to insert
177
178
	 * @param modifiedSrc shader source code to modify
	 */
179
	bool srcInsertCodeBeforeMainFunction(const std::string& insertedCode, std::string& modifiedSrc);
180
181
	
	/**
182
183
	 * inserts code at the beginning of main function
	 * @param insertedCode source code to insert
184
185
	 * @param modifiedSrc shader source code to modify
	 */
186
	bool srcInsertCodeAtMainFunctionBeginning(const std::string& insertedCode, std::string& modifiedSrc);
187
188

	/**
189
190
	 * inserts code at the end of main function
	 * @param insertedCode source code to insert
191
192
	 * @param modifiedSrc shader source code to modify
	 */
193
	bool srcInsertCodeAtMainFunctionEnd(const std::string& insertedCode, std::string& modifiedSrc);
194
195
196
197
198
199
200
201
	
};

} // namespace Utils

} // namespace CGoGN

#endif