shaderMutator.h 7.14 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 46 47 48

	/**
	 * enums used to choose which shader src to modify
	 */
	enum shaderSrcType { VERTEX_SHADER, FRAGMENT_SHADER, GEOMETRY_SHADER };

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

72
	 /**
73 74 75
	  * change int constant value in the shader source
	  * @param srcType the shader source to use (vertex, fragment or geometry)
	  * @param newVal the new value
76
	  */
77 78
	 void changeIntConstantValue(shaderSrcType srcType, int newVal);

79
	 /**
80 81
	  * insert code before main function into shader source
	  * @param srcType the shader source to use (vertex, fragment or geometry)
82 83
	  * @param insertedCode source code to insert into shader
	  */
84
	 void insertCodeBeforeMainFunction(shaderSrcType srcType, const std::string& insertedCode);
85 86
	 
	 /**
87 88
	  * insert code at the beginning of main function into shader source
	  * @param srcType the shader source to use (vertex, fragment or geometry)
89 90
	  * @param insertedCode source code to insert into shader
	  */
91
	 void insertCodeAtMainFunctionBeginning(shaderSrcType srcType, const std::string& insertedCode);
92 93
	 
	 /**
94
	  * insert code at the end of main function into shader source
95
	  * @warning takes the number of opening and closing braces of main function into account
96
	  * @param srcType the shader source to use (vertex, fragment or geometry)
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
	 * check if the given position in the source is commented
140
	 * @param pos the position
141
	 * @param src the source to analyze
142
	 */
143
	bool srcIsCommented(size_t pos, const std::string& src);
144 145
	
	/**
146
	 * check if the given position in the source is commented with a one-line comment
147
	 * @param pos the position
148
	 * @param src the source to analyze
149
	 */
150
	bool srcIsOneLineCommented(size_t pos, const std::string& src);
151 152
	
	/**
153
	  * check if a variable is declared in a source code
154 155
	  * @param variable the variable to search for
	 */
156
	bool srcContainsVariableDeclaration(const std::string& variableName, std::string& src);
157
	
158 159 160 161 162
	/**
	 * set or change shading language version if the current version is lower
	 * @param version the version to set (110, 120, 150...)
	 * @param modifiedSrc shader source code to modify
	 */
163 164 165 166 167 168 169 170
	bool srcSetMinShadingLanguageVersion(int version, std::string& modifiedSrc);

	/**
	 * change int constant value
	 * @param newVal the new value
	 * @param modifiedSrc shader source code to modify
	 */
	bool srcChangeIntConstantValue(int newVal, std::string& modifiedSrc);
171

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

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

} // namespace Utils

} // namespace CGoGN

#endif