Syd Adams:
- Well I finally licked it, the clipping works great now, in 16 and 32 bpp mode, on 2d and 3d panels. - I tried glScissors, didnt work because clipping was done in screen co-ordinates. - Stencil buffer methods worked great for 2d panel, but messed up 3d panels,(depth buffer problems I think), and only worked in 32 bpp mode. - I then tried clip planes , and so far it appears to work with no problem, and no framerate drop like I had with the stencil buffer method... I'm attaching the panel.cxx file for testing...
This commit is contained in:
parent
789779d532
commit
2c193be0ca
1 changed files with 30 additions and 4 deletions
|
@ -65,7 +65,7 @@
|
||||||
// The number of polygon-offset "units" to place between layers. In
|
// The number of polygon-offset "units" to place between layers. In
|
||||||
// principle, one is supposed to be enough. In practice, I find that
|
// principle, one is supposed to be enough. In practice, I find that
|
||||||
// my hardware/driver requires many more.
|
// my hardware/driver requires many more.
|
||||||
#define POFF_UNITS 4
|
#define POFF_UNITS 8
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// Local functions.
|
// Local functions.
|
||||||
|
@ -419,17 +419,46 @@ FGPanel::draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the instruments.
|
// Draw the instruments.
|
||||||
|
// Syd Adams: added instrument clipping
|
||||||
instrument_list_type::const_iterator current = _instruments.begin();
|
instrument_list_type::const_iterator current = _instruments.begin();
|
||||||
instrument_list_type::const_iterator end = _instruments.end();
|
instrument_list_type::const_iterator end = _instruments.end();
|
||||||
|
|
||||||
|
GLdouble blx[4]={1.0,0.0,0.0,0.0};
|
||||||
|
GLdouble bly[4]={0.0,1.0,0.0,0.0};
|
||||||
|
GLdouble urx[4]={-1.0,0.0,0.0,0.0};
|
||||||
|
GLdouble ury[4]={0.0,-1.0,0.0,0.0};
|
||||||
|
|
||||||
for ( ; current != end; current++) {
|
for ( ; current != end; current++) {
|
||||||
FGPanelInstrument * instr = *current;
|
FGPanelInstrument * instr = *current;
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslated(instr->getXPos(), instr->getYPos(), 0);
|
glTranslated(instr->getXPos(), instr->getYPos(), 0);
|
||||||
|
|
||||||
|
int ix= instr->getWidth();
|
||||||
|
int iy= instr->getHeight();
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslated(-ix/2,-iy/2,0);
|
||||||
|
glClipPlane(GL_CLIP_PLANE0,blx);
|
||||||
|
glClipPlane(GL_CLIP_PLANE1,bly);
|
||||||
|
glEnable(GL_CLIP_PLANE0);
|
||||||
|
glEnable(GL_CLIP_PLANE1);
|
||||||
|
|
||||||
|
glTranslated(ix,iy,0);
|
||||||
|
glClipPlane(GL_CLIP_PLANE2,urx);
|
||||||
|
glClipPlane(GL_CLIP_PLANE3,ury);
|
||||||
|
glEnable(GL_CLIP_PLANE2);
|
||||||
|
glEnable(GL_CLIP_PLANE3);
|
||||||
|
glPopMatrix();
|
||||||
instr->draw();
|
instr->draw();
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glDisable(GL_CLIP_PLANE0);
|
||||||
|
glDisable(GL_CLIP_PLANE1);
|
||||||
|
glDisable(GL_CLIP_PLANE2);
|
||||||
|
glDisable(GL_CLIP_PLANE3);
|
||||||
|
|
||||||
|
|
||||||
// Draw yellow "hotspots" if directed to. This is a panel authoring
|
// Draw yellow "hotspots" if directed to. This is a panel authoring
|
||||||
// feature; not intended to be high performance or to look good.
|
// feature; not intended to be high performance or to look good.
|
||||||
if ( fgGetBool("/sim/panel-hotspots") ) {
|
if ( fgGetBool("/sim/panel-hotspots") ) {
|
||||||
|
@ -1174,6 +1203,3 @@ FGSwitchLayer::draw ()
|
||||||
|
|
||||||
|
|
||||||
// end of panel.cxx
|
// end of panel.cxx
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue