diff --git a/simgear/math/Makefile.am b/simgear/math/Makefile.am index e82e15f1..4418aebf 100644 --- a/simgear/math/Makefile.am +++ b/simgear/math/Makefile.am @@ -10,7 +10,7 @@ SGMathTest_LDADD = \ $(top_builddir)/simgear/debug/libsgdebug.a \ $(top_builddir)/simgear/structure/libsgstructure.a \ $(base_LIBS) - + SGGeometryTest_SOURCES = SGGeometryTest.cxx SGGeometryTest_LDADD = \ @@ -18,7 +18,7 @@ SGGeometryTest_LDADD = \ $(top_builddir)/simgear/debug/libsgdebug.a \ $(top_builddir)/simgear/structure/libsgstructure.a \ $(base_LIBS) - + lib_LIBRARIES = libsgmath.a include_HEADERS = \ @@ -50,13 +50,15 @@ include_HEADERS = \ SGVec2.hxx \ SGVec3.hxx \ SGVec4.hxx \ - beziercurve.hxx + beziercurve.hxx \ + project.hxx libsgmath_a_SOURCES = \ interpolater.cxx \ leastsqs.cxx \ sg_random.c \ SGGeod.cxx \ - SGGeodesy.cxx + SGGeodesy.cxx \ + project.cxx INCLUDES = -I$(top_srcdir) diff --git a/simgear/math/project.cxx b/simgear/math/project.cxx new file mode 100644 index 00000000..f1c2b143 --- /dev/null +++ b/simgear/math/project.cxx @@ -0,0 +1,43 @@ +// Copyright (C) 2010 Tim Moore moore@bricoworks.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library 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 +// Library 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. +// + +#include "project.hxx" + +#include +#include + +namespace simgear +{ +GLint project(GLdouble objX, GLdouble objY, GLdouble objZ, + const GLdouble *model, const GLdouble *proj, const GLint *view, + GLdouble* winX, GLdouble* winY, GLdouble* winZ) +{ + using namespace osg; + Vec4d obj(objX, objY, objZ, 1.0); + Matrixd Mmodel(model), Mproj(proj); + Matrixd Mwin = (Matrixd::translate(1.0, 1.0, 1.0) + * Matrixd::scale(0.5 * view[2], 0.5 * view[3], 0.5) + * Matrixd::translate(view[0], view[1], 0.0)); + Vec4d result = obj * Mmodel * Mproj * Mwin; + if (equivalent(result.w(), 0.0)) + return GL_FALSE; + result = result / result.w(); + *winX = result.x(); *winY = result.y(); *winZ = result.z(); + return GL_TRUE; +} + +} diff --git a/simgear/math/project.hxx b/simgear/math/project.hxx new file mode 100644 index 00000000..40353a2d --- /dev/null +++ b/simgear/math/project.hxx @@ -0,0 +1,29 @@ +// Copyright (C) 2010 Tim Moore moore@bricoworks.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library 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 +// Library 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. +// +#ifndef SIMGEAR_PROJECT_HXX +#define SIMGEAR_PROJECT_HXX 1 +#include + +namespace simgear +{ +// Replacement for gluProject. OSG doesn't link in GLU anymore. +extern GLint project(GLdouble objX, GLdouble objY, GLdouble objZ, + const GLdouble *model, const GLdouble *proj, + const GLint *view, + GLdouble* winX, GLdouble* winY, GLdouble* winZ); +} +#endif diff --git a/simgear/screen/tr.cxx b/simgear/screen/tr.cxx index 6c191a3d..f1ff29df 100644 --- a/simgear/screen/tr.cxx +++ b/simgear/screen/tr.cxx @@ -144,7 +144,7 @@ #include #endif -#include +#include #include "tr.h" @@ -541,7 +541,6 @@ int trEndTile(TRcontext *tr) return 1; } - /* * Replacement for glRastePos3f() which avoids the problem with invalid * raster pos. @@ -566,7 +565,8 @@ void trRasterPos3f(TRcontext *tr, GLfloat x, GLfloat y, GLfloat z) viewport[3] = tr->CurrentTileHeight; /* Project object coord to window coordinate */ - if (gluProject(x, y, z, modelview, proj, viewport, &winX, &winY, &winZ)){ + if (simgear::project(x, y, z, modelview, proj, viewport, + &winX, &winY, &winZ)){ /* set raster pos to window coord (0,0) */ glMatrixMode(GL_MODELVIEW);