#include "TEveLegoOverlay.h"
#include "TEveCalo.h"
#include "TEveCaloData.h"
#include <TGLRnrCtx.h>
#include <TGLIncludes.h>
#include <TGLSelectRecord.h>
#include <TGLUtil.h>
#include <TGLCamera.h>
#include <THLimitsFinder.h>
ClassImp(TEveLegoOverlay);
TEveLegoOverlay::TEveLegoOverlay() :
TGLOverlayElement(),
TEveElementList("Lego Menu", "TEveLegoOverlay", kTRUE),
fCalo(0),
fActiveID(-1),
fActiveCol(kRed-4),
fMenuW(0.08),
fButtonW(0.5),
fSliderH(0.6),
fSliderPosY(0.15),
fShowSlider(kFALSE),
fSliderVal(0)
{
fAxisAtt.RefDir().Set(0, 1, 0);
fAxisAtt.SetTextAlign(TGLAxisAttrib::kLeft);
fAxisAtt.SetLabelSize(0.06);
}
void TEveLegoOverlay::DrawSlider(TGLRnrCtx& rnrCtx)
{
glTranslatef(0, fSliderPosY, 0.5);
if (rnrCtx.Selection())
{
glLoadName(2);
Float_t w = fButtonW*fMenuW*0.5f;
glBegin(GL_QUADS);
glVertex2f(-w, 0);
glVertex2f( w, 0);
glVertex2f( w, fSliderH);
glVertex2f(-w, fSliderH);
glEnd();
}
Double_t maxVal = fCalo->GetMaxVal();
TGLRect& wprt = rnrCtx.RefCamera().RefViewport();
Int_t fs = Int_t(wprt.Height()*fSliderH* fAxisAtt.GetLabelSize());
fAxisAtt.SetRng(0, maxVal);
fAxisAtt.RefTMOff(0).X() = -maxVal*0.03;
fAxisAtt.SetAbsLabelFontSize(fs);
glPushMatrix();
glScalef( fSliderH/maxVal, fSliderH/maxVal, 1.);
fAxisPainter.Paint(rnrCtx, fAxisAtt);
glPopMatrix();
TGLUtil::Color((fActiveID == 2) ? fActiveCol : 3);
glPointSize(8);
glBegin(GL_POINTS);
glVertex3f(0, fSliderVal*fSliderH, -0.1);
glEnd();
}
void TEveLegoOverlay::Render(TGLRnrCtx& rnrCtx)
{
if (! fCalo) return;
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
if (rnrCtx.Selection())
{
TGLRect rect(*rnrCtx.GetPickRectangle());
rnrCtx.GetCamera()->WindowToViewport(rect);
gluPickMatrix(rect.X(), rect.Y(), rect.Width(), rect.Height(),
(Int_t*) rnrCtx.GetCamera()->RefViewport().CArr());
}
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glScalef(2, 2, 1);
TGLCapabilitySwitch lights_off(GL_LIGHTING, kFALSE);
glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT | GL_LINE_BIT | GL_POINT_BIT);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(0.1, 1);
glDisable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPushName(0);
glTranslatef(0.5 -fMenuW*0.5, -0.5, 0);
glPushMatrix();
glTranslatef(0, (1-fButtonW )*fMenuW*0.8, 0);
glLoadName(1);
Float_t a=0.6;
(fActiveID == 1) ? TGLUtil::Color(fActiveCol):TGLUtil::Color4f(0, 1, 0, a);
Float_t bw = fButtonW*fMenuW*0.5;
Float_t bwt = bw*0.8;
Float_t bh = fButtonW*fMenuW;
glBegin(GL_QUADS);
glVertex2f(-bw, 0);
glVertex2f( bw, 0);
glVertex2f( bwt, bh);
glVertex2f(-bwt, bh);
glEnd();
TGLUtil::Color(4);
glLineWidth(1);
glBegin(GL_LINES);
glVertex2f(0, 0); glVertex2f(0, bh);
glVertex2f((bw+bwt)*0.5, bh*0.5); glVertex2f(-(bw+bwt)*0.5, bh*0.5);
glEnd();
glLineWidth(2);
glBegin(GL_LINE_LOOP);
glVertex2f(-bw, 0);
glVertex2f( bw, 0);
glVertex2f( bwt, bh);
glVertex2f(-bwt, bh);
glEnd();
glPopMatrix();
if (fShowSlider) DrawSlider(rnrCtx);
glPopName();
glPopAttrib();
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}
Bool_t TEveLegoOverlay::SetSliderVal(Event_t* event, TGLRnrCtx &rnrCtx)
{
TGLRect& wprt = rnrCtx.RefCamera().RefViewport();
fSliderVal = (1 -event->fY*1./wprt.Height() -fSliderPosY)/fSliderH;
if (fSliderVal < 0 )
fSliderVal = 0;
else if (fSliderVal > 1)
fSliderVal = 1;
fCalo->SetHPlaneVal(fSliderVal);
return kTRUE;
}
Bool_t TEveLegoOverlay::Handle(TGLRnrCtx & rnrCtx,
TGLOvlSelectRecord & rec,
Event_t * event)
{
switch (event->fType)
{
case kMotionNotify:
{
Int_t item = rec.GetN() < 2 ? -1 : (Int_t)rec.GetItem(1);
if (fActiveID != item) {
fActiveID = item;
return kTRUE;
} else {
if (fActiveID == 2 && event->fState == 256)
return SetSliderVal(event, rnrCtx);
return kFALSE;
}
break;
}
case kButtonPress:
{
if (event->fCode != kButton1) {
return kFALSE;
}
switch (rec.GetItem(1))
{
case 1:
fShowSlider = !fShowSlider;
fCalo->SetDrawHPlane(fShowSlider);
break;
case 2:
return SetSliderVal(event, rnrCtx);
default:
break;
}
}
default:
break;
}
return kFALSE;
}
Bool_t TEveLegoOverlay::MouseEnter(TGLOvlSelectRecord& )
{
return kTRUE;
}
void TEveLegoOverlay::MouseLeave()
{
fActiveID = -1;
}
Last change: Wed Jun 25 08:37:17 2008
Last generated: 2008-06-25 08:37
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.