X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmaterial%2FTechnique.cxx;h=aeab9cf365b9b3057c70701b82e6d9165fd02397;hb=9f9c4cf32c2cf774c7febd7fe2b4e65a7d205294;hp=5c1d835b683e075a5506b0a8b9d1ba7670862012;hpb=a5a6600e745d763fc2b933141ebf090879c700bb;p=simgear.git diff --git a/simgear/scene/material/Technique.cxx b/simgear/scene/material/Technique.cxx index 5c1d835b..aeab9cf3 100644 --- a/simgear/scene/material/Technique.cxx +++ b/simgear/scene/material/Technique.cxx @@ -1,13 +1,19 @@ + +#ifdef HAVE_CONFIG_H +# include +#endif + #include "Technique.hxx" #include "Pass.hxx" -#include #include +#include #include #include #include +#include #include #include @@ -15,6 +21,7 @@ #include #include +#include #include namespace simgear @@ -52,16 +59,15 @@ Technique::Technique(bool alwaysValid) Technique::Technique(const Technique& rhs, const osg::CopyOp& copyop) : _contextMap(rhs._contextMap), _alwaysValid(rhs._alwaysValid), - _shadowingStateSet(rhs._shadowingStateSet), + _shadowingStateSet(copyop(rhs._shadowingStateSet.get())), _validExpression(rhs._validExpression), _contextIdLocation(rhs._contextIdLocation) { - using namespace std; - using namespace boost; - transform(rhs.passes.begin(), rhs.passes.end(), - backRefInsertIterator(passes), - bind(simgear::clone_ref, _1, copyop)); - + for (std::vector >::const_iterator itr = rhs.passes.begin(), + end = rhs.passes.end(); + itr != end; + ++itr) + passes.push_back(static_cast(copyop(itr->get()))); } Technique::~Technique() @@ -185,7 +191,7 @@ void Technique::releaseGLObjects(osg::State* state) const pass->releaseGLObjects(state); } if (state == 0) { - for (int i = 0; i < _contextMap.size(); ++i) { + for (int i = 0; i < (int)_contextMap.size(); ++i) { ContextInfo& info = _contextMap[i]; Status oldVal = info.valid(); info.valid.compareAndSwap(oldVal, UNKNOWN); @@ -213,10 +219,22 @@ class GLVersionExpression : public SGExpression public: void eval(float& value, const expression::Binding*) const { +#ifdef TECHNIQUE_TEST_EXTENSIONS + value = 1.1; +#else value = getGLVersionNumber(); +#endif } }; +Expression* glVersionParser(const SGPropertyNode* exp, + expression::Parser* parser) +{ + return new GLVersionExpression(); +} + +expression::ExpParserRegistrar glVersionRegistrar("glversion", glVersionParser); + class ExtensionSupportedExpression : public GeneralNaryExpression { @@ -237,6 +255,58 @@ protected: string _extString; }; +Expression* extensionSupportedParser(const SGPropertyNode* exp, + expression::Parser* parser) +{ + if (exp->getType() == props::STRING + || exp->getType() == props::UNSPECIFIED) { + ExtensionSupportedExpression* esp + = new ExtensionSupportedExpression(exp->getStringValue()); + int location = parser->getBindingLayout().addBinding("__contextId", + expression::INT); + VariableExpression* contextExp + = new VariableExpression(location); + esp->addOperand(contextExp); + return esp; + } + throw expression::ParseError("extension-supported expression has wrong type"); +} + +expression::ExpParserRegistrar +extensionSupportedRegistrar("extension-supported", extensionSupportedParser); + +class GLShaderLanguageExpression : public GeneralNaryExpression +{ +public: + void eval(float& value, const expression::Binding* b) const + { + value = 0.0f; + int contextId = getOperand(0)->getValue(b); + GL2Extensions* extensions + = GL2Extensions::Get(static_cast(contextId), true); + if (!extensions) + return; + if (!extensions->isGlslSupported()) + return; + value = extensions->getLanguageVersion(); + } +}; + +Expression* shaderLanguageParser(const SGPropertyNode* exp, + expression::Parser* parser) +{ + GLShaderLanguageExpression* slexp = new GLShaderLanguageExpression; + int location = parser->getBindingLayout().addBinding("__contextId", + expression::INT); + VariableExpression* contextExp = new VariableExpression(location); + slexp->addOperand(contextExp); + return slexp; +} + +expression::ExpParserRegistrar shaderLanguageRegistrar("shader-language", + glVersionParser); + + void Technique::setGLExtensionsPred(float glVersion, const std::vector& extensions) { @@ -246,9 +316,9 @@ void Technique::setGLExtensionsPred(float glVersion, int contextLoc = layout.addBinding("__contextId", INT); VariableExpression* contextExp = new VariableExpression(contextLoc); - LessEqualExpression* versionTest - = new LessEqualExpression(new SGConstExpression(glVersion), - new GLVersionExpression); + SGExpression* versionTest + = makePredicate(new SGConstExpression(glVersion), + new GLVersionExpression); AndExpression* extensionsExp = 0; for (vector::const_iterator itr = extensions.begin(), e = extensions.end(); @@ -273,6 +343,16 @@ void Technique::setGLExtensionsPred(float glVersion, setValidExpression(predicate, layout); } +void Technique::refreshValidity() +{ + for (int i = 0; i < (int)_contextMap.size(); ++i) { + ContextInfo& info = _contextMap[i]; + Status oldVal = info.valid(); + // What happens if we lose the race here? + info.valid.compareAndSwap(oldVal, UNKNOWN); + } +} + bool Technique_writeLocalData(const Object& obj, osgDB::Output& fw) { const Technique& tniq = static_cast(obj); @@ -285,7 +365,7 @@ bool Technique_writeLocalData(const Object& obj, osgDB::Output& fw) fw.indent() << "shadowingStateSet\n"; fw.writeObject(*tniq.getShadowingStateSet()); } - fw.indent() << "passes\n"; + fw.indent() << "num_passes " << tniq.passes.size() << "\n"; BOOST_FOREACH(const ref_ptr& pass, tniq.passes) { fw.writeObject(*pass); }