Open Inventor Release 2026.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-2025 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,
310 RAY_GEN_SHADER = SbEnums::SHADER_TYPE_RAY_GEN,
312 RAY_MISS_SHADER = SbEnums::SHADER_TYPE_RAY_MISS,
314 ANY_HIT_SHADER = SbEnums::SHADER_TYPE_ANY_HIT,
316 CLOSEST_HIT_SHADER = SbEnums::SHADER_TYPE_CLOSEST_HIT,
318 INTERSECTION_SHADER = SbEnums::SHADER_TYPE_INTERSECTION,
319 };
320
322 virtual ShaderType getShaderType() const = 0;
323
338 template<typename UniformParamType, typename ParamValueType>
339 void setShaderParameter(const SbString& name, ParamValueType val);
340
341#ifndef HIDDEN_FROM_DOC
342 //Generate all setFragmentParameter* methods
343#define MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(ParamType)\
344 \
345 template<typename ParamValueType>\
346 void\
347 setShaderParameter ## ParamType(const SbString& name, ParamValueType val)\
348 {\
349 setShaderParameter<SoShaderParameter ## ParamType>(name, val);\
350 }
351 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(1i)
352 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(2i)
353 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(3i)
354 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(4i)
355 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(1f)
356 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(2f)
357 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(3f)
358 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(4f)
359 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array1f)
360 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array2f)
361 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array3f)
362 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array4f)
363 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array1i)
364 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array2i)
365 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array3i)
366 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array4i)
367 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Matrix)
368 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Matrix3)
369 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(MatrixArray)
370#undef MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER
371
372//Generate all addShaderParameter* methods
373#define MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(ParamType)\
374 \
375 template<typename ParamValueType>\
376 SoShaderParameter ## ParamType *\
377 addShaderParameter ## ParamType(const SbString& name, ParamValueType val)\
378 {\
379 return addShaderParameter<SoShaderParameter ## ParamType>(name, val);\
380 }
381 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(1i)
382 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(2i)
383 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(3i)
384 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(4i)
385 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(1f)
386 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(2f)
387 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(3f)
388 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(4f)
389 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array1f)
390 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array2f)
391 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array3f)
392 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array4f)
393 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array1i)
394 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array2i)
395 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array3i)
396 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array4i)
397 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Matrix)
398 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Matrix3)
399 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(MatrixArray)
400#undef MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER
401#endif //HIDDEN_FROM_DOC
402
403 /*----------------------------------------------------------------------------*/
404
405private:
406
408 void setShaderObjectInfos(SoState* state, const SbString& shaderVersion, const SbString& shaderProfile);
409
411 SourceType getSourceType();
412
413 static void initClass();
414 static void exitClass() ;
415
420 SbBool isInternal() const;
421
422 // Returns TRUE if at least one parameter is of SoShaderStateMatrixParameter type
423 SbBool containStateMatrixParameters() const
424 { return (m_stateMatrixParameters.getLength() != 0) ; }
425
426 const SbString& getSourceProgram() const
427 { return m_sourceProgram;}
428
432 inline bool isFileFound() const;
433
435 inline bool needUpdate() const { return m_needUpdate; }
436
438 void invalidate();
439
441 void setDefine(const char* name, const char* value);
442 void setDefine(const char* name, const SbString& value)
443 { setDefine(name,value.toLatin1()); }
444
446 void removeDefine(const char* name);
447
449 void checkValidity();
450
452 inline void setVersion(const SbString& version) { m_version = version; }
453
455 const SbString& getVersion();
456
458 const SbString& getProfile();
459
461 inline void setProfile(const SbString& profile) { m_profile = profile; }
462
464 static bool isShaderObjectAvailable(SoState* state);
465
467 static bool isGLSLLanguageAvailable(SoState* state);
468
470 static bool isRayTracingAvailable(SoState* state);
471
473 void invalidateSource();
474
476 void buildSourceToLoad(SbString &builtSource);
477
479 SbString getFileAbsolutePath(const SbString& filename);
480
482 virtual void notify(SoNotList *list);
483
485 void getHeaderFilenames( std::vector<SbString>& filenames );
486
488 void setIsFixedPipeline(bool isFixedPipelineShader)
489 {
490 m_isFixedPipelineShader = isFixedPipelineShader;
491 }
492
494 bool isFixedPipeline() const
495 {
496 return m_isFixedPipelineShader;
497 }
498
499private:
500
501 friend class SoShaderProgram;
503 typedef SbConstCharMap<SbString> DefineMap;
504 typedef DefineMap::iterator DefineMapIt;
505
507 typedef std::vector<SbString> SbStringVector;
508
510 void setGlobalDefine(const DefineMap& map);
511
513 void setDefine(DefineMap::value_type& p);
514
516 bool hasDefine(const char* name) const;
517
519 typedef std::set<SbString> HeaderSet;
520 typedef HeaderSet::iterator HeaderSetIt;
521
523 void setGlobalHeader(const HeaderSet& map);
524
525 // Extract the source from a given file if sourceType equals FILENAME.
526 void readSource();
527
531 SoShaderObject();
532
533 // Destructor
534 virtual ~SoShaderObject();
535
536SoINTERNAL private:
537 virtual void getDefaultExtensions(std::vector<SbString>& defaultExtensions);
538
539private:
540 SoShaderParser* m_parser;
541 SbString m_sourceProgram;
542
544 SbString m_version;
545 SbString m_profile;
547 typedef std::map<std::string, std::string> ExtensionMap;
548 ExtensionMap m_extensionList;
549
550 typedef std::map<SbString, SbString> StrStrMap;
551
559 void extractInfosFromSource(SbString& version, SbString& source,SbString& profile, ExtensionMap& extensionList);
560
562 bool isEmptyLine(const std::string& line) const;
563
565 static SbString definesExtension(const SbString& source, const ExtensionMap::value_type& p);
566
568 static SbString definesAcc(const SbString& source, const DefineMap::value_type& p);
569
572 void getSourceFilename(std::vector<SbString>& filenames) const;
573
575 DefineMap m_defineMap;
576
578 DefineMap m_defineGlobalMap;
579
581 HeaderSet m_headerGlobalSet;
582
584 SbStringVector m_includeSourceVector;
585
587 SbStringVector m_includeFilenameVector;
588
590 SbString m_directoryFound;
591
592 // Update the list of state matrix parameters
593 void updateStateMatrixList() ;
594
595 // Store the list of state matrix parameters
596 SoNodeList m_stateMatrixParameters ;
597
598 // True if the shader can't be read
599 bool m_fileFound;
600
602 bool m_needUpdate;
603
605 bool m_needRead;
606
607 bool m_isFixedPipelineShader;
608
610 static StrStrMap s_shadersPaths;
611 static SbThreadRWMutex s_shadersPathsMutex;
612 static bool s_debugCache;
613};
614/*----------------------------------------------------------------------------*/
615
616/*******************************************************************************/
617template<typename UniformParamType, typename ParamValueType>
618UniformParamType*
619SoShaderObject::addShaderParameter(const SbString& name, ParamValueType val)
620{
621 UniformParamType *param = dynamic_cast<UniformParamType *>(parameter.findUniformParameterByName(name));
622 if (param)
623 {
624 // This parameter already exist => prefer to replace it
625 param->value.setValue(val);
626 }
627 else
628 {
629 param = new UniformParamType;
630 param->name = name;
631 param->value.setValue(val);
632 parameter.addShaderParameter(param);
633 }
634
635 return param;
636}
637
638/*****************************************************************************/
639template<typename UniformParamType, typename ParamValueType>
640void
641SoShaderObject::setShaderParameter(const SbString& name, ParamValueType val)
642{
643 SoUniformShaderParameter* param = parameter.findUniformParameterByName(name);
644 assert(param);
645 assert(param->isOfType(UniformParamType::getClassTypeId()) == TRUE);
646 UniformParamType* i = static_cast<UniformParamType*>(param);
647 i->value = val;
648}
649
650/*****************************************************************************/
651bool
652SoShaderObject::isFileFound() const
653{
654 return m_fileFound;
655}
656
657#ifdef _MSC_VER
658#pragma warning( pop )
659#endif
660
661#endif /*_SO_SHADER_OBJECT_H_*/
662
663
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.
@ RAY_MISS_SHADER
The shader is a ray miss 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.
@ RAY_GEN_SHADER
The shader is a ray generation shader.
@ ANY_HIT_SHADER
The shader is an any hit shader.
@ FRAGMENT_SHADER
The shader is a fragment shader.
@ CLOSEST_HIT_SHADER
The shader is a closest hit shader.
@ GEOMETRY_SHADER
The shader is a geometry shader.
@ TESSELLATION_CONTROL_SHADER
The shader is a tessellation control shader.
@ INTERSECTION_SHADER
The shader is an intersection 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