Open Inventor Release 2025.1.0
 
Loading...
Searching...
No Matches
SoShaderObject.h
1/*=======================================================================
2 *** THE CONTENT OF THIS WORK IS PROPRIETARY TO FEI S.A.S, (FEI S.A.S.), ***
3 *** AND IS DISTRIBUTED UNDER A LICENSE AGREEMENT. ***
4 *** ***
5 *** REPRODUCTION, DISCLOSURE, OR USE, IN WHOLE OR IN PART, OTHER THAN AS ***
6 *** SPECIFIED IN THE LICENSE ARE NOT TO BE UNDERTAKEN EXCEPT WITH PRIOR ***
7 *** WRITTEN AUTHORIZATION OF FEI S.A.S. ***
8 *** ***
9 *** RESTRICTED RIGHTS LEGEND ***
10 *** USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT OF THE CONTENT OF THIS ***
11 *** WORK OR RELATED DOCUMENTATION IS SUBJECT TO RESTRICTIONS AS SET FORTH IN ***
12 *** SUBPARAGRAPH (C)(1) OF THE COMMERCIAL COMPUTER SOFTWARE RESTRICTED RIGHT ***
13 *** CLAUSE AT FAR 52.227-19 OR SUBPARAGRAPH (C)(1)(II) OF THE RIGHTS IN ***
14 *** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 52.227-7013. ***
15 *** ***
16 *** COPYRIGHT (C) 1996-2024 BY FEI S.A.S, ***
17 *** BORDEAUX, FRANCE ***
18 *** ALL RIGHTS RESERVED ***
19**=======================================================================*/
20/*=======================================================================
21** Author : VSG (MMM YYYY)
22**=======================================================================*/
23
24 /* include files */
25#ifndef _SO_SHADER_OBJECT_H_
26#define _SO_SHADER_OBJECT_H_
27
28#include <Inventor/SbBasic.h>
29#include <Inventor/SbString.h>
30#include <Inventor/nodes/SoNode.h>
31#include <Inventor/fields/SoSFFilePathString.h>
32#include <Inventor/fields/SoSFEnum.h>
33#include <Inventor/fields/SoSFBool.h>
34#include <Inventor/fields/SoMFUniformShaderParameter.h>
35#include <Inventor/SbEnums.h>
36
37#include <Inventor/STL/cassert>
38#include <Inventor/STL/map>
39#include <Inventor/helpers/SbConstCharMap.h>
40
41class SoGLShaderContainer ;
42class SoGLShaderObject ;
43class SoFieldSensor ;
44class SoNodeSensor ;
45class SoFileSensor ;
46class SoShaderParser;
47
48#ifdef _MSC_VER
49#pragma warning( push )
50#pragma warning(disable:4251)
51#endif
52
204class SoShaderObject : public SoNode
205{
206
207 SO_NODE_ABSTRACT_HEADER(SoShaderObject);
208
209public:
210
213 {SoDEPRECATED
219SoDEPRECATED
225
230
235 };
236
241
252
268
274
291 template<typename UniformParamType, typename ParamValueType>
292 UniformParamType* addShaderParameter(const SbString& name, ParamValueType val);
293
296 {
298 VERTEX_SHADER = SbEnums::SHADER_TYPE_VERTEX,
300 GEOMETRY_SHADER = SbEnums::SHADER_TYPE_GEOMETRY,
302 FRAGMENT_SHADER = SbEnums::SHADER_TYPE_FRAGMENT,
304 TESSELLATION_CONTROL_SHADER = SbEnums::SHADER_TYPE_TESS_CTRL,
306 TESSELLATION_EVALUATION_SHADER = SbEnums::SHADER_TYPE_TESS_EVAL,
308 COMPUTE_SHADER = SbEnums::SHADER_TYPE_COMPUTE,
309 };
310
312 virtual ShaderType getShaderType() const = 0;
313
328 template<typename UniformParamType, typename ParamValueType>
329 void setShaderParameter(const SbString& name, ParamValueType val);
330
331#ifndef HIDDEN_FROM_DOC
332 //Generate all setFragmentParameter* methods
333#define MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(ParamType)\
334 \
335 template<typename ParamValueType>\
336 void\
337 setShaderParameter ## ParamType(const SbString& name, ParamValueType val)\
338 {\
339 setShaderParameter<SoShaderParameter ## ParamType>(name, val);\
340 }
341 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(1i)
342 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(2i)
343 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(3i)
344 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(4i)
345 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(1f)
346 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(2f)
347 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(3f)
348 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(4f)
349 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array1f)
350 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array2f)
351 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array3f)
352 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array4f)
353 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array1i)
354 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array2i)
355 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array3i)
356 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array4i)
357 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Matrix)
358 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Matrix3)
359 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(MatrixArray)
360#undef MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER
361
362//Generate all addShaderParameter* methods
363#define MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(ParamType)\
364 \
365 template<typename ParamValueType>\
366 SoShaderParameter ## ParamType *\
367 addShaderParameter ## ParamType(const SbString& name, ParamValueType val)\
368 {\
369 return addShaderParameter<SoShaderParameter ## ParamType>(name, val);\
370 }
371 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(1i)
372 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(2i)
373 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(3i)
374 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(4i)
375 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(1f)
376 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(2f)
377 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(3f)
378 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(4f)
379 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array1f)
380 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array2f)
381 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array3f)
382 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array4f)
383 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array1i)
384 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array2i)
385 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array3i)
386 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array4i)
387 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Matrix)
388 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Matrix3)
389 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(MatrixArray)
390#undef MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER
391#endif //HIDDEN_FROM_DOC
392
393 /*----------------------------------------------------------------------------*/
394
395private:
396
398 void setShaderObjectInfos(SoState* state, const SbString& shaderVersion, const SbString& shaderProfile);
399
401 SourceType getSourceType();
402
403 static void initClass();
404 static void exitClass() ;
405
410 SbBool isInternal() const;
411
412 // Returns TRUE if at least one parameter is of SoShaderStateMatrixParameter type
413 SbBool containStateMatrixParameters() const
414 { return (m_stateMatrixParameters.getLength() != 0) ; }
415
416 const SbString& getSourceProgram() const
417 { return m_sourceProgram;}
418
422 inline bool isFileFound() const;
423
425 inline bool needUpdate() const { return m_needUpdate; }
426
428 void invalidate();
429
431 void setDefine(const char* name, const char* value);
432 void setDefine(const char* name, const SbString& value)
433 { setDefine(name,value.toLatin1()); }
434
436 void removeDefine(const char* name);
437
439 void checkValidity();
440
442 inline void setVersion(const SbString& version) { m_version = version; }
443
445 const SbString& getVersion();
446
448 const SbString& getProfile();
449
451 inline void setProfile(const SbString& profile) { m_profile = profile; }
452
454 static bool isShaderObjectAvailable(SoState* state);
455
457 static bool isGLSLLanguageAvailable(SoState* state);
458
460 void invalidateSource();
461
463 void buildSourceToLoad(SbString &builtSource);
464
466 SbString getFileAbsolutePath(const SbString& filename);
467
469 virtual void notify(SoNotList *list);
470
472 void getHeaderFilenames( std::vector<SbString>& filenames );
473
475 void setIsFixedPipeline(bool isFixedPipelineShader)
476 {
477 m_isFixedPipelineShader = isFixedPipelineShader;
478 }
479
481 bool isFixedPipeline() const
482 {
483 return m_isFixedPipelineShader;
484 }
485
486private:
487
488 friend class SoShaderProgram;
490 typedef SbConstCharMap<SbString> DefineMap;
491 typedef DefineMap::iterator DefineMapIt;
492
494 typedef std::vector<SbString> SbStringVector;
495
497 void setGlobalDefine(const DefineMap& map);
498
500 void setDefine(DefineMap::value_type& p);
501
503 bool hasDefine(const char* name) const;
504
506 typedef std::set<SbString> HeaderSet;
507 typedef HeaderSet::iterator HeaderSetIt;
508
510 void setGlobalHeader(const HeaderSet& map);
511
512 // Extract the source from a given file if sourceType equals FILENAME.
513 void readSource();
514
518 SoShaderObject();
519
520 // Destructor
521 virtual ~SoShaderObject();
522
523private:
524 SoShaderParser* m_parser;
525 SbString m_sourceProgram;
526
528 SbString m_version;
529 SbString m_profile;
531 typedef std::map<std::string, std::string> ExtensionMap;
532 ExtensionMap m_extensionList;
533
534 typedef std::map<SbString, SbString> StrStrMap;
535
543 void extractInfosFromSource(SbString& version, SbString& source,SbString& profile, ExtensionMap& extensionList);
544
546 bool isEmptyLine(const std::string& line) const;
547
549 static SbString definesExtension(const SbString& source, const ExtensionMap::value_type& p);
550
552 static SbString definesAcc(const SbString& source, const DefineMap::value_type& p);
553
556 void getSourceFilename(std::vector<SbString>& filenames) const;
557
559 DefineMap m_defineMap;
560
562 DefineMap m_defineGlobalMap;
563
565 HeaderSet m_headerGlobalSet;
566
568 SbStringVector m_includeSourceVector;
569
571 SbStringVector m_includeFilenameVector;
572
574 SbString m_directoryFound;
575
576 // Update the list of state matrix parameters
577 void updateStateMatrixList() ;
578
579 // Store the list of state matrix parameters
580 SoNodeList m_stateMatrixParameters ;
581
582 // True if the shader can't be read
583 bool m_fileFound;
584
586 bool m_needUpdate;
587
589 bool m_needRead;
590
591 bool m_isFixedPipelineShader;
592
594 static StrStrMap s_shadersPaths;
595 static SbThreadRWMutex s_shadersPathsMutex;
596 static bool s_debugCache;
597};
598/*----------------------------------------------------------------------------*/
599
600/*******************************************************************************/
601template<typename UniformParamType, typename ParamValueType>
602UniformParamType*
603SoShaderObject::addShaderParameter(const SbString& name, ParamValueType val)
604{
605 UniformParamType *param = dynamic_cast<UniformParamType *>(parameter.findUniformParameterByName(name));
606 if (param)
607 {
608 // This parameter already exist => prefer to replace it
609 param->value.setValue(val);
610 }
611 else
612 {
613 param = new UniformParamType;
614 param->name = name;
615 param->value.setValue(val);
616 parameter.addShaderParameter(param);
617 }
618
619 return param;
620}
621
622/*****************************************************************************/
623template<typename UniformParamType, typename ParamValueType>
624void
625SoShaderObject::setShaderParameter(const SbString& name, ParamValueType val)
626{
627 SoUniformShaderParameter* param = parameter.findUniformParameterByName(name);
628 assert(param);
629 assert(param->isOfType(UniformParamType::getClassTypeId()) == TRUE);
630 UniformParamType* i = static_cast<UniformParamType*>(param);
631 i->value = val;
632}
633
634/*****************************************************************************/
635bool
636SoShaderObject::isFileFound() const
637{
638 return m_fileFound;
639}
640
641#ifdef _MSC_VER
642#pragma warning( pop )
643#endif
644
645#endif /*_SO_SHADER_OBJECT_H_*/
646
647
Class for smart character strings.
Definition SbString.h:202
<a href="IconLegend.html"><img src="extTGS.gif" alt="VSG extension" border="0"></a> Portable readers...
Sensor class that can be attached to Open Inventor fields.
Sensor that triggers a callback each time a file is changed.
<a href="IconLegend.html"><img src="extTGS.gif" alt="VSG extension" border="0"></a> Multiple-value f...
Maintains a list of pointers to nodes.
Definition SoNodeList.h:74
Sensor class that can be attached to Open Inventor nodes.
Field containing a single Boolean value.
Definition SoSFBool.h:79
Field containing an enumerated value.
Definition SoSFEnum.h:89
<a href="IconLegend.html"><img src="extTGS.gif" alt="VSG extension" border="0"></a> Field containing...
void setShaderParameter(const SbString &name, ParamValueType val)
UniformParamType is the type of parameter to set.
SoSFBool isActive
Specifies if the shader object is active or not.
SoSFFilePathString sourceProgram
Contains the shader object's source program, specified by a filename (sourceType set to FILENAME) or ...
UniformParamType * addShaderParameter(const SbString &name, ParamValueType val)
Convenience method to create an SoShaderUniformParameter with the specified name and value and add it...
virtual ShaderType getShaderType() const =0
Must be redefined by derived class.
friend class SoShaderProgram
SoMFUniformShaderParameter parameter
Contains the shader's uniform parameters.
ShaderType
Type of the shader.
@ TESSELLATION_EVALUATION_SHADER
The shader is a tessellation evaluation shader.
@ VERTEX_SHADER
The shader is a vertex shader.
@ COMPUTE_SHADER
The shader is a compute shader.
@ FRAGMENT_SHADER
The shader is a fragment shader.
@ GEOMETRY_SHADER
The shader is a geometry shader.
@ TESSELLATION_CONTROL_SHADER
The shader is a tessellation control shader.
SoSFEnum sourceType
Specifies the shader object's source type.
SourceType
Shader Object source type possible values.
@ CG_PROGRAM
The source is a CG program.
@ FILENAME
Only the name of the file containing the source is given (default).
@ GLSL_PROGRAM
The source is an OpenGL Shading Language program.
@ ARB_PROGRAM
The source is an ARB vertex or fragment program.
Traversal state.
Definition SoState.h:74
SbBool isOfType(const SoType &type) const
Returns TRUE if this object is of the type specified in type or is derived from that type.
<a href="IconLegend.html"><img src="extTGS.gif" alt="VSG extension" border="0"></a> Abstract base cl...
int SbBool
Boolean type.
Definition SbBase.h:87