From fd327f68f603ee613a3f460d93f8d8ebaed88c82 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 28 Oct 2004 13:26:06 +0000 Subject: [PATCH] From Tom Jolley, Added a new enum POINT_ROT_WORLD_Z_AXIS and a new section in computeMatrix for this enum. With a small tweak from Robert Osfield to set _cacheMode. --- include/osg/Billboard | 1 + src/osg/Billboard.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/osg/Billboard b/include/osg/Billboard index 2d1608465..12fdeedc6 100644 --- a/include/osg/Billboard +++ b/include/osg/Billboard @@ -112,6 +112,7 @@ class SG_EXPORT Billboard : public Geode AXIAL_ROT_X_AXIS=AXIAL_ROT+1, AXIAL_ROT_Y_AXIS, AXIAL_ROT_Z_AXIS, + POINT_ROT_WORLD_Z_AXIS, CACHE_DIRTY }; diff --git a/src/osg/Billboard.cpp b/src/osg/Billboard.cpp index 4725698c8..381e77f30 100644 --- a/src/osg/Billboard.cpp +++ b/src/osg/Billboard.cpp @@ -70,6 +70,12 @@ void Billboard::updateCache() else if (_axis==Vec3(0.0f,0.0,1.0f) && _normal==Vec3(0.0f,-1.0,0.0f)) _cachedMode = AXIAL_ROT_Z_AXIS; else _cachedMode = AXIAL_ROT; } + else if( _mode == POINT_ROT_WORLD ) + { + if(_axis==Vec3(0.0f, 0.0, 1.0f) && _normal==Vec3(0.0f, -1.0f, 0.0f)) _cachedMode = POINT_ROT_WORLD_Z_AXIS; + else _cachedMode = _mode; + + } else _cachedMode = _mode; _side = _axis^_normal; @@ -226,6 +232,29 @@ bool Billboard::computeMatrix(Matrix& modelview, const Vec3& eye_local, const Ve } break; } + case(POINT_ROT_WORLD_Z_AXIS): + { + // float rotation_about_z = atan2( -ev.y(), ev.x() ); + // float xy_distance = sqrt( ev.x()*ev.x() + ev.y()*ev.y() ); + // float rotation_from_xy = atan2( xy_distance, -ev.z() ); + + Vec2 about_z( -ev.y(), ev.x() ); + if( about_z.normalize() == 0.0f ) about_z.x() = 1.0f; + float xy_distance = sqrt( ev.x()*ev.x() + ev.y()*ev.y() ); + Vec2 from_xy( xy_distance, -ev.z() ); + if( from_xy.normalize() == 0.0f ) from_xy.x() = 1.0f; + + matrix(0,0) = about_z.x(); + matrix(0,1) = about_z.y(); + matrix(1,0) = -about_z.y()*from_xy.x(); + matrix(1,1) = about_z.x()*from_xy.x(); + matrix(1,2) = from_xy.y(); + matrix(2,0) = about_z.y()*from_xy.y(); + matrix(2,1) = -about_z.x()*from_xy.y(); + matrix(2,2) = from_xy.x(); + + break; + } } matrix.setTrans(pos_local);