libmoldeo (Moldeo 1.0 Core)  1.0
libmoldeo es el conjunto de objetos y funciones, que permiten ejecutar las operaciones básicas de la plataforma Moldeo, y que compone su núcleo.
moShaderManager.cpp
Ir a la documentación de este archivo.
1 /*******************************************************************************
2 
3  moShaderManager.cpp
4 
5  ****************************************************************************
6  * *
7  * This source is free software; you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 2 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * This code is distributed in the hope that it will be useful, but *
13  * WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
15  * General Public License for more details. *
16  * *
17  * A copy of the GNU General Public License is available on the World *
18  * Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
19  * obtain it by writing to the Free Software Foundation, *
20  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21  * *
22  ****************************************************************************
23 
24  Copyright(C) 2006 Fabricio Costa
25 
26  Authors:
27  Fabricio Costa
28 
29 
30 *******************************************************************************/
31 
32 #include <moShaderManager.h>
33 #include <moTextureFilterIndex.h>
34 #include <moDataManager.h>
35 
36 
37 
38 
39 
40 
41 
42 
102 {
103  if (m_pResourceManager){
106  } else return false;
107 
108  if (!m_glmanager || !m_fbmanager) return false;
109 
110  if (m_pTextureFilterIndex==NULL)
112 
113  m_shaders_array.Init(0, NULL);
114 
117 
118  if (m_Config.IsConfigLoaded()) {
120  } else {
122  }
123 #ifndef OPENGLESV2
124  if ( m_glmanager->GetGLMajorVersion() >=2 ) {
125 #endif
126  if (!m_RenderShader.Initialized()) {
127  MODebug2->Message("moShaderManager::Init > Creating basic Render Shader...");
130  moText(
131  "attribute vec4 position;\n"
132  "attribute vec3 colors;\n"
133  "attribute vec2 t_coordedge;\n"
134  "attribute vec2 t_coord;\n"
135  "attribute vec3 normal;\n"
136  "uniform mat4 projmatrix;\n"
137  "varying vec3 colorVarying;\n"
138  "varying vec3 v_normal;\n"
139  "varying vec2 v_texcoord;\n"
140  "varying vec2 v_texcoordedge;\n"
141  "\n"
142  "void main() {\n"
143  " colorVarying = colors;\n"
144  " v_normal = normal;\n"
145  " v_texcoord = t_coord;\n"
146  " v_texcoordedge = t_coordedge;\n"
147  " gl_Position = projmatrix*position;\n"
148  "}\n"
149  ),
150  moText(
151  #ifdef OPENGLESV2
152  "precision mediump float;"
153  #endif
154  "varying vec3 colorVarying;\n"
155  "uniform sampler2D t_image;\n"
156  "varying vec3 v_normal;\n"
157  "varying vec2 v_texcoord;\n"
158  "varying vec2 v_texcoordedge;\n"
159  "uniform float wseg;\n"
160  "uniform float hseg;\n"
161  "uniform float wireframe_width;"
162  "uniform vec3 a_light;\n"
163  "uniform vec3 color;\n"
164  "uniform float opacity;\n"
165  "\n"
166  "void main() {\n"
167  " vec4 texcolor = texture2D( t_image, v_texcoord );\n"
168  //" vec4 texcolor = vec4( abs(v_normal.x), abs(v_normal.y), abs(v_normal.z), 1.0);\n"///NORMALES COLORIDAS
169  //" vec4 texcolor = vec4( 1.0, 1.0, 1.0, 1.0);\n"
170  " vec2 vector_to_borderC = vec2( 1.0, 1.0 ) - v_texcoord;\n"
171  " vec2 vector_to_borderB = vec2( 1.0, 0.0 ) - v_texcoord;\n"
172  " vec2 vector_to_borderA = vec2( 0.0, 0.0 ) - v_texcoord;\n"
173  " vec2 vector_to_borderD = vec2( 0.0, 1.0 ) - v_texcoord;\n"
174  " float distance_to_borderX = v_texcoord.x;\n"
175  " float intensity = 0.6+0.4*abs(max( 0.0, dot( v_normal, -1.0*a_light )) );\n"
176  //" float intensity = abs(a_light.y);\n"
177  " float dX = floor( v_texcoord.x * wseg );\n"
178  " float dY = floor( v_texcoord.y * hseg );\n"
179  " float distance_to_borderXd = abs( v_texcoord.x - dX / wseg );\n"
180  " float distance_to_borderY = v_texcoord.y;\n"
181  " float distance_to_borderYd = abs( v_texcoord.y - dY / hseg );\n"
182  " float distance_to_borderA = length(vector_to_borderA);\n"
183  " float distance_to_borderB = length(vector_to_borderB);\n"
184  " float distance_to_borderC = length(vector_to_borderC);\n"
185  " float distance_to_borderD = length(vector_to_borderD);\n"
186  " vec4 wirecolor = vec4( 0.0, 1.0, 0.0, 1.0);\n"
187  " vec4 wirecolorA = vec4( 1.0, 0.0, 0.0, 1.0);\n"
188  " vec4 wirecolorB = vec4( 0.0, 1.0, 0.0, 1.0);\n"
189  " vec4 wirecolorC = vec4( 0.0, 0.0, 1.0, 1.0);\n"
190  " vec4 wirecolorD = vec4( 1.0, 1.0, 1.0, 1.0);\n"
191  " if (distance_to_borderA<(wireframe_width*10.0)) texcolor = wirecolorA;\n"
192  " if (distance_to_borderB<(wireframe_width*10.0)) texcolor = wirecolorB;\n"
193  " if (distance_to_borderC<(wireframe_width*10.0)) texcolor = wirecolorC;\n"
194  " if (distance_to_borderD<(wireframe_width*10.0)) texcolor = wirecolorD;\n"
195  " if (distance_to_borderXd<wireframe_width) texcolor = wirecolor;\n"
196  " if (distance_to_borderYd<wireframe_width) texcolor = wirecolor;\n"
197  " if (distance_to_borderXd>(-wireframe_width+1.0/wseg)) texcolor = wirecolor;\n"
198  " if (distance_to_borderYd>(-wireframe_width+1.0/hseg)) texcolor = wirecolor;\n"
199  //" vec4 mulcolor = vec4( colorVarying, 1.0 );\n"
200  " vec4 mulcolor = intensity*vec4( 1.0*color.r, 1.0*color.g, 1.0*color.b, 1.0*opacity );\n"
201  " gl_FragColor = vec4( mulcolor.x*texcolor.x, mulcolor.y*texcolor.y, mulcolor.z*texcolor.z, mulcolor.w*texcolor.w );\n"
202  "}\n"
203  )
204  );
205 
208 
214 
223 
225 
226  "moShaderManager::Init > m_RenderShader Attrib IDs,"
227  " position:"+IntToStr(m_RenderShaderPositionIndex)+""
228  " normal:"+IntToStr(m_RenderShaderNormalIndex)+""
229  " color:"+IntToStr(m_RenderShaderColorIndex)+""
230  " opacity:"+IntToStr(m_RenderShaderOpacityIndex)+""
231  " t_coord:"+IntToStr(m_RenderShaderTexCoordIndex)+""
233 
234  ));
235 
236  MODebug2->Message( moText("moShaderManager::Init > m_RenderShader Uniform IDs,")
238  +moText(" wireframe_width:")+IntToStr(m_RenderShaderWireframeWidthIndex)
242  +moText(" t_image:")+IntToStr(m_RenderShaderTextureIndex) );
243  }
244 #ifndef OPENGLESV2
245  }
246 #endif
247 
248  return (m_glmanager && m_fbmanager);
249 }
250 
252 {
255 
256  SetName("shadermanager");
257  SetLabelName("shadermanager");
258 
259  m_glmanager = NULL;
260  m_fbmanager = NULL;
261  m_pTextureFilterIndex = NULL;
262 }
263 
264 
265 
266 
268 {
269  if (m_pTextureFilterIndex) {
270  delete m_pTextureFilterIndex;
271  m_pTextureFilterIndex = NULL;
272  }
273 
274  m_shaders_array.Finish();
275 
276  m_glmanager = NULL;
277  m_fbmanager = NULL;
278 
279  return true;
280 }
281 
283 {
284  moShader* pshader;
285  for (MOuint i = 0; i < m_shaders_array.Count(); i++)
286  {
287  pshader = m_shaders_array[i];
288  if ((pshader != NULL) && (!stricmp(pshader->GetName(), p_name))) return i;
289  }
290  if (p_create_shader) return AddShader(p_name);
291  else return -1;
292 }
293 
295 {
296  moShader* pshader;
297  moShaderGLSL* pshader_glsl;
298 
299  if (p_type == MO_SHADER_GLSL)
300  {
301  pshader_glsl = new moShaderGLSL();
302  pshader_glsl->SetName(p_name);
303  pshader_glsl->Init();
304 
305  pshader = (moShader*)pshader_glsl;
306  m_shaders_array.Add(pshader);
307  return m_shaders_array.Count() - 1;
308  }
309  else if (p_type == MO_SHADER_CG)
310  {
311 #ifdef SHADER_CG
312  moShaderCG* pshader_cg;
313  pshader_cg = new moShaderCG();
314  pshader_cg->Init();
315  pshader_cg->SetName(p_name);
316  pshader = (moShader*)pshader_cg;
317  m_shaders_array.Add(pshader);
318  return m_shaders_array.Count() - 1;
319 #endif
320  return -1;
321  }
322 
323  return -1;
324 }
325 
327 {
328 
329  moConfig config;
330 
331  moText complete_fn = m_pResourceManager->GetDataMan()->GetDataPath() + moSlash;
332  complete_fn += p_filename;
333 
334 
335  if (config.LoadConfig(complete_fn) != MO_CONFIG_OK) {
336  moDebugManager::Error( moText("moShaderManager::AddShader >> Could not load shader config :") + complete_fn );
337  return -1;
338  } else {
339  moDebugManager::Message( moText("moShaderManager::AddShader >> Loaded shader config: ") + complete_fn );
340  }
341 
342  moFile cfgFile( complete_fn );
343 
344  MOint type_idx = config.GetParamIndex("type");
345  if (type_idx == MO_PARAM_NOT_FOUND) {
346  moDebugManager::Error( moText("moShaderManager::AddShader >> In shader config :")
347  + complete_fn
348  + moText(" type parameter not founded.")
349  );
350  return -1;
351  }
352 
353  MOint vertex_idx = config.GetParamIndex("vertex");
354  MOint fragment_idx = config.GetParamIndex("fragment");
355 
356  if ((vertex_idx == MO_PARAM_NOT_FOUND) && (fragment_idx == MO_PARAM_NOT_FOUND)) {
357  if ((fragment_idx == MO_PARAM_NOT_FOUND))
358  moDebugManager::Error( moText("moShaderManager::AddShader >> In shader config :")
359  + complete_fn
360  + moText(" fragment(pixel) shader parameter not founded.")
361  );
362  if ((vertex_idx == MO_PARAM_NOT_FOUND))
363  moDebugManager::Error( moText("moShaderManager::AddShader >> In shader config :")
364  + complete_fn
365  + moText(" vertex shader parameter not founded.")
366  );
367  return -1;
368  }
369 
370  moFile vertexFile;
371  moFile fragmentFile;
372 
373  moText vertex_fn;
374  moText fragment_fn;
375 
376  if (vertex_idx == MO_PARAM_NOT_FOUND) vertex_fn = moText("");
377  else
378  {
379  vertex_fn = cfgFile.GetPath() + moSlash;
380  vertex_fn = vertex_fn + config.GetParam(vertex_idx).GetValue().GetSubValue().Text();
381  vertexFile.SetCompletePath( vertex_fn );
382  if (!vertexFile.Exists()) {
383  vertex_fn = m_pResourceManager->GetDataMan()->GetDataPath() + moSlash;
384  vertex_fn = vertex_fn + config.GetParam(vertex_idx).GetValue().GetSubValue().Text();
385  }
386 
387  }
388 
389  if (fragment_idx == MO_PARAM_NOT_FOUND) fragment_fn = moText("");
390  else
391  {
392  fragment_fn = cfgFile.GetPath() + moSlash;
393  fragment_fn = fragment_fn + config.GetParam(fragment_idx).GetValue().GetSubValue().Text();
394  fragmentFile.SetCompletePath(fragment_fn);
395  if (!fragmentFile.Exists()) {
396  fragment_fn = m_pResourceManager->GetDataMan()->GetDataPath() + moSlash;
397  fragment_fn = fragment_fn + config.Text(fragment_idx);
398  }
399  }
400 
401  MOint grid_idx = config.GetParamIndex("grid");
402  moTexturedGrid tex_grid;
403  if (grid_idx == MO_PARAM_NOT_FOUND) tex_grid.Set1QuadGrid();
404  else tex_grid.Init(&config, grid_idx);
405 
406  int result = AddShader(config.GetParam(type_idx).GetValue().GetSubValue().Int(),
407  p_filename,
408  vertex_fn, fragment_fn, tex_grid);
409 
410  if ( result > -1 ) {
411  moShader* pshader = GetShader(result);
412  if (pshader) {
413  MODebug2->Message("moShaderManager::AddShader >> Added shader, loading config: " + complete_fn );
414  pshader->m_Config.LoadConfig( complete_fn );
415  }
416  }
417 
418  return result;
419 }
420 
421 MOint moShaderManager::AddShader(MOuint p_type, moText p_name, moText p_vert_fn, moText p_frag_fn, moTexturedGrid p_tex_grid)
422 {
423  MOint idx = AddShader(p_type, p_name);
424  if (-1 < idx)
425  {
426  if (p_vert_fn == moText("")) GetShader(idx)->LoadFragShader(p_frag_fn);
427  else if (p_frag_fn == moText("")) GetShader(idx)->LoadVertShader(p_vert_fn);
428  else GetShader(idx)->LoadShader(p_vert_fn, p_frag_fn);
429  GetShader(idx)->SetGrid(p_tex_grid);
430  return idx;
431  }
432  else return -1;
433 }
434 
436 {
437  if (p_idx < (MOint)m_shaders_array.Count())
438  {
439  m_shaders_array.Remove(p_idx);
440  return true;
441  }
442  else return false;
443 }
444 
int GetGLMajorVersion()
Definition: moGLManager.h:383
MOboolean Initialized()
Pregunta si está inicializado.
Definition: moAbstract.cpp:153
static void Message(moText p_text)
Anuncia un mensaje al usuario además de guardarlo en el log de texto.
MOuint m_RenderShaderTexHSegmentsIndex
moShaderGLSL m_RenderShader
moConfig m_Config
Definition: moShader.h:321
void SetName(const moText &p_name)
moValueBase & GetSubValue(MOint p_indexsubvalue=0)
Definition: moValue.h:539
void SetGrid(moTexturedGrid p_grid)
Definition: moShader.h:309
MOuint m_RenderShaderOpacityIndex
moRenderManager * GetRenderMan()
#define MOboolean
Definition: moTypes.h:385
static void Error(moText p_text)
Anuncia un error.
int GetParamIndex(moText p_paramname)
Devuelve el �ndice correspondiente al par�metro por nombre.
Definition: moConfig.cpp:1008
MOint Int() const
Definition: moValue.cpp:773
moGLManager * m_glmanager
void SetResourceType(moResourceType p_restype)
MOuint m_RenderShaderPositionIndex
virtual MOboolean Init(MOint p_size_x, MOint p_size_y, MOint p_num_layers, const MOfloat p_grid_dx[], const MOfloat p_grid_dy[])
Definition: moShader.cpp:58
virtual MOboolean Init()
MOuint m_RenderShaderTextureIndex
MOuint m_RenderShaderNormalIndex
virtual MOboolean Finish()
void PrintVertShaderLog()
MOuint m_RenderShaderTexCoordEdgeIndex
GLint GetUniformID(const moText &uName)
moGLManager * GetGLMan()
void SetCompletePath(moText p_completepath)
Definition: moFile.cpp:482
MOboolean Exists()
Definition: moFile.cpp:436
MOuint m_RenderShaderColorIndex
virtual MOboolean Init()
moTextureFilterIndex * m_pTextureFilterIndex
clase de para manejar textos
Definition: moText.h:75
virtual void LoadShader(const moText &vert_filename, const moText &frag_filename)=0
moResourceManager * m_pResourceManager
Puntero al administrador de recursos.
Dispositivo de entrada/salida, típicamente, interfaces humanas de IO y datos ( teclado, mouse, tableta, tcp, udp, serial )
Definition: moTypes.h:532
MOboolean DeleteShader(MOint p_idx)
MOuint m_RenderShaderTexWSegmentsIndex
virtual MOboolean Init(moParam *p_param, moGLManager *p_glman, moFBManager *p_fbman, moShaderManager *p_shaman, moTextureManager *p_texman, moRenderManager *p_renderman)
moText0 moText
Definition: moText.h:291
moConfig m_Config
Configuración de parámetros del objeto.
int LoadConfig(moText p_filename)
Lee la configuracion de un archivo.
Definition: moConfig.cpp:402
moText GetPath()
Retreive full file name: return "myFileName.txt", extension is included.
Definition: moFile.cpp:533
#define MOint
Definition: moTypes.h:388
MOuint m_RenderShaderLightIndex
virtual void LoadVertShader(const moText &vert_filename)=0
#define MO_PARAM_NOT_FOUND
Definition: moConfig.h:41
void Set1QuadGrid()
Definition: moShader.cpp:119
MOuint m_RenderShaderProjectionMatrixIndex
MOuint m_RenderShaderColorsIndex
moFBManager * GetFBMan()
moShader * GetShader(MOuint p_idx)
void SetLabelName(const moText &p_labelname)
MOboolean IsConfigLoaded()
Indica si ha sido cargado con �xito el archivo de configuraci�n.
Definition: moConfig.cpp:279
virtual void CreateShader(const moText &vert_source, const moText &frag_source)
static moDebug * MODebug2
Clase de impresión de errores para depuración.
Definition: moAbstract.h:225
moDataManager * GetDataMan()
moText Text()
Definition: moValue.cpp:539
virtual MOboolean Init()
moValue & GetValue(MOint i=-1)
Definition: moParam.cpp:1204
moParam & GetParam(MOint p_paramindex=-1)
Devuelve el par�metro por �ndice.
Definition: moConfig.cpp:984
MOuint m_RenderShaderTexCoordIndex
moText GetDataPath()
#define MOuint
Definition: moTypes.h:387
LIBMOLDEO_API moText0 IntToStr(int a)
Definition: moText.cpp:1070
MOint GetShaderIndex(moText p_name, MOboolean p_create_shader)
moText GetName()
Definition: moShader.h:293
MOint AddShader(MOuint p_type, moText p_name)
void PrintFragShaderLog()
moFBManager * m_fbmanager
void SetName(const moText &p_name)
Definition: moShader.h:298
virtual void LoadFragShader(const moText &frag_filename)=0
MOuint m_RenderShaderWireframeWidthIndex
void Message(moText p_text)
Anuncia un mensaje al usuario además de guardarlo en el log de texto.
Definition: moAbstract.cpp:114
#define MO_CONFIG_OK
Definition: moConfig.h:43
void SetType(moMoldeoObjectType p_type)
GLint GetAttribID(const moText &aName)
moShaderArray m_shaders_array
moTextureManager * GetTextureMan()
moText Text(moParamReference p_paramreference)
Acceso r�pido a un valor de texto.
Definition: moConfig.cpp:1070
almacena la configuraci�n de los par�metros de un objeto en un archivo XML
Definition: moConfig.h:193