Embedding a OpenGL viewer

Hey guys

I am trying to draw some geometry using the TGeo-classes. I want to make a small GUI for my peers to use, that shows the geometry using the OpenGL viewer next to some input widgets. I can not seem to get hold of the OpenGL viewer so I can embed in into a TGWindow or TGFrame like I can with TRootEmbeddedCanvas. It always pop up as a seperate window. I know there is the whole Eve framework, but it seems a bit overkill when I just want to show a simple viewer and frankly I have a hard time figuring out where to start if I were to use that. Is it even possible?

May be this can help:
root.cern.ch/how/how-embed-tcan … plications

Hi,

Didi you try a TGLEmbeddedViewer? For example:

[code] TEveManager::Create(kFALSE);
TGMainFrame *main = new TGMainFrame(0, 800, 600);

TGLEmbeddedViewer* v = new TGLEmbeddedViewer(main, 0, 0);
TEveViewer *nv = new TEveViewer();
nv->SetGLViewer(v, v->GetFrame());
nv->AddScene(gEve->GetEventScene());
main->AddFrame(v->GetFrame(),new TGLayoutHints( kLHintsExpandX | kLHintsExpandY));

main->Layout();
main->MapSubwindows();
main->MapWindow();
[/code]

Cheers, Bertrand.

So I was able to embed it, thanks! I am, however, not sure how I draw onto it? It just opens a new pad whenever I draw something.

Hi,

Could you post a running piece of code showing what you’re trying to do?

Cheers, Bertrand.

Yes. This is a class that extends a TGHorizontalFrame. So far there is only the constructor. I am trying to make it show a simple box, but it is just black:

[code]RenderingFrame::RenderingFrame(const TGWindow *p) : TGHorizontalFrame§ {

TGTab* tab = new TGTab(this);
TGHorizontalFrame* frame = new TGHorizontalFrame(this, 800, 800);
tab->AddTab("Tab", frame);

TEveManager::Create(kFALSE);
TGLEmbeddedViewer* v = new TGLEmbeddedViewer(frame, 0, 0);
TEveViewer *nv = new TEveViewer();
nv->SetGLViewer(v, v->GetFrame());

nv->AddScene(gEve->GetEventScene());
frame->AddFrame(v->GetFrame(),new TGLayoutHints( kLHintsExpandX | kLHintsExpandY));


TGeoManager* manager = new TGeoManager("Setup", "Setup");
TGeoMaterial* fe = new TGeoMaterial("Fe", 55.845, 26, 7.87);
TGeoMedium* iron = new TGeoMedium("Iron", 1, fe);
TGeoVolume* top = manager->MakeBox("top", iron, 10, 10, 1);
manager->SetTopVolume(top);

TEveGeoTopNode* node = new TEveGeoTopNode(manager, manager->GetTopNode());
gEve->GetEventScene()->AddElement(node);

this->AddFrame(tab);

frame->Layout();
frame->MapSubwindows();
frame->MapWindow();

}[/code]

You have to tell the system to draw the elements in the scene, so add gEve->FullRedraw3D(kTRUE) after the last gEve->GetEventScene()->AddElement(node) (or at the end of the method):

[code]RenderingFrame::RenderingFrame(const TGWindow *p) : TGHorizontalFrame§ {

TGTab* tab = new TGTab(this);
TGHorizontalFrame* frame = new TGHorizontalFrame(this, 800, 800);
tab->AddTab("Tab", frame);

TEveManager::Create(kFALSE);
TGLEmbeddedViewer* v = new TGLEmbeddedViewer(frame, 0, 0);
TEveViewer *nv = new TEveViewer();
nv->SetGLViewer(v, v->GetFrame());

nv->AddScene(gEve->GetEventScene());
gEve->GetViewers()->AddElement(nv);

frame->AddFrame(v->GetFrame(),new TGLayoutHints( kLHintsExpandX | kLHintsExpandY));

TGeoManager* manager = new TGeoManager("Setup", "Setup");
TGeoMaterial* fe = new TGeoMaterial("Fe", 55.845, 26, 7.87);
TGeoMedium* iron = new TGeoMedium("Iron", 1, fe);
TGeoVolume* top = manager->MakeBox("top", iron, 10, 10, 1);
manager->SetTopVolume(top);

TEveGeoTopNode* node = new TEveGeoTopNode(manager, manager->GetTopNode());
gEve->GetEventScene()->AddElement(node);
gEve->FullRedraw3D(kTRUE);

this->AddFrame(tab);

frame->Layout();
frame->MapSubwindows();
frame->MapWindow();

}
[/code]
Cheers, Bertrand.

Thanks a lot, that worked!