#endif
#include <simgear/compiler.h>
-#include <vector>
+#include <simgear/structure/exception.hxx>
-#include <plib/sg.h>
+#include <vector>
#include <Cockpit/panel.hxx>
#include <Cockpit/panel_io.hxx>
#include "panelnode.hxx"
-SG_USING_STD(vector);
+using std::vector;
// Static (!) handling for all 3D panels in the program.
// Make an FGPanel object. But *don't* call init() or bind() on
// it -- those methods touch static state.
- _panel = fgReadPanel(props->getStringValue("path"));
+ const char *path = props->getStringValue("path");
+ _panel = fgReadPanel(path);
+ if (!_panel)
+ throw sg_io_exception(string("Failed to load panel ") + path);
// Never mind. We *have* to call init to make sure the static
// state is initialized (it's not, if there aren't any 2D
m(1,i) *= 1.0/_ymax;
}
+ _lastViewport[0] = 0;
+ _lastViewport[1] = 0;
+ _lastViewport[2] = 0;
+ _lastViewport[3] = 0;
+
dirtyBound();
// All done. Add us to the list
// coordinates to panel coordinates when the user clicks the
// mouse.
// OSGFIXME: we don't need that when we can really pick
- const_cast<osg::Matrix&>(_lastModelview) = state.getModelViewMatrix();
- const_cast<osg::Matrix&>(_lastProjection) = state.getProjectionMatrix();
- state.getCurrentViewport()->getViewport(const_cast<int&>(_lastViewport[0]),
- const_cast<int&>(_lastViewport[1]),
- const_cast<int&>(_lastViewport[2]),
- const_cast<int&>(_lastViewport[3]));
+ _lastModelview = state.getModelViewMatrix();
+ _lastProjection = state.getProjectionMatrix();
+
+ const osg::Viewport* vp = state.getCurrentViewport();
+ _lastViewport[0] = vp->x();
+ _lastViewport[1] = vp->y();
+ _lastViewport[2] = vp->width();
+ _lastViewport[3] = vp->height();
_panel->draw(state);
}
bool FGPanelNode::doMouseAction(int button, int updown, int x, int y)
{
+ if (_lastViewport[2] == 0 || _lastViewport[3] == 0) {
+ // we haven't been drawn yet, presumably
+ return false;
+ }
+
// Covert the screen coordinates to viewport coordinates in the
// range [0:1], then transform to OpenGL "post projection" coords
// in [-1:1]. Remember the difference in Y direction!