Made Matrix a typedef to Matrixf, and converted the old Matrix to Matrixf, as

part of prep for supporting both Matrixf (float) and Matrixd (double).

Added osg::Matrixf::glLoadMatrix() and osg::Matrixf::glMultiMatrix() methods
and changed corresponding usage of glLoad/MultMatrixf() calls across to use these
methods. Again prep for support Matrixd.

Fixes for VisualStudio 6.0 compile.
This commit is contained in:
Robert Osfield
2003-09-02 17:19:18 +00:00
parent f90e4ff5f8
commit e530912744
15 changed files with 753 additions and 686 deletions

View File

@@ -32,7 +32,7 @@ void ColorMatrix::apply(State&) const
if (s_ARB_imaging)
{
glMatrixMode( GL_COLOR );
glLoadMatrixf( _matrix.ptr() );
_matrix.glLoadMatrix();
glMatrixMode( GL_MODELVIEW );
}
}

View File

@@ -171,7 +171,7 @@ void FragmentProgram::apply(State& state) const
++itr)
{
glMatrixMode((*itr).first);
glLoadMatrixf((*itr).second.ptr());
(*itr).second.glLoadMatrix();
}
glMatrixMode(GL_MODELVIEW); // restore matrix mode
}

View File

@@ -15,6 +15,8 @@
#include <osg/Notify>
#include <osg/Math>
#include <osg/GL>
#include <stdlib.h>
using namespace osg;
@@ -35,22 +37,22 @@ using namespace osg;
Matrix::Matrix()
Matrixf::Matrixf()
{
makeIdentity();
}
Matrix::Matrix( const Matrix& other)
Matrixf::Matrixf( const Matrixf& other)
{
set( (const float *) other._mat );
}
Matrix::Matrix( const float * const def )
Matrixf::Matrixf( const float * const def )
{
set( def );
}
Matrix::Matrix( float a00, float a01, float a02, float a03,
Matrixf::Matrixf( float a00, float a01, float a02, float a03,
float a10, float a11, float a12, float a13,
float a20, float a21, float a22, float a23,
float a30, float a31, float a32, float a33)
@@ -61,7 +63,7 @@ Matrix::Matrix( float a00, float a01, float a02, float a03,
SET_ROW(3, a30, a31, a32, a33 )
}
void Matrix::set( float a00, float a01, float a02, float a03,
void Matrixf::set( float a00, float a01, float a02, float a03,
float a10, float a11, float a12, float a13,
float a20, float a21, float a22, float a23,
float a30, float a31, float a32, float a33)
@@ -72,7 +74,7 @@ void Matrix::set( float a00, float a01, float a02, float a03,
SET_ROW(3, a30, a31, a32, a33 )
}
void Matrix::setTrans( float tx, float ty, float tz )
void Matrixf::setTrans( float tx, float ty, float tz )
{
_mat[3][0] = tx;
_mat[3][1] = ty;
@@ -80,14 +82,14 @@ void Matrix::setTrans( float tx, float ty, float tz )
}
void Matrix::setTrans( const Vec3& v )
void Matrixf::setTrans( const Vec3& v )
{
_mat[3][0] = v[0];
_mat[3][1] = v[1];
_mat[3][2] = v[2];
}
void Matrix::makeIdentity()
void Matrixf::makeIdentity()
{
SET_ROW(0, 1, 0, 0, 0 )
SET_ROW(1, 0, 1, 0, 0 )
@@ -95,12 +97,12 @@ void Matrix::makeIdentity()
SET_ROW(3, 0, 0, 0, 1 )
}
void Matrix::makeScale( const Vec3& v )
void Matrixf::makeScale( const Vec3& v )
{
makeScale(v[0], v[1], v[2] );
}
void Matrix::makeScale( float x, float y, float z )
void Matrixf::makeScale( float x, float y, float z )
{
SET_ROW(0, x, 0, 0, 0 )
SET_ROW(1, 0, y, 0, 0 )
@@ -108,12 +110,12 @@ void Matrix::makeScale( float x, float y, float z )
SET_ROW(3, 0, 0, 0, 1 )
}
void Matrix::makeTranslate( const Vec3& v )
void Matrixf::makeTranslate( const Vec3& v )
{
makeTranslate( v[0], v[1], v[2] );
}
void Matrix::makeTranslate( float x, float y, float z )
void Matrixf::makeTranslate( float x, float y, float z )
{
SET_ROW(0, 1, 0, 0, 0 )
SET_ROW(1, 0, 1, 0, 0 )
@@ -121,33 +123,33 @@ void Matrix::makeTranslate( float x, float y, float z )
SET_ROW(3, x, y, z, 1 )
}
void Matrix::makeRotate( const Vec3& from, const Vec3& to )
void Matrixf::makeRotate( const Vec3& from, const Vec3& to )
{
Quat quat;
quat.makeRotate(from,to);
quat.get(*this);
}
void Matrix::makeRotate( float angle, const Vec3& axis )
void Matrixf::makeRotate( float angle, const Vec3& axis )
{
Quat quat;
quat.makeRotate( angle, axis);
quat.get(*this);
}
void Matrix::makeRotate( float angle, float x, float y, float z )
void Matrixf::makeRotate( float angle, float x, float y, float z )
{
Quat quat;
quat.makeRotate( angle, x, y, z);
quat.get(*this);
}
void Matrix::makeRotate( const Quat& q )
void Matrixf::makeRotate( const Quat& q )
{
q.get(*this);
}
void Matrix::makeRotate( float angle1, const Vec3& axis1,
void Matrixf::makeRotate( float angle1, const Vec3& axis1,
float angle2, const Vec3& axis2,
float angle3, const Vec3& axis3)
{
@@ -158,7 +160,7 @@ void Matrix::makeRotate( float angle1, const Vec3& axis1,
quat.get(*this);
}
void Matrix::mult( const Matrix& lhs, const Matrix& rhs )
void Matrixf::mult( const Matrix& lhs, const Matrix& rhs )
{
if (&lhs==this)
{
@@ -191,7 +193,7 @@ void Matrix::mult( const Matrix& lhs, const Matrix& rhs )
_mat[3][3] = INNER_PRODUCT(lhs, rhs, 3, 3);
}
void Matrix::preMult( const Matrix& other )
void Matrixf::preMult( const Matrix& other )
{
// brute force method requiring a copy
//Matrix tmp(other* *this);
@@ -212,7 +214,7 @@ void Matrix::preMult( const Matrix& other )
}
void Matrix::postMult( const Matrix& other )
void Matrixf::postMult( const Matrix& other )
{
// brute force method requiring a copy
//Matrix tmp(*this * other);
@@ -243,7 +245,7 @@ inline T SGL_ABS(T a)
#define SGL_SWAP(a,b,temp) ((temp)=(a),(a)=(b),(b)=(temp))
#endif
bool Matrix::invert( const Matrix& mat )
bool Matrixf::invert( const Matrix& mat )
{
if (&mat==this) {
Matrix tm(mat);
@@ -312,7 +314,7 @@ bool Matrix::invert( const Matrix& mat )
return true;
}
void Matrix::makeOrtho(double left, double right,
void Matrixf::makeOrtho(double left, double right,
double bottom, double top,
double zNear, double zFar)
{
@@ -326,7 +328,7 @@ void Matrix::makeOrtho(double left, double right,
SET_ROW(3, tx, ty, tz, 1.0f )
}
void Matrix::getOrtho(double& left, double& right,
void Matrixf::getOrtho(double& left, double& right,
double& bottom, double& top,
double& zNear, double& zFar)
{
@@ -341,7 +343,7 @@ void Matrix::getOrtho(double& left, double& right,
}
void Matrix::makeFrustum(double left, double right,
void Matrixf::makeFrustum(double left, double right,
double bottom, double top,
double zNear, double zFar)
{
@@ -356,7 +358,7 @@ void Matrix::makeFrustum(double left, double right,
SET_ROW(3, 0.0f, 0.0f, D, 0.0f )
}
void Matrix::getFrustum(double& left, double& right,
void Matrixf::getFrustum(double& left, double& right,
double& bottom, double& top,
double& zNear, double& zFar)
{
@@ -371,7 +373,7 @@ void Matrix::getFrustum(double& left, double& right,
}
void Matrix::makePerspective(double fovy,double aspectRatio,
void Matrixf::makePerspective(double fovy,double aspectRatio,
double zNear, double zFar)
{
// calculate the appropriate left, right etc.
@@ -384,7 +386,7 @@ void Matrix::makePerspective(double fovy,double aspectRatio,
}
void Matrix::makeLookAt(const Vec3& eye,const Vec3& center,const Vec3& up)
void Matrixf::makeLookAt(const Vec3& eye,const Vec3& center,const Vec3& up)
{
Vec3 f(center-eye);
f.normalize();
@@ -399,10 +401,10 @@ void Matrix::makeLookAt(const Vec3& eye,const Vec3& center,const Vec3& up)
s[2], u[2], -f[2], 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
preMult(Matrix::translate(-eye));
preMult(Matrixf::translate(-eye));
}
void Matrix::getLookAt(Vec3& eye,Vec3& center,Vec3& up,float lookDistance)
void Matrixf::getLookAt(Vec3& eye,Vec3& center,Vec3& up,float lookDistance)
{
Matrix inv;
inv.invert(*this);
@@ -413,4 +415,13 @@ void Matrix::getLookAt(Vec3& eye,Vec3& center,Vec3& up,float lookDistance)
center = eye + center*lookDistance;
}
void Matrixf::glLoadMatrix() const
{
glLoadMatrixf((GLfloat*)_mat);
}
void Matrixf::glMultMatrix() const
{
glMultMatrixf((GLfloat*)_mat);
}
#undef SET_ROW

View File

@@ -168,7 +168,7 @@ void DrawShapeVisitor::apply(const Box& box)
if (!box.zeroRotation())
{
Matrix rotation(box.getRotationMatrix());
glMultMatrixf(rotation.ptr());
rotation.glMultMatrix();
}
glBegin(GL_QUADS);
@@ -284,7 +284,7 @@ void DrawShapeVisitor::apply(const Cone& cone)
if (!cone.zeroRotation())
{
Matrix rotation(cone.getRotationMatrix());
glMultMatrixf(rotation.ptr());
rotation.glMultMatrix();
}
// evaluate hints
@@ -402,7 +402,7 @@ void DrawShapeVisitor::apply(const Cylinder& cylinder)
if (!cylinder.zeroRotation())
{
Matrix rotation(cylinder.getRotationMatrix());
glMultMatrixf(rotation.ptr());
rotation.glMultMatrix();
}
// evaluate hints
@@ -568,7 +568,7 @@ void DrawShapeVisitor::apply(const HeightField& field)
if (!field.zeroRotation())
{
Matrix rotation(field.getRotationMatrix());
glMultMatrixf(rotation.ptr());
rotation.glMultMatrix();
}
float dx = field.getXInterval();

View File

@@ -27,6 +27,6 @@ TexMat::~TexMat()
void TexMat::apply(State&) const
{
glMatrixMode( GL_TEXTURE );
glLoadMatrixf( _matrix.ptr() );
glMatrixMode( GL_MODELVIEW ); // fix! GWM Aug 2001
_matrix.glLoadMatrix();
glMatrixMode( GL_MODELVIEW );
}

View File

@@ -171,7 +171,7 @@ void VertexProgram::apply(State& state) const
++itr)
{
glMatrixMode((*itr).first);
glLoadMatrixf((*itr).second.ptr());
(*itr).second.glLoadMatrix();
}
glMatrixMode(GL_MODELVIEW); // restore matrix mode
}

File diff suppressed because it is too large Load Diff

View File

@@ -67,7 +67,7 @@ namespace
osg::Vec3(lightvec.x(), lightvec.y(), lightvec.z()),
eye_light_ref);
glLoadMatrixf((LM * osg::Matrix::inverse(M)).ptr());
(LM * osg::Matrix::inverse(M)).glLoadMatrix();
} else {
glLoadIdentity();

View File

@@ -438,7 +438,11 @@ const osg::Node* OsgCameraGroup::getTopMostSceneData() const
void OsgCameraGroup::setView(const osg::Matrix& matrix)
{
Producer::Matrix pm(matrix.ptr());
Producer::Matrix pm;//(matrix.ptr());
for(int i=0;i<4;++i)
for(int j=0;j<4;++j)
pm(i,j)=matrix(i,j);
setViewByMatrix(pm);
}

View File

@@ -7,15 +7,15 @@ using namespace osgSim;
std::string ScalarBar::ScalarPrinter::printScalar(float scalar)
{
std::stringstream ostr;
ostr<<scalar;
return ostr.str();
std::stringstream ostr;
ostr<<scalar;
return ostr.str();
}
void ScalarBar::setNumColors(int numColors)
{
_numColors = numColors;
createDrawables();
createDrawables();
}
int ScalarBar::getNumColors() const
@@ -26,7 +26,7 @@ int ScalarBar::getNumColors() const
void ScalarBar::setNumLabels(int numLabels)
{
_numLabels = numLabels;
createDrawables();
createDrawables();
}
int ScalarBar::getNumLabels() const
@@ -37,7 +37,7 @@ int ScalarBar::getNumLabels() const
void ScalarBar::setScalarsToColors(ScalarsToColors* stc)
{
_stc = stc;
createDrawables();
createDrawables();
}
const ScalarsToColors* ScalarBar::getScalarsToColors() const
@@ -48,7 +48,7 @@ const ScalarsToColors* ScalarBar::getScalarsToColors() const
void ScalarBar::setTitle(const std::string& title)
{
_title = title;
createDrawables();
createDrawables();
}
std::string ScalarBar::getTitle() const
@@ -59,7 +59,7 @@ std::string ScalarBar::getTitle() const
void ScalarBar::setOrientation(ScalarBar::Orientation orientation)
{
_orientation = orientation;
createDrawables();
createDrawables();
}
ScalarBar::Orientation ScalarBar::getOrientation() const
@@ -70,7 +70,7 @@ ScalarBar::Orientation ScalarBar::getOrientation() const
void ScalarBar::setAspectRatio(float aspectRatio)
{
_aspectRatio = aspectRatio;
createDrawables();
createDrawables();
}
float ScalarBar::getAspectRatio() const
@@ -81,7 +81,7 @@ float ScalarBar::getAspectRatio() const
void ScalarBar::setScalarPrinter(ScalarPrinter* sp)
{
_sp = sp;
createDrawables();
createDrawables();
}
const ScalarBar::ScalarPrinter* ScalarBar::getScalarPrinter() const
@@ -93,7 +93,7 @@ const ScalarBar::ScalarPrinter* ScalarBar::getScalarPrinter() const
void ScalarBar::setTextProperties(const TextProperties& tp)
{
_textProperties = tp;
createDrawables();
createDrawables();
}
const ScalarBar::TextProperties& ScalarBar::getTextProperties() const
@@ -111,14 +111,14 @@ struct MaxCoordLess
MaxCoordLess(Axis axis): _axis(axis) {}
bool operator()(const osgText::Text* d1, const osgText::Text* d2)
{
if(_axis == X_AXIS ) return d1->getBound().xMax() < d2->getBound().xMax();
else if(_axis == Y_AXIS) return d1->getBound().yMax() < d2->getBound().yMax();
else if(_axis == Z_AXIS) return d1->getBound().zMax() < d2->getBound().zMax();
bool operator()(const osgText::Text* d1, const osgText::Text* d2)
{
if(_axis == X_AXIS ) return d1->getBound().xMax() < d2->getBound().xMax();
else if(_axis == Y_AXIS) return d1->getBound().yMax() < d2->getBound().yMax();
else if(_axis == Z_AXIS) return d1->getBound().zMax() < d2->getBound().zMax();
return false;
}
return false;
}
};
struct AlignCentreOnYValue
@@ -126,10 +126,10 @@ struct AlignCentreOnYValue
float _y;
AlignCentreOnYValue(float y): _y(y) {}
void operator()(osgText::Text* t)
{
{
t->setPosition(osg::Vec3(t->getBound().center().x(), _y, t->getBound().center().z()));
t->setAlignment(osgText::Text::CENTER_CENTER);
}
t->setAlignment(osgText::Text::CENTER_CENTER);
}
};
}
@@ -139,162 +139,163 @@ void ScalarBar::createDrawables()
// Remove any existing Drawables
_drawables.erase(_drawables.begin(), _drawables.end());
// 1. First the bar
// =================
// 1. First the bar
// =================
osg::ref_ptr<osg::Geometry> bar = new osg::Geometry();
// Create the bar - created in 'real' coordinate space the moment,
// with xyz values reflecting those of the actual scalar values in play.
// FIXME: Consider positioning at origin! Should be easy enough to do.
// Create the bar - created in 'real' coordinate space the moment,
// with xyz values reflecting those of the actual scalar values in play.
// FIXME: Consider positioning at origin! Should be easy enough to do.
// Vertices
osg::ref_ptr<osg::Vec3Array> vs(new osg::Vec3Array);
vs->reserve(2*(_numColors+1));
// Vertices
osg::ref_ptr<osg::Vec3Array> vs(new osg::Vec3Array);
vs->reserve(2*(_numColors+1));
float incr = (_stc->getMax() - _stc->getMin()) / _numColors;
float arOffset;
if(_orientation==HORIZONTAL)
{
arOffset = _numColors * incr * _aspectRatio; // Bar height for a horizontal bar
}
else
{
float arOffset;
if(_orientation==HORIZONTAL)
{
arOffset = _numColors * incr * _aspectRatio; // Bar height for a horizontal bar
}
else
{
arOffset = (_numColors*incr)/_aspectRatio; // Bar width for a vertical bar
}
}
for(int i=1; i<=_numColors; ++i)
{
// Make a quad
if(_orientation==HORIZONTAL)
{
vs->push_back(osg::Vec3(_stc->getMin() + (i-1) * incr, 0.0f, 0.0f));
vs->push_back(osg::Vec3(_stc->getMin() + (i-1) * incr, arOffset, 0.0f));
vs->push_back(osg::Vec3(_stc->getMin() + i * incr, arOffset, 0.0f));
vs->push_back(osg::Vec3(_stc->getMin() + i * incr, 0.0f, 0.0f));
}
else
{
vs->push_back(osg::Vec3(0.0f, _stc->getMin() + (i-1) * incr, 0.0f));
vs->push_back(osg::Vec3(arOffset, _stc->getMin() + (i-1) * incr, 0.0f));
vs->push_back(osg::Vec3(arOffset, _stc->getMin() + i * incr, 0.0f));
vs->push_back(osg::Vec3(0.0f, _stc->getMin() + i * incr, 0.0f));
}
}
bar->setVertexArray(vs.get());
int i;
for(i=1; i<=_numColors; ++i)
{
// Make a quad
if(_orientation==HORIZONTAL)
{
vs->push_back(osg::Vec3(_stc->getMin() + (i-1) * incr, 0.0f, 0.0f));
vs->push_back(osg::Vec3(_stc->getMin() + (i-1) * incr, arOffset, 0.0f));
vs->push_back(osg::Vec3(_stc->getMin() + i * incr, arOffset, 0.0f));
vs->push_back(osg::Vec3(_stc->getMin() + i * incr, 0.0f, 0.0f));
}
else
{
vs->push_back(osg::Vec3(0.0f, _stc->getMin() + (i-1) * incr, 0.0f));
vs->push_back(osg::Vec3(arOffset, _stc->getMin() + (i-1) * incr, 0.0f));
vs->push_back(osg::Vec3(arOffset, _stc->getMin() + i * incr, 0.0f));
vs->push_back(osg::Vec3(0.0f, _stc->getMin() + i * incr, 0.0f));
}
}
bar->setVertexArray(vs.get());
// Colours
osg::ref_ptr<osg::Vec4Array> cs(new osg::Vec4Array);
cs->reserve(_numColors);
const float halfIncr = incr*0.5;
for(int i=0; i<_numColors; ++i)
{
// We add half an increment to the color look-up to get the color
// square in the middle of the 'block'.
cs->push_back(_stc->getColor(_stc->getMin() + (i*incr) + halfIncr));
}
bar->setColorArray(cs.get());
bar->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);
const float halfIncr = incr*0.5;
for(i=0; i<_numColors; ++i)
{
// We add half an increment to the color look-up to get the color
// square in the middle of the 'block'.
cs->push_back(_stc->getColor(_stc->getMin() + (i*incr) + halfIncr));
}
bar->setColorArray(cs.get());
bar->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);
// Normal
// Normal
osg::ref_ptr<osg::Vec3Array> ns(new osg::Vec3Array);
ns->push_back(osg::Vec3(0.0f,0.0f,1.0f));
bar->setNormalArray(ns.get());
bar->setNormalBinding(osg::Geometry::BIND_OVERALL);
bar->setNormalArray(ns.get());
bar->setNormalBinding(osg::Geometry::BIND_OVERALL);
// The Quad strip that represents the bar
bar->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,vs->size()));
// The Quad strip that represents the bar
bar->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,vs->size()));
addDrawable(bar.get());
// 2. Then the text labels
// =======================
// =======================
// Check the character size, if it's 0, estimate a good character size
float characterSize = _textProperties._characterSize;
if(characterSize == 0) characterSize = ((_stc->getMax()-_stc->getMin())*0.3)/_numLabels;
if(characterSize == 0) characterSize = ((_stc->getMax()-_stc->getMin())*0.3)/_numLabels;
osgText::Font* font = osgText::readFontFile(_textProperties._fontFile.c_str());
osgText::Font* font = osgText::readFontFile(_textProperties._fontFile.c_str());
std::vector<osgText::Text*> texts(_numLabels); // We'll need to collect pointers to these for later
std::vector<osgText::Text*> texts(_numLabels); // We'll need to collect pointers to these for later
float labelIncr = (_stc->getMax()-_stc->getMin())/(_numLabels-1);
for(int i=0; i<_numLabels; ++i)
{
for(i=0; i<_numLabels; ++i)
{
osgText::Text* text = new osgText::Text;
text->setFont(font);
text->setColor(_textProperties._color);
text->setFontResolution(_textProperties._fontResolution.first,_textProperties._fontResolution.second);
text->setCharacterSize(characterSize);
text->setText(_sp->printScalar(_stc->getMin()+(i*labelIncr)));
text->setCharacterSize(characterSize);
text->setText(_sp->printScalar(_stc->getMin()+(i*labelIncr)));
if(_orientation == HORIZONTAL)
{
if(_orientation == HORIZONTAL)
{
text->setPosition(osg::Vec3(_stc->getMin() + (i*labelIncr), arOffset, 0.0f));
text->setAlignment(osgText::Text::CENTER_BOTTOM);
}
else
{
text->setAlignment(osgText::Text::CENTER_BOTTOM);
}
else
{
text->setPosition(osg::Vec3(arOffset, _stc->getMin() + (i*labelIncr), 0.0f));
text->setAlignment(osgText::Text::LEFT_CENTER);
}
addDrawable(text);
texts[i] = text;
}
// Make sure the text labels are all properly aligned - different words will have a different
// vertical alignment depending on the letters used in the labels. E.g. a 'y' has a dangling tail.
if(_orientation == HORIZONTAL)
{
std::vector<osgText::Text*>::iterator maxYIt = std::max_element(texts.begin(), texts.end(), MaxCoordLess(MaxCoordLess::Y_AXIS));
std::for_each(texts.begin(), texts.end(), AlignCentreOnYValue((*maxYIt)->getBound().center().y()));
}
// 3. And finally the title
// ========================
if(_title != "")
{
osgText::Text* text = new osgText::Text;
text->setFont(font);
text->setColor(_textProperties._color);
text->setFontResolution(_textProperties._fontResolution.first,_textProperties._fontResolution.second);
text->setCharacterSize(characterSize);
text->setText(_title);
if(_orientation==HORIZONTAL)
{
// Horizontal bars have the title above the scalar bar and the labels.
// Need to move the title above any labels, using maximum y value of the
// existing text objects
std::vector<osgText::Text*>::iterator maxYIt = std::max_element(texts.begin(), texts.end(), MaxCoordLess(MaxCoordLess::Y_AXIS));
float titleY;
if(maxYIt != texts.end()) titleY = (*maxYIt)->getBound().yMax() * 1.1f;
else titleY = arOffset; // No labels, so just use arOffset
// Position the title at the middle of the bar above any labels.
text->setPosition(osg::Vec3(_stc->getMin() + ((_stc->getMax()-_stc->getMin())/2.0f), titleY, 0.0f));
text->setAlignment(osgText::Text::CENTER_BOTTOM);
}
else if(_orientation==VERTICAL)
{
// Vertical bars have the title to the right of the scalar bar and the labels.
// Need to move the title out beyond any labels, using the maximum x value of the
// existing text objects
std::vector<osgText::Text*>::iterator maxXIt = std::max_element(texts.begin(), texts.end(), MaxCoordLess(MaxCoordLess::X_AXIS));
float titleX;
if(maxXIt != texts.end()) titleX = (*maxXIt)->getBound().xMax() * 1.1f;
else titleX = arOffset; // No labels, so just use arOffset
// Position the title in the at the middle of the bar, to the right of any labels.
text->setPosition(osg::Vec3(titleX, _stc->getMin() + ((_stc->getMax()-_stc->getMin())/2.0f), 0.0f));
text->setAlignment(osgText::Text::LEFT_CENTER);
text->setAlignment(osgText::Text::LEFT_CENTER);
}
addDrawable(text);
}
addDrawable(text);
texts[i] = text;
}
// Make sure the text labels are all properly aligned - different words will have a different
// vertical alignment depending on the letters used in the labels. E.g. a 'y' has a dangling tail.
if(_orientation == HORIZONTAL)
{
std::vector<osgText::Text*>::iterator maxYIt = std::max_element(texts.begin(), texts.end(), MaxCoordLess(MaxCoordLess::Y_AXIS));
std::for_each(texts.begin(), texts.end(), AlignCentreOnYValue((*maxYIt)->getBound().center().y()));
}
// 3. And finally the title
// ========================
if(_title != "")
{
osgText::Text* text = new osgText::Text;
text->setFont(font);
text->setColor(_textProperties._color);
text->setFontResolution(_textProperties._fontResolution.first,_textProperties._fontResolution.second);
text->setCharacterSize(characterSize);
text->setText(_title);
if(_orientation==HORIZONTAL)
{
// Horizontal bars have the title above the scalar bar and the labels.
// Need to move the title above any labels, using maximum y value of the
// existing text objects
std::vector<osgText::Text*>::iterator maxYIt = std::max_element(texts.begin(), texts.end(), MaxCoordLess(MaxCoordLess::Y_AXIS));
float titleY;
if(maxYIt != texts.end()) titleY = (*maxYIt)->getBound().yMax() * 1.1f;
else titleY = arOffset; // No labels, so just use arOffset
// Position the title at the middle of the bar above any labels.
text->setPosition(osg::Vec3(_stc->getMin() + ((_stc->getMax()-_stc->getMin())/2.0f), titleY, 0.0f));
text->setAlignment(osgText::Text::CENTER_BOTTOM);
}
else if(_orientation==VERTICAL)
{
// Vertical bars have the title to the right of the scalar bar and the labels.
// Need to move the title out beyond any labels, using the maximum x value of the
// existing text objects
std::vector<osgText::Text*>::iterator maxXIt = std::max_element(texts.begin(), texts.end(), MaxCoordLess(MaxCoordLess::X_AXIS));
float titleX;
if(maxXIt != texts.end()) titleX = (*maxXIt)->getBound().xMax() * 1.1f;
else titleX = arOffset; // No labels, so just use arOffset
// Position the title in the at the middle of the bar, to the right of any labels.
text->setPosition(osg::Vec3(titleX, _stc->getMin() + ((_stc->getMax()-_stc->getMin())/2.0f), 0.0f));
text->setAlignment(osgText::Text::LEFT_CENTER);
}
addDrawable(text);
}
}

View File

@@ -431,7 +431,8 @@ void SphereSegment::EdgeLine_drawImplementation(osg::State& /* state */) const
// Top edge
glBegin(GL_LINE_STRIP);
for(int i=0; i<=_density; i++)
int i;
for(i=0; i<=_density; i++)
{
float az = _azMin + (i*azIncr);
glVertex3f(
@@ -443,7 +444,7 @@ void SphereSegment::EdgeLine_drawImplementation(osg::State& /* state */) const
// Bottom edge
glBegin(GL_LINE_STRIP);
for(int i=0; i<=_density; i++)
for(i=0; i<=_density; i++)
{
float az = _azMin + (i*azIncr);
glVertex3f(
@@ -455,7 +456,8 @@ void SphereSegment::EdgeLine_drawImplementation(osg::State& /* state */) const
// Left edge
glBegin(GL_LINE_STRIP);
for(int j=0; j<=_density; j++)
int j;
for(j=0; j<=_density; j++)
{
float elev = _elevMin + (j*elevIncr);
glVertex3f(
@@ -467,7 +469,7 @@ void SphereSegment::EdgeLine_drawImplementation(osg::State& /* state */) const
// Right edge
glBegin(GL_LINE_STRIP);
for(int j=0; j<=_density; j++)
for(j=0; j<=_density; j++)
{
float elev = _elevMin + (j*elevIncr);
glVertex3f(
@@ -487,7 +489,8 @@ bool SphereSegment::EdgeLine_computeBound(osg::BoundingBox& bbox) const
float elevIncr = (_elevMax - _elevMin)/_density;
// Top edge
for(int i=0; i<=_density; i++)
int i;
for(i=0; i<=_density; i++)
{
float az = _azMin + (i*azIncr);
bbox.expandBy(
@@ -497,7 +500,7 @@ bool SphereSegment::EdgeLine_computeBound(osg::BoundingBox& bbox) const
}
// Bottom edge
for(int i=0; i<=_density; i++)
for(i=0; i<=_density; i++)
{
float az = _azMin + (i*azIncr);
bbox.expandBy(
@@ -507,7 +510,8 @@ bool SphereSegment::EdgeLine_computeBound(osg::BoundingBox& bbox) const
}
// Left edge
for(int j=0; j<=_density; j++)
int j;
for(j=0; j<=_density; j++)
{
float elev = _elevMin + (j*elevIncr);
bbox.expandBy(
@@ -517,7 +521,7 @@ bool SphereSegment::EdgeLine_computeBound(osg::BoundingBox& bbox) const
}
// Right edge
for(int j=0; j<=_density; j++)
for(j=0; j<=_density; j++)
{
float elev = _elevMin + (j*elevIncr);
bbox.expandBy(

View File

@@ -153,9 +153,12 @@ float CullVisitor::getDistanceToEyePoint(const Vec3& pos, bool withLODScale) con
else return (pos-getEyeLocal()).length();
}
inline float distance(const osg::Vec3& coord,const osg::Matrix& matrix)
inline CullVisitor::NearFarReal distance(const osg::Vec3& coord,const osg::Matrix& matrix)
{
return -(coord[0]*matrix(0,2)+coord[1]*matrix(1,2)+coord[2]*matrix(2,2)+matrix(3,2));
//std::cout << "distance("<<coord<<", "<<matrix<<")"<<std::endl;
return -((CullVisitor::NearFarReal)coord[0]*(CullVisitor::NearFarReal)matrix(0,2)+(CullVisitor::NearFarReal)coord[1]*(CullVisitor::NearFarReal)matrix(1,2)+(CullVisitor::NearFarReal)coord[2]*(CullVisitor::NearFarReal)matrix(2,2)+matrix(3,2));
}
float CullVisitor::getDistanceFromEyePoint(const osg::Vec3& pos, bool withLODScale) const
@@ -181,9 +184,9 @@ void CullVisitor::popProjectionMatrix()
{
//std::cout << "Orthographic projection "<<projection<<std::endl;
double span = (_computed_zfar-_computed_znear);
double desired_znear = _computed_znear - span*0.02f;
double desired_zfar = _computed_zfar + span*0.02f;
NearFarReal span = (_computed_zfar-_computed_znear);
NearFarReal desired_znear = _computed_znear - span*0.02f;
NearFarReal desired_zfar = _computed_zfar + span*0.02f;
// near plane clamping.
//double min_near_plane = _computed_zfar*_nearFarRatio;
@@ -205,23 +208,32 @@ void CullVisitor::popProjectionMatrix()
//std::cout << "Perspective projection "<<projection<<std::endl;
double desired_znear = _computed_znear *0.98f;
double desired_zfar = _computed_zfar *1.02f;
std::cout << "_computed_znear"<<_computed_znear<<std::endl;
std::cout << "_computed_zfar"<<_computed_zfar<<std::endl;
NearFarReal desired_znear = _computed_znear *0.98;
NearFarReal desired_zfar = _computed_zfar *1.02;
// NearFarReal desired_znear = _computed_znear *0.5;
// NearFarReal desired_zfar = _computed_zfar *2.0;
// near plane clamping.
double min_near_plane = _computed_zfar*_nearFarRatio;
if (desired_znear<min_near_plane) desired_znear=min_near_plane;
std::cout << " desired_znear"<<desired_znear<<std::endl;
std::cout << " desired_zfar"<<desired_zfar<<std::endl;
// assign the clamped values back to the computed values.
_computed_znear = desired_znear;
_computed_zfar = desired_zfar;
double trans_near_plane = (-desired_znear*projection(2,2)+projection(3,2))/(-desired_znear*projection(2,3)+projection(3,3));
double trans_far_plane = (-desired_zfar*projection(2,2)+projection(3,2))/(-desired_zfar*projection(2,3)+projection(3,3));
double ratio = fabs(2.0f/(trans_near_plane-trans_far_plane));
double center = -(trans_near_plane+trans_far_plane)/2.0f;
NearFarReal trans_near_plane = (-desired_znear*projection(2,2)+projection(3,2))/(-desired_znear*projection(2,3)+projection(3,3));
NearFarReal trans_far_plane = (-desired_zfar*projection(2,2)+projection(3,2))/(-desired_zfar*projection(2,3)+projection(3,3));
NearFarReal ratio = fabs(2.0/(trans_near_plane-trans_far_plane));
NearFarReal center = -(trans_near_plane+trans_far_plane)/2.0;
projection.postMult(osg::Matrix(1.0f,0.0f,0.0f,0.0f,
0.0f,1.0f,0.0f,0.0f,
0.0f,0.0f,ratio,0.0f,
@@ -236,26 +248,36 @@ void CullVisitor::popProjectionMatrix()
void CullVisitor::updateCalculatedNearFar(const osg::Matrix& matrix,const osg::BoundingBox& bb)
{
float d_near = distance(bb.corner(_bbCornerNear),matrix);
float d_far = distance(bb.corner(_bbCornerFar),matrix);
if (d_near<=d_far)
{
if (d_near<_computed_znear) _computed_znear = d_near;
if (d_far>_computed_zfar) _computed_zfar = d_far;
}
else
{
if ( !EQUAL_F(d_near, d_far) )
{
osg::notify(osg::WARN)<<"Warning: CullVisitor::updateCalculatedNearFar(.) near>far in range calculation,"<< std::endl;
osg::notify(osg::WARN)<<" correcting by swapping values d_near="<<d_near<<" dfar="<<d_far<< std::endl;
}
// note, need to reverse the d_near/d_far association because they are
// the wrong way around...
if (d_far<_computed_znear) _computed_znear = d_far;
if (d_near>_computed_zfar) _computed_zfar = d_near;
}
updateCalculatedNearFar(bb.corner(0));
updateCalculatedNearFar(bb.corner(1));
updateCalculatedNearFar(bb.corner(2));
updateCalculatedNearFar(bb.corner(3));
updateCalculatedNearFar(bb.corner(4));
updateCalculatedNearFar(bb.corner(5));
updateCalculatedNearFar(bb.corner(6));
updateCalculatedNearFar(bb.corner(7));
//
// NearFarReal d_near = distance(bb.corner(_bbCornerNear),matrix);
// NearFarReal d_far = distance(bb.corner(_bbCornerFar),matrix);
//
// if (d_near<=d_far)
// {
// if (d_near<_computed_znear) _computed_znear = d_near;
// if (d_far>_computed_zfar) _computed_zfar = d_far;
// }
// else
// {
// if ( !EQUAL_F(d_near, d_far) )
// {
// osg::notify(osg::WARN)<<"Warning: CullVisitor::updateCalculatedNearFar(.) near>far in range calculation,"<< std::endl;
// osg::notify(osg::WARN)<<" correcting by swapping values d_near="<<d_near<<" dfar="<<d_far<< std::endl;
// }
// // note, need to reverse the d_near/d_far association because they are
// // the wrong way around...
// if (d_far<_computed_znear) _computed_znear = d_far;
// if (d_near>_computed_zfar) _computed_zfar = d_near;
// }
}
void CullVisitor::updateCalculatedNearFar(const osg::Vec3& pos)