X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmaterial%2FTechnique.cxx;h=aeab9cf365b9b3057c70701b82e6d9165fd02397;hb=9f9c4cf32c2cf774c7febd7fe2b4e65a7d205294;hp=19699607c9a4415df051e4ac97fd73afbd07abbe;hpb=4219f16f61276e07067e005b850f058a41237f46;p=simgear.git diff --git a/simgear/scene/material/Technique.cxx b/simgear/scene/material/Technique.cxx index 19699607..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 @@ -53,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() @@ -186,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); @@ -214,7 +219,11 @@ class GLVersionExpression : public SGExpression public: void eval(float& value, const expression::Binding*) const { +#ifdef TECHNIQUE_TEST_EXTENSIONS + value = 1.1; +#else value = getGLVersionNumber(); +#endif } }; @@ -250,14 +259,54 @@ Expression* extensionSupportedParser(const SGPropertyNode* exp, expression::Parser* parser) { if (exp->getType() == props::STRING - || exp->getType() == props::UNSPECIFIED) - return new ExtensionSupportedExpression(exp->getStringValue()); + || 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) { @@ -270,11 +319,6 @@ void Technique::setGLExtensionsPred(float glVersion, SGExpression* versionTest = makePredicate(new SGConstExpression(glVersion), new GLVersionExpression); -#if 0 - LessEqualExpression* versionTest - = new LessEqualExpression(new SGConstExpression(glVersion), - new GLVersionExpression); -#endif AndExpression* extensionsExp = 0; for (vector::const_iterator itr = extensions.begin(), e = extensions.end(); @@ -299,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);