]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/material/TextureBuilder.cxx
Effects for models
[simgear.git] / simgear / scene / material / TextureBuilder.cxx
index 2ea23c6e61ca0dde7f34a278531f4fb44bf6b183..2623c4a73a2b76458b9e2db98fae420fa48dacc4 100644 (file)
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
+
 #include "TextureBuilder.hxx"
 
 #include <osg/Texture1D>
@@ -27,6 +31,8 @@
 
 #include <simgear/scene/util/SGSceneFeatures.hxx>
 #include <simgear/scene/util/StateAttributeFactory.hxx>
+#include <simgear/math/SGMath.hxx>
+#include <simgear/structure/OSGUtils.hxx>
 
 #include "Noise.hxx"
 
@@ -35,6 +41,8 @@ namespace simgear
 using namespace std;
 using namespace osg;
 
+using namespace effect;
+
 // Hack to force inclusion of TextureBuilder.cxx in library
 osg::Texture* TextureBuilder::buildFromType(Effect* effect, const string& type,
                                             const SGPropertyNode*props,
@@ -50,7 +58,7 @@ typedef boost::tuple<string, Texture::FilterMode, Texture::FilterMode,
 
 namespace
 {
-EffectNameValue<Texture::FilterMode> filterModes[] =
+EffectNameValue<Texture::FilterMode> filterModesInit[] =
 {
     { "linear", Texture::LINEAR },
     { "linear-mipmap-linear", Texture::LINEAR_MIPMAP_LINEAR},
@@ -59,8 +67,9 @@ EffectNameValue<Texture::FilterMode> filterModes[] =
     { "nearest-mipmap-linear", Texture::NEAREST_MIPMAP_LINEAR},
     { "nearest-mipmap-nearest", Texture::NEAREST_MIPMAP_NEAREST}
 };
+EffectPropertyMap<Texture::FilterMode> filterModes(filterModesInit);
 
-EffectNameValue<Texture::WrapMode> wrapModes[] =
+EffectNameValue<Texture::WrapMode> wrapModesInit[] =
 {
     {"clamp", Texture::CLAMP},
     {"clamp-to-border", Texture::CLAMP_TO_BORDER},
@@ -68,7 +77,7 @@ EffectNameValue<Texture::WrapMode> wrapModes[] =
     {"mirror", Texture::MIRROR},
     {"repeat", Texture::REPEAT}
 };
-
+EffectPropertyMap<Texture::WrapMode> wrapModes(wrapModesInit);
 
 
 TexTuple makeTexTuple(Effect* effect, const SGPropertyNode* props,
@@ -274,4 +283,36 @@ namespace
 TextureBuilder::Registrar installNoise("noise", new NoiseBuilder);
 }
 
+bool makeTextureParameters(SGPropertyNode* paramRoot, const StateSet* ss)
+{
+    SGPropertyNode* texUnit = makeChild(paramRoot, "texture");
+    const Texture* tex = getStateAttribute<Texture>(0, ss);
+    const Texture2D* texture = dynamic_cast<const Texture2D*>(tex);
+    makeChild(texUnit, "unit")->setValue(0);
+    if (!tex) {
+        makeChild(texUnit, "active")->setValue(false);
+        makeChild(texUnit, "type")->setValue("white");
+        return false;
+    }
+    const Image* image = texture->getImage();
+    string imageName;
+    if (image) {
+        imageName = image->getFileName();
+    } else {
+        makeChild(texUnit, "active")->setValue(false);
+        makeChild(texUnit, "type")->setValue("white");
+        return false;
+    }
+    makeChild(texUnit, "active")->setValue(true);
+    makeChild(texUnit, "type")->setValue("2d");
+    string wrapS = findName(wrapModes, texture->getWrap(Texture::WRAP_S));
+    string wrapT = findName(wrapModes, texture->getWrap(Texture::WRAP_T));
+    string wrapR = findName(wrapModes, texture->getWrap(Texture::WRAP_R));
+    makeChild(texUnit, "image")->setStringValue(imageName);
+    makeChild(texUnit, "wrap-s")->setStringValue(wrapS);
+    makeChild(texUnit, "wrap-t")->setStringValue(wrapT);
+    makeChild(texUnit, "wrap-r")->setStringValue(wrapR);
+    return true;
+}
+
 }