]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/SGScaleTransform.cxx
Work around apparent OSG 3.2.0 normal binding bug.
[simgear.git] / simgear / scene / model / SGScaleTransform.cxx
index 6a4a581ef8f8ac2fcf51b3b0929536c36ef0eacf..0fe7443d5553e9bf0f38170053bbb2d99084b4f3 100644 (file)
  *
  */
 
-/* -*-c++-*-
- *
- * Copyright (C) 2006-2007 Mathias Froehlich 
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * 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
@@ -48,6 +27,8 @@
 #include <osgDB/Input>
 #include <osgDB/Output>
 
+#include <simgear/scene/util/OsgMath.hxx>
+
 #include "SGScaleTransform.hxx"
 
 SGScaleTransform::SGScaleTransform() :
@@ -56,6 +37,11 @@ SGScaleTransform::SGScaleTransform() :
   _boundScale(1)
 {
   setReferenceFrame(RELATIVE_RF);
+  // see osg::Transform doc: If the transformation matrix scales the subgraph
+  // then the normals of the underlying geometry will need to be renormalized
+  // to be unit vectors once more.
+  osg::StateSet* stateset = getOrCreateStateSet();
+  stateset->setMode(GL_NORMALIZE, osg::StateAttribute::ON);
 }
 
 SGScaleTransform::SGScaleTransform(const SGScaleTransform& scale,
@@ -128,21 +114,21 @@ bool ScaleTransform_readLocalData(osg::Object& obj, osgDB::Input& fr)
     SGScaleTransform& scale = static_cast<SGScaleTransform&>(obj);
     if (fr[0].matchWord("center")) {
         ++fr;
-        SGVec3d center;
-        if (fr.readSequence(center.osg()))
+        osg::Vec3d center;
+        if (fr.readSequence(center))
             fr += 3;
         else
             return false;
-        scale.setCenter(center);
+        scale.setCenter(toSG(center));
     }
     if (fr[0].matchWord("scaleFactor")) {
         ++fr;
-        SGVec3d scaleFactor;
-        if (fr.readSequence(scaleFactor.osg()))
+        osg::Vec3d scaleFactor;
+        if (fr.readSequence(scaleFactor))
             fr += 3;
         else
             return false;
-        scale.setScaleFactor(scaleFactor);
+        scale.setScaleFactor(toSG(scaleFactor));
     }
     return true;
 }