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