diff --git a/Engine/source/shaderGen/featureMgr.cpp b/Engine/source/shaderGen/featureMgr.cpp index 764804981..7e742bf58 100644 --- a/Engine/source/shaderGen/featureMgr.cpp +++ b/Engine/source/shaderGen/featureMgr.cpp @@ -96,16 +96,41 @@ ShaderFeature* FeatureMgr::getByType( const FeatureType &type ) return NULL; } -void FeatureMgr::registerFeature( const FeatureType &type, - ShaderFeature *feature ) +ShaderFeature* FeatureMgr::createFeature(const FeatureType& type, void* argStruct) { - // Remove any existing feature first. + FeatureInfoVector::iterator iter = mFeatures.begin(); + + for (; iter != mFeatures.end(); iter++) + { + if (*iter->type == type) + { + if (iter->createFunc != NULL) + { + return iter->createFunc(argStruct); + } + } + } + + return nullptr; +} + +void FeatureMgr::registerFeature( const FeatureType &type, + ShaderFeature *feature, + CreateShaderFeatureDelegate featureDelegate) +{ + if (feature == nullptr && featureDelegate == nullptr) + { + AssertFatal(false, "FeatureMgr::registerFeature - no feature or featureDelegate defined, cannot create this feature."); + } + + // Remove any existing feature. unregisterFeature( type ); // Now add the new feature. mFeatures.increment(); mFeatures.last().type = &type; mFeatures.last().feature = feature; + mFeatures.last().createFunc = featureDelegate; // Make sure we resort the features. mNeedsSort = true; diff --git a/Engine/source/shaderGen/featureMgr.h b/Engine/source/shaderGen/featureMgr.h index 4c897cf53..0b4eeecf1 100644 --- a/Engine/source/shaderGen/featureMgr.h +++ b/Engine/source/shaderGen/featureMgr.h @@ -27,16 +27,28 @@ #endif #ifndef _TVECTOR_H_ #include "core/util/tVector.h" -#endif +#endif + +#ifndef _UTIL_DELEGATE_H_ +#include "core/util/delegate.h" +#endif class FeatureType; class ShaderFeature; +typedef Delegate CreateShaderFeatureDelegate; + +/// /// Used by the feature manager. +/// +/// The shader feature type. +/// The shader feature class. +/// The static create function for this feature. struct FeatureInfo { const FeatureType *type; ShaderFeature *feature; + CreateShaderFeatureDelegate createFunc; }; @@ -67,10 +79,26 @@ public: /// ShaderFeature* getByType( const FeatureType &type ); - // Allows other systems to add features. index is - // the enum in GFXMaterialFeatureData. - void registerFeature( const FeatureType &type, - ShaderFeature *feature ); + /// + /// Creates a shader feature of this type with the arguments provided. + /// + /// The shader feature type. + /// The arguments for setting up this isntance of the shaderFeature. + /// An instance of the shader feature using its static createFunction taking in the + /// argument struct. + /// + ShaderFeature* createFeature(const FeatureType& type, void* argStruct); + + /// + /// Allows other systems to add features. index is + /// the enum in GFXMaterialFeatureData. + /// + /// The shader feature type. + /// The shader feature (can be null if featureDelegate defined) + /// The feature delegate create function. + void registerFeature(const FeatureType& type, + ShaderFeature* feature = nullptr, + CreateShaderFeatureDelegate featureDelegate = nullptr); // Unregister a feature. void unregisterFeature( const FeatureType &type ); @@ -86,4 +114,4 @@ public: // Helper for accessing the feature manager singleton. #define FEATUREMGR ManagedSingleton::instance() -#endif // FEATUREMGR \ No newline at end of file +#endif // FEATUREMGR diff --git a/Engine/source/shaderGen/featureSet.cpp b/Engine/source/shaderGen/featureSet.cpp index 2eff50e1c..0edda8c25 100644 --- a/Engine/source/shaderGen/featureSet.cpp +++ b/Engine/source/shaderGen/featureSet.cpp @@ -82,6 +82,14 @@ const FeatureType& FeatureSet::getAt( U32 index, S32 *outIndex ) const return *mFeatures[index].type; } +void* FeatureSet::getArguments(U32 index) const +{ + if (mFeatures[index].argStruct) + return mFeatures[index].argStruct; + + return nullptr; +} + void FeatureSet::clear() { mDescription.clear(); @@ -138,7 +146,7 @@ void FeatureSet::setFeature( const FeatureType &type, bool set, S32 index ) mDescription.clear(); } -void FeatureSet::addFeature( const FeatureType &type, S32 index ) +void FeatureSet::addFeature( const FeatureType &type, S32 index, void* argStruct ) { for ( U32 i=0; i < mFeatures.size(); i++ ) { @@ -151,6 +159,7 @@ void FeatureSet::addFeature( const FeatureType &type, S32 index ) FeatureInfo info; info.type = &type; info.index = index; + info.argStruct = argStruct; mFeatures.push_back( info ); mDescription.clear(); diff --git a/Engine/source/shaderGen/featureSet.h b/Engine/source/shaderGen/featureSet.h index 03b46f62a..b494492fd 100644 --- a/Engine/source/shaderGen/featureSet.h +++ b/Engine/source/shaderGen/featureSet.h @@ -42,6 +42,7 @@ protected: { const FeatureType* type; S32 index; + void* argStruct; }; /// The list of featurs. @@ -93,14 +94,21 @@ public: /// the feature index when it was added. const FeatureType& getAt( U32 index, S32 *outIndex = NULL ) const; + void* getArguments(U32 index) const; + /// Returns true if this handle has this feature. bool hasFeature( const FeatureType &type, S32 index = -1 ) const; /// void setFeature( const FeatureType &type, bool set, S32 index = -1 ); - /// - void addFeature( const FeatureType &type, S32 index = -1 ); + /// + /// Adds a feauter to the feature set. + /// + /// The shader feature type. + /// The inedx the shader feature will be sorted in the set. + /// A struct representing arguments for a shader feature. + void addFeature( const FeatureType &type, S32 index = -1, void* argStruct = nullptr ); /// void removeFeature( const FeatureType &type ); diff --git a/Engine/source/shaderGen/shaderGen.cpp b/Engine/source/shaderGen/shaderGen.cpp index 3339aaea5..07781aea0 100644 --- a/Engine/source/shaderGen/shaderGen.cpp +++ b/Engine/source/shaderGen/shaderGen.cpp @@ -257,7 +257,13 @@ void ShaderGen::_processVertFeatures( Vector ¯os, bool macro { S32 index; const FeatureType &type = features.getAt( i, &index ); - ShaderFeature* feature = FEATUREMGR->getByType( type ); + void* args = features.getArguments(i); + ShaderFeature* feature = nullptr; + if(args) + feature = FEATUREMGR->createFeature(type, args); + else + feature = FEATUREMGR->getByType( type ); + if ( feature ) { feature->setProcessIndex( index ); @@ -300,7 +306,12 @@ void ShaderGen::_processPixFeatures( Vector ¯os, bool macros { S32 index; const FeatureType &type = features.getAt( i, &index ); - ShaderFeature* feature = FEATUREMGR->getByType( type ); + void* args = features.getArguments(i); + ShaderFeature* feature = nullptr; + if (args) + feature = FEATUREMGR->createFeature(type, args); + else + feature = FEATUREMGR->getByType(type); if ( feature ) { feature->setProcessIndex( index ); @@ -342,7 +353,12 @@ void ShaderGen::_printFeatureList(Stream &stream) { S32 index; const FeatureType &type = features.getAt( i, &index ); - ShaderFeature* feature = FEATUREMGR->getByType( type ); + void* args = features.getArguments(i); + ShaderFeature* feature = nullptr; + if (args) + feature = FEATUREMGR->createFeature(type, args); + else + feature = FEATUREMGR->getByType(type); if ( feature ) { String line; diff --git a/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPreviewWindow.ed.gui b/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPreviewWindow.ed.gui index 2442a6aa7..f5f370961 100644 --- a/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPreviewWindow.ed.gui +++ b/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPreviewWindow.ed.gui @@ -174,7 +174,7 @@ $guiContent = new GuiControl() { canSave = "1"; Visible = "1"; Command = "getColorF($thisControl.color, \"MaterialEditorGui.updatePreviewBackground\");"; - color = "0 0 0 .7"; + color = "0.04 0.04 0.04 .7"; hovertime = "1000"; groupNum = "-1"; buttonType = "PushButton";