From ebe5a5579cd61e759b523a38a2717eac9b562f83 Mon Sep 17 00:00:00 2001 From: Tim Moore <timoore@redhat.com> Date: Fri, 20 Nov 2009 22:58:59 +0100 Subject: [PATCH] shader language predicate --- simgear/scene/material/Technique.cxx | 33 ++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/simgear/scene/material/Technique.cxx b/simgear/scene/material/Technique.cxx index 4258b464..b8093f35 100644 --- a/simgear/scene/material/Technique.cxx +++ b/simgear/scene/material/Technique.cxx @@ -13,6 +13,7 @@ #include <string> #include <osg/GLExtensions> +#include <osg/GL2Extensions> #include <osg/Math> #include <osgUtil/CullVisitor> @@ -274,6 +275,38 @@ Expression* extensionSupportedParser(const SGPropertyNode* exp, expression::ExpParserRegistrar extensionSupportedRegistrar("extension-supported", extensionSupportedParser); +class GLShaderLanguageExpression : public GeneralNaryExpression<float, int> +{ +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<unsigned>(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<int>* contextExp = new VariableExpression<int>(location); + slexp->addOperand(contextExp); + return slexp; +} + +expression::ExpParserRegistrar shaderLanguageRegistrar("shader-language", + glVersionParser); + + void Technique::setGLExtensionsPred(float glVersion, const std::vector<std::string>& extensions) { -- 2.39.5