2001-10-22 05:27:40 +08:00
|
|
|
#include <osg/TexGen>
|
|
|
|
#include <osg/Notify>
|
2001-01-11 00:32:10 +08:00
|
|
|
|
|
|
|
using namespace osg;
|
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
TexGen::TexGen()
|
2001-01-11 00:32:10 +08:00
|
|
|
{
|
|
|
|
_mode = OBJECT_LINEAR;
|
2001-09-20 05:08:56 +08:00
|
|
|
_plane_s.set(1.0f, 0.0f, 0.0f, 0.0f);
|
|
|
|
_plane_t.set(0.0f, 1.0f, 0.0f, 0.0f);
|
|
|
|
_plane_r.set(0.0f, 0.0f, 1.0f, 0.0f);
|
|
|
|
_plane_q.set(0.0f, 0.0f, 0.0f, 1.0f);
|
2001-01-11 00:32:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
TexGen::~TexGen()
|
2001-01-11 00:32:10 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-11-21 23:35:51 +08:00
|
|
|
void TexGen::setPlane(Coord which, const Plane& plane)
|
2001-01-11 00:32:10 +08:00
|
|
|
{
|
2001-09-20 05:08:56 +08:00
|
|
|
switch( which )
|
|
|
|
{
|
|
|
|
case S : _plane_s = plane; break;
|
|
|
|
case T : _plane_t = plane; break;
|
|
|
|
case R : _plane_r = plane; break;
|
|
|
|
case Q : _plane_q = plane; break;
|
2001-12-15 07:18:28 +08:00
|
|
|
default : notify(WARN)<<"Error: invalid 'which' passed TexGen::setPlane("<<(unsigned int)which<<","<<plane<<")"<<std::endl; break;
|
2001-09-20 05:08:56 +08:00
|
|
|
}
|
2001-01-11 00:32:10 +08:00
|
|
|
}
|
|
|
|
|
2002-11-21 23:35:51 +08:00
|
|
|
const Plane& TexGen::getPlane(Coord which) const
|
|
|
|
{
|
|
|
|
switch( which )
|
|
|
|
{
|
|
|
|
case S : return _plane_s;
|
|
|
|
case T : return _plane_t;
|
|
|
|
case R : return _plane_r;
|
|
|
|
case Q : return _plane_q;
|
|
|
|
default : notify(WARN)<<"Error: invalid 'which' passed TexGen::getPlane(which)"<<std::endl; return _plane_r;
|
|
|
|
}
|
|
|
|
}
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2002-11-21 23:35:51 +08:00
|
|
|
Plane& TexGen::getPlane(Coord which)
|
2001-01-11 00:32:10 +08:00
|
|
|
{
|
2001-09-20 05:08:56 +08:00
|
|
|
switch( which )
|
2001-01-11 00:32:10 +08:00
|
|
|
{
|
2001-09-20 05:08:56 +08:00
|
|
|
case S : return _plane_s;
|
|
|
|
case T : return _plane_t;
|
|
|
|
case R : return _plane_r;
|
|
|
|
case Q : return _plane_q;
|
2001-12-15 07:18:28 +08:00
|
|
|
default : notify(WARN)<<"Error: invalid 'which' passed TexGen::getPlane(which)"<<std::endl; return _plane_r;
|
2001-01-11 00:32:10 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
void TexGen::apply(State&) const
|
2001-01-11 00:32:10 +08:00
|
|
|
{
|
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
if (_mode == OBJECT_LINEAR)
|
2001-01-11 00:32:10 +08:00
|
|
|
{
|
2001-09-20 05:08:56 +08:00
|
|
|
glTexGenfv(GL_S, GL_OBJECT_PLANE, _plane_s.ptr());
|
|
|
|
glTexGenfv(GL_T, GL_OBJECT_PLANE, _plane_t.ptr());
|
|
|
|
glTexGenfv(GL_R, GL_OBJECT_PLANE, _plane_r.ptr());
|
|
|
|
glTexGenfv(GL_Q, GL_OBJECT_PLANE, _plane_q.ptr());
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_Q, GL_TEXTURE_GEN_MODE, _mode );
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
// note, R & Q will be disabled so R&Q settings won't
|
|
|
|
// have an effect, see above comment in enable(). RO.
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
}
|
|
|
|
else if (_mode == EYE_LINEAR)
|
|
|
|
{
|
|
|
|
glTexGenfv(GL_S, GL_EYE_PLANE, _plane_s.ptr());
|
|
|
|
glTexGenfv(GL_T, GL_EYE_PLANE, _plane_t.ptr());
|
|
|
|
glTexGenfv(GL_R, GL_EYE_PLANE, _plane_r.ptr());
|
|
|
|
glTexGenfv(GL_Q, GL_EYE_PLANE, _plane_q.ptr());
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_Q, GL_TEXTURE_GEN_MODE, _mode );
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
// note, R & Q will be disabled so R&Q settings won't
|
|
|
|
// have an effect, see above comment in enable(). RO.
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2002-03-19 07:10:33 +08:00
|
|
|
}
|
|
|
|
else if (_mode == NORMAL_MAP)
|
|
|
|
{
|
|
|
|
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
// glTexGeni( GL_Q, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
}
|
|
|
|
else if (_mode == REFLECTION_MAP)
|
|
|
|
{
|
|
|
|
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
// glTexGeni( GL_Q, GL_TEXTURE_GEN_MODE, _mode );
|
2001-09-20 05:08:56 +08:00
|
|
|
}
|
|
|
|
else // SPHERE_MAP
|
|
|
|
{
|
|
|
|
// We ignore the planes if we are not in OBJECT_ or EYE_LINEAR mode.
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
// Also don't set the mode of GL_R & GL_Q as these will generate
|
|
|
|
// GL_INVALID_ENUM (See OpenGL Refrence Guide, glTexGEn.)
|
2001-01-11 00:32:10 +08:00
|
|
|
|
2001-09-20 05:08:56 +08:00
|
|
|
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, _mode );
|
|
|
|
}
|
2001-01-11 00:32:10 +08:00
|
|
|
|
|
|
|
}
|