00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _SO_SHADER_OBJECT_H_
00026 #define _SO_SHADER_OBJECT_H_
00027
00028 #include <Inventor/SbBasic.h>
00029 #include <Inventor/SbString.h>
00030 #include <Inventor/nodes/SoNode.h>
00031 #include <Inventor/fields/SoSFFilePathString.h>
00032 #include <Inventor/fields/SoSFEnum.h>
00033 #include <Inventor/fields/SoSFBool.h>
00034 #include <Inventor/fields/SoMFUniformShaderParameter.h>
00035 #include <Inventor/SbEnums.h>
00036
00037 #include <Inventor/STL/cassert>
00038 #include <Inventor/STL/map>
00039 #include <Inventor/helpers/SbConstCharMap.h>
00040
00041 class SoGLShaderContainer ;
00042 class SoGLShaderObject ;
00043 class SoFieldSensor ;
00044 class SoNodeSensor ;
00045 class SoFileSensor ;
00046 class SoShaderParser;
00047
00048 #ifdef _MSC_VER
00049 #pragma warning( push )
00050 #pragma warning(disable:4251)
00051 #endif
00052
00288 class SoShaderObject : public SoNode
00289 {
00290
00291 SO_NODE_ABSTRACT_HEADER(SoShaderObject);
00292
00293 public:
00294
00296 enum SourceType
00297 {SoDEPRECATED
00302 ARB_PROGRAM,
00303 SoDEPRECATED
00308 CG_PROGRAM,
00309
00313 GLSL_PROGRAM,
00314
00318 FILENAME
00319 };
00320
00324 SoSFBool isActive;
00325
00336 SoSFEnum sourceType;
00337
00352 SoSFFilePathString sourceProgram;
00353
00358 SoMFUniformShaderParameter parameter;
00359
00376 template<typename UniformParamType, typename ParamValueType>
00377 UniformParamType* addShaderParameter(const SbString& name, ParamValueType val);
00378
00380 enum ShaderType
00381 {
00383 VERTEX_SHADER = SbEnums::SHADER_TYPE_VERTEX,
00385 GEOMETRY_SHADER = SbEnums::SHADER_TYPE_GEOMETRY,
00387 FRAGMENT_SHADER = SbEnums::SHADER_TYPE_FRAGMENT,
00389 TESSELLATION_CONTROL_SHADER = SbEnums::SHADER_TYPE_TESS_CTRL,
00391 TESSELLATION_EVALUATION_SHADER = SbEnums::SHADER_TYPE_TESS_EVAL
00392 };
00393
00395 virtual ShaderType getShaderType() const = 0;
00396
00411 template<typename UniformParamType, typename ParamValueType>
00412 void setShaderParameter(const SbString& name, ParamValueType val);
00413
00414 #ifndef HIDDEN_FROM_DOC
00415
00416 #define MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(ParamType)\
00417 \
00418 template<typename ParamValueType>\
00419 void\
00420 setShaderParameter ## ParamType(const SbString& name, ParamValueType val)\
00421 {\
00422 setShaderParameter<SoShaderParameter ## ParamType>(name, val);\
00423 }
00424 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(1i)
00425 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(2i)
00426 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(3i)
00427 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(4i)
00428 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(1f)
00429 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(2f)
00430 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(3f)
00431 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(4f)
00432 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array1f)
00433 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array2f)
00434 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array3f)
00435 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array4f)
00436 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array1i)
00437 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array2i)
00438 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array3i)
00439 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Array4i)
00440 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Matrix)
00441 MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER(Matrix3)
00442 #undef MAKE_HELPHER_FUNC_SET_SHADER_PARAMETER
00443
00444
00445 #define MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(ParamType)\
00446 \
00447 template<typename ParamValueType>\
00448 SoShaderParameter ## ParamType *\
00449 addShaderParameter ## ParamType(const SbString& name, ParamValueType val)\
00450 {\
00451 return addShaderParameter<SoShaderParameter ## ParamType>(name, val);\
00452 }
00453 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(1i)
00454 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(2i)
00455 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(3i)
00456 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(4i)
00457 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(1f)
00458 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(2f)
00459 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(3f)
00460 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(4f)
00461 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array1f)
00462 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array2f)
00463 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array3f)
00464 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array4f)
00465 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array1i)
00466 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array2i)
00467 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array3i)
00468 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Array4i)
00469 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Matrix)
00470 MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER(Matrix3)
00471 #undef MAKE_HELPHER_FUNC_ADD_SHADER_PARAMETER
00472 #endif //HIDDEN_FROM_DOC
00473
00474
00475
00476 private:
00477
00479 void setShaderObjectInfos(SoState* state, const SbString& shaderVersion, const SbString& shaderProfile);
00480
00482 SourceType getSourceType();
00483
00484 static void initClass();
00485 static void exitClass() ;
00486
00491 SbBool isInternal() const;
00492
00493
00494 SbBool containStateMatrixParameters() const
00495 { return (m_stateMatrixParameters.getLength() != 0) ; }
00496
00497 const SbString& getSourceProgram() const
00498 { return m_sourceProgram;}
00499
00503 inline bool isFileFound() const;
00504
00506 inline bool needUpdate() const { return m_needUpdate; }
00507
00509 void invalidate();
00510
00512 void setDefine(const char* name, const char* value);
00513 void setDefine(const char* name, const SbString& value)
00514 { setDefine(name,value.toLatin1()); }
00515
00517 void removeDefine(const char* name);
00518
00520 void checkValidity();
00521
00523 inline void setVersion(const SbString& version) { m_version = version; }
00524
00526 const SbString& getVersion();
00527
00529 const SbString& getProfile();
00530
00532 inline void setProfile(const SbString& profile) { m_profile = profile; }
00533
00535 static bool isShaderObjectAvailable(SoState* state);
00536
00538 static bool isGLSLLanguageAvailable(SoState* state);
00539
00541 void invalidateSource();
00542
00544 void buildSourceToLoad(SbString &builtSource);
00545
00547 SbString getFileAbsolutePath(const SbString& filename);
00548
00550 virtual void notify(SoNotList *list);
00551
00553 void getHeaderFilenames( std::vector<SbString>& filenames );
00554
00555 private:
00556
00557 friend class SoShaderProgram;
00559 typedef SbConstCharMap<SbString> DefineMap;
00560 typedef DefineMap::iterator DefineMapIt;
00561
00563 typedef std::vector<SbString> SbStringVector;
00564
00566 void setGlobalDefine(const DefineMap& map);
00567
00569 void setDefine(DefineMap::value_type& p);
00570
00572 bool hasDefine(const char* name) const;
00573
00575 typedef std::set<SbString> HeaderSet;
00576 typedef HeaderSet::iterator HeaderSetIt;
00577
00579 void setGlobalHeader(const HeaderSet& map);
00580
00581
00582 void readSource();
00583
00587 SoShaderObject();
00588
00589
00590 virtual ~SoShaderObject();
00591
00592 private:
00593 SoShaderParser* m_parser;
00594 SbString m_sourceProgram;
00595
00597 SbString m_version;
00598 SbString m_profile;
00600 typedef std::map<std::string, std::string> ExtensionMap;
00601 ExtensionMap m_extensionList;
00602
00603 typedef std::map<SbString, SbString> StrStrMap;
00604
00612 void extractInfosFromSource(SbString& version, SbString& source,SbString& profile, ExtensionMap& extensionList);
00613
00615 bool isEmptyLine(const std::string& line) const;
00616
00618 static SbString definesExtension(const SbString& source, const ExtensionMap::value_type& p);
00619
00621 static SbString definesAcc(const SbString& source, const DefineMap::value_type& p);
00622
00625 void getSourceFilename(std::vector<SbString>& filenames) const;
00626
00628 DefineMap m_defineMap;
00629
00631 DefineMap m_defineGlobalMap;
00632
00634 HeaderSet m_headerGlobalSet;
00635
00637 SbStringVector m_includeSourceVector;
00638
00640 SbStringVector m_includeFilenameVector;
00641
00643 SbString m_directoryFound;
00644
00645
00646 void updateStateMatrixList() ;
00647
00648
00649 SoNodeList m_stateMatrixParameters ;
00650
00651
00652 bool m_fileFound;
00653
00655 bool m_needUpdate;
00656
00658 bool m_needRead;
00659
00660 static int s_shader_objects_extensionID;
00661 static int s_shading_language_100_extensionID;
00662 static int s_gpu_shader4_extensionID;
00663
00665 static StrStrMap s_shadersPaths;
00666 static SbThreadRWMutex s_shadersPathsMutex;
00667 static bool s_debugCache;
00668 };
00669
00670
00671
00672 template<typename UniformParamType, typename ParamValueType>
00673 UniformParamType*
00674 SoShaderObject::addShaderParameter(const SbString& name, ParamValueType val)
00675 {
00676 UniformParamType *param = dynamic_cast<UniformParamType *>(parameter.findUniformParameterByName(name));
00677 if (param)
00678 {
00679
00680 param->value.setValue(val);
00681 }
00682 else
00683 {
00684 param = new UniformParamType;
00685 param->name = name;
00686 param->value.setValue(val);
00687 parameter.addShaderParameter(param);
00688 }
00689
00690 return param;
00691 }
00692
00693
00694 template<typename UniformParamType, typename ParamValueType>
00695 void
00696 SoShaderObject::setShaderParameter(const SbString& name, ParamValueType val)
00697 {
00698 SoUniformShaderParameter* param = parameter.findUniformParameterByName(name);
00699 assert(param);
00700 assert(param->isOfType(UniformParamType::getClassTypeId()) == TRUE);
00701 UniformParamType* i = static_cast<UniformParamType*>(param);
00702 i->value = val;
00703 }
00704
00705
00706 bool
00707 SoShaderObject::isFileFound() const
00708 {
00709 return m_fileFound;
00710 }
00711
00712 #ifdef _MSC_VER
00713 #pragma warning( pop )
00714 #endif
00715
00716 #endif
00717
00718
00719