#include "TVirtualX.h"
#include "TString.h"
#include "TROOT.h"
#include "TGLRnrCtx.h"
#include "TGLSceneInfo.h"
#include "TGLSelectBuffer.h"
#include "TGLIncludes.h"
#include "TGLUtil.h"
#include "TGLFontManager.h"
#include "TGLContext.h"
#include <TError.h>
#include <TMathBase.h>
#include <algorithm>
#include <assert.h>
ClassImp(TGLRnrCtx)
TGLRnrCtx::TGLRnrCtx(TGLViewerBase* viewer) :
fViewer (viewer),
fCamera (0),
fSceneInfo (0),
fViewerLOD (kLODUndef),
fSceneLOD (kLODUndef),
fCombiLOD (kLODUndef),
fShapeLOD (kLODUndef),
fViewerStyle (kStyleUndef),
fSceneStyle (kStyleUndef),
fViewerClip (0),
fSceneClip (0),
fClip (0),
fDrawPass (kPassUndef),
fStopwatch (),
fRenderTimeOut(0.0),
fIsRunning (kFALSE),
fHasTimedOut (kFALSE),
fHighlight (kFALSE), fHighlightOutline (kFALSE),
fSelection (kFALSE), fSecSelection (kFALSE),
fPickRadius (0),
fPickRectangle(0),
fSelectBuffer (0),
fDLCaptureOpen (kFALSE),
fGLCtxIdentity (0),
fQuadric (0),
fGrabImage (kFALSE),
fGrabbedImage (0)
{
fSelectBuffer = new TGLSelectBuffer;
fQuadric = gluNewQuadric();
gluQuadricOrientation(fQuadric, (GLenum)GLU_OUTSIDE);
gluQuadricNormals (fQuadric, (GLenum)GLU_SMOOTH);
if (fViewer == 0)
{
fViewerLOD = fSceneLOD = fCombiLOD = fShapeLOD = kLODHigh;
fViewerStyle = fSceneStyle = kFill;
fDrawPass = kPassFill;
}
fSSLColor[0][0] = 0; fSSLColor[0][1] = 0; fSSLColor[0][2] = 0; fSSLColor[0][3] = 0;
fSSLColor[1][0] = 255; fSSLColor[1][1] = 255; fSSLColor[1][2] = 255; fSSLColor[1][3] = 255;
fSSLColor[2][0] = 255; fSSLColor[2][1] = 255; fSSLColor[2][2] = 255; fSSLColor[2][3] = 255;
fSSLColor[3][0] = 200; fSSLColor[3][1] = 200; fSSLColor[3][2] = 255; fSSLColor[3][3] = 255;
fSSLColor[4][0] = 200; fSSLColor[4][1] = 200; fSSLColor[4][2] = 255; fSSLColor[4][3] = 255;
}
TGLRnrCtx::~TGLRnrCtx()
{
gluDeleteQuadric(fQuadric);
delete fPickRectangle;
delete fSelectBuffer;
}
TGLSceneBase * TGLRnrCtx::GetScene()
{
return fSceneInfo->GetScene();
}
TGLSceneBase & TGLRnrCtx::RefScene()
{
return *fSceneInfo->GetScene();
}
Bool_t TGLRnrCtx::IsDrawPassFilled() const
{
return fDrawPass == kPassFill || fDrawPass == kPassOutlineFill;
}
void TGLRnrCtx:: StartStopwatch()
{
if (fIsRunning)
return;
fStopwatch.Start();
fIsRunning = kTRUE;
fHasTimedOut = kFALSE;
}
void TGLRnrCtx:: StopStopwatch()
{
fHasTimedOut = fStopwatch.End() > fRenderTimeOut;
fIsRunning = kFALSE;
}
Bool_t TGLRnrCtx::HasStopwatchTimedOut()
{
if (fHasTimedOut) return kTRUE;
if (fIsRunning && fStopwatch.Lap() > fRenderTimeOut)
fHasTimedOut = kTRUE;
return fHasTimedOut;
}
void TGLRnrCtx::BeginSelection(Int_t x, Int_t y, Int_t r)
{
fSelection = kTRUE;
fSecSelection = kFALSE;
fPickRadius = r;
if (!fPickRectangle) fPickRectangle = new TGLRect;
fPickRectangle->Set(x, y, r, r);
glSelectBuffer(fSelectBuffer->GetBufSize(), fSelectBuffer->GetBuf());
}
void TGLRnrCtx::EndSelection(Int_t glResult)
{
fSelection = kFALSE;
fSecSelection = kFALSE;
fPickRadius = 0;
delete fPickRectangle; fPickRectangle = 0;
if (glResult < 0)
{
if (fSelectBuffer->CanGrow() && fSelectBuffer->GetBufSize() > 0x10000)
{
Warning("TGLRnrCtx::EndSelection",
"Select buffer size (%d) insufficient, doubling it.",
fSelectBuffer->GetBufSize());
fSelectBuffer->Grow();
}
else
{
Warning("TGLRnrCtx::EndSelection",
"Select buffer size (%d) insufficient. This is maximum.",
fSelectBuffer->GetBufSize());
}
}
fSelectBuffer->ProcessResult(glResult);
}
TGLRect * TGLRnrCtx::GetPickRectangle()
{
return fPickRectangle;
}
Int_t TGLRnrCtx::GetPickRadius()
{
return fPickRadius;
}
void TGLRnrCtx::SetSSLColor(Int_t level, UChar_t r, UChar_t g, UChar_t b, UChar_t a)
{
fSSLColor[level][0] = r;
fSSLColor[level][1] = g;
fSSLColor[level][2] = b;
fSSLColor[level][3] = a;
}
void TGLRnrCtx::SetSSLColor(Int_t level, UChar_t rgba[4])
{
fSSLColor[level][0] = rgba[0];
fSSLColor[level][1] = rgba[1];
fSSLColor[level][2] = rgba[2];
fSSLColor[level][3] = rgba[3];
}
void TGLRnrCtx::OpenDLCapture()
{
assert(fDLCaptureOpen == kFALSE);
fDLCaptureOpen = kTRUE;
}
void TGLRnrCtx::CloseDLCapture()
{
assert(fDLCaptureOpen == kTRUE);
fDLCaptureOpen = kFALSE;
}
void TGLRnrCtx::RegisterFont(Int_t size, Int_t file, Int_t mode, TGLFont& out)
{
fGLCtxIdentity->GetFontManager()->RegisterFont(size, file, (TGLFont::EMode)mode, out);
}
void TGLRnrCtx::RegisterFont(Int_t size, const Text_t* name, Int_t mode, TGLFont& out)
{
fGLCtxIdentity->GetFontManager()->RegisterFont(size, name, (TGLFont::EMode)mode, out);
}
void TGLRnrCtx::ReleaseFont(TGLFont& font)
{
fGLCtxIdentity->GetFontManager()->ReleaseFont(font);
}
const char* TGLRnrCtx::StyleName(Short_t style)
{
switch (style)
{
case TGLRnrCtx::kFill: return "Filled Polys";
case TGLRnrCtx::kWireFrame: return "Wireframe";
case TGLRnrCtx::kOutline: return "Outline";
default: return "Oogaa-dooga style";
}
}
Last change: Fri Dec 5 09:52:52 2008
Last generated: 2008-12-05 09:52
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.