39 ClassImp(TGLPShapeObjEditor);
 
   51 enum EApplyButtonIds {
 
   61       kCPa = kTBEndOfList + 1,
 
   74 TGLPShapeObjEditor::TGLPShapeObjEditor(
const TGWindow *p,  Int_t width, Int_t height, UInt_t options, Pixel_t back)
 
   75    : TGedFrame(p,  width, height, options | kVerticalFrame, back),
 
   76      fLb(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 2, 3, 3), 
 
   77      fLe(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 0, 0, 3, 3), 
 
   78      fLl(kLHintsLeft, 0, 8, 6, 0), 
 
   79      fLs(kLHintsTop | kLHintsCenterX, 2, 2, 0, 0),  
 
   80      fGeoFrame(0),fGeoApplyButton(0),
 
   82      fRedSlider(0), fGreenSlider(0), fBlueSlider(0), fAlphaSlider(0), fShineSlider(0),
 
   83      fColorApplyButton(0), fColorApplyFamily(0),
 
   87    fRGBA[12] = fRGBA[13] = fRGBA[14] = 0.0f;
 
   91    CreateColorControls();
 
   99 TGLPShapeObjEditor::~TGLPShapeObjEditor()
 
  107 void TGLPShapeObjEditor::SetPShape(TGLPhysicalShape * shape)
 
  109    TGLPShapeRef::SetPShape(shape);
 
  110    if (shape == 0 && fGedEditor->GetModel() == fPShapeObj)
 
  111       fGedEditor->SetModel(fGedEditor->GetPad(), fPShapeObj->fViewer, kButton1Down);
 
  118 void TGLPShapeObjEditor::PShapeModified()
 
  120    if (fGedEditor->GetModel() == fPShapeObj)
 
  121       fGedEditor->SetModel(fGedEditor->GetPad(), fPShapeObj, kButton1Down);
 
  129 void TGLPShapeObjEditor::SetModel(TObject* obj)
 
  133    fPShapeObj = 
static_cast<TGLPShapeObj *
>(obj);
 
  134    SetPShape(fPShapeObj->fPShape);
 
  136    SetRGBA(fPShapeObj->fPShape->Color());
 
  137    SetCenter(fPShapeObj->fPShape->GetTranslation().CArr());
 
  138    SetScale(fPShapeObj->fPShape->GetScale().CArr());
 
  139    fGeoApplyButton->SetState(kButtonDisabled);
 
  145 void TGLPShapeObjEditor::SetCenter(
const Double_t *c)
 
  147    fGeomData[kCenterX]->SetNumber(c[0]);
 
  148    fGeomData[kCenterY]->SetNumber(c[1]);
 
  149    fGeomData[kCenterZ]->SetNumber(c[2]);
 
  155 void TGLPShapeObjEditor::SetScale(
const Double_t *s)
 
  157    fGeomData[kScaleX]->SetNumber(s[0]);
 
  158    fGeomData[kScaleY]->SetNumber(s[1]);
 
  159    fGeomData[kScaleZ]->SetNumber(s[2]);
 
  165 void TGLPShapeObjEditor::DoGeoButton()
 
  169    GetObjectData(trans.Arr(), scale.Arr());
 
  171       fPShape->SetTranslation(trans);
 
  172       fPShape->Scale(scale);
 
  174    fPShapeObj->fViewer->RequestDraw();
 
  175    fGeoApplyButton->SetState(kButtonDisabled);
 
  182 void TGLPShapeObjEditor::GetObjectData(Double_t *center, Double_t *scale)
 
  184    center[0] = fGeomData[kCenterX]->GetNumber();
 
  185    center[1] = fGeomData[kCenterY]->GetNumber();
 
  186    center[2] = fGeomData[kCenterZ]->GetNumber();
 
  187    scale[0] = fGeomData[kScaleX]->GetNumber();
 
  188    scale[1] = fGeomData[kScaleY]->GetNumber();
 
  189    scale[2] = fGeomData[kScaleZ]->GetNumber();
 
  195 void TGLPShapeObjEditor::GeoValueSet(Long_t)
 
  197    if (fGeoApplyButton->GetState() != kButtonUp)
 
  198        fGeoApplyButton->SetState(kButtonUp);
 
  204 void TGLPShapeObjEditor::CreateGeoControls()
 
  206    fGeoFrame = CreateEditorTabSubFrame(
"Geometry");
 
  211    TGGroupFrame* container = 
new TGGroupFrame(fGeoFrame, 
"Object position:");
 
  212    container->SetTitlePos(TGGroupFrame::kLeft);
 
  213    fGeoFrame->AddFrame(container, 
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 8, 8, 3, 3));
 
  214    TGLayoutHints lh =  TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 0, 0, 0, 0);
 
  216    TGHorizontalFrame* hf;
 
  218    hf = 
new TGHorizontalFrame(container);
 
  219    label = 
new TGLabel(hf, 
"X:");
 
  220    hf->AddFrame(label, 
new TGLayoutHints(fLl));
 
  221    fGeomData[kCenterX] = 
new TGNumberEntry(hf, 0.0, 8, kNExc);
 
  222    hf->AddFrame(fGeomData[kCenterX], 
new TGLayoutHints(fLe));
 
  223    fGeomData[kCenterX]->Connect(
"ValueSet(Long_t)", 
"TGLPShapeObjEditor",
 
  224                                 this, 
"GeoValueSet(Long_t)");
 
  225    container->AddFrame(hf, 
new TGLayoutHints(lh));
 
  227    hf = 
new TGHorizontalFrame(container);
 
  228    label = 
new TGLabel(hf, 
"Y:");
 
  229    hf->AddFrame(label, 
new TGLayoutHints(fLl));
 
  230    fGeomData[kCenterY] = 
new TGNumberEntry(hf, 0.0, 8, kNEyc);
 
  231    hf->AddFrame(fGeomData[kCenterY], 
new TGLayoutHints(fLe));
 
  232    fGeomData[kCenterY]->Connect(
"ValueSet(Long_t)", 
"TGLPShapeObjEditor",
 
  233                                 this, 
"GeoValueSet(Long_t)");
 
  234    container->AddFrame(hf, 
new TGLayoutHints(lh));
 
  236    hf = 
new TGHorizontalFrame(container);
 
  237    hf->AddFrame(
new TGLabel(hf, 
"Z:"), 
new TGLayoutHints(fLl));
 
  238    fGeomData[kCenterZ] = 
new TGNumberEntry(hf, 1.0, 8, kNEzc);
 
  239    hf->AddFrame(fGeomData[kCenterZ], 
new TGLayoutHints(fLe));
 
  240    fGeomData[kCenterZ]->Connect(
"ValueSet(Long_t)", 
"TGLPShapeObjEditor",
 
  241                                 this, 
"GeoValueSet(Long_t)");
 
  242    container->AddFrame(hf, 
new TGLayoutHints(lh));
 
  245    TGGroupFrame* osf = 
new TGGroupFrame(fGeoFrame, 
"Object scale:", kLHintsTop | kLHintsCenterX);
 
  246    osf->SetTitlePos(TGGroupFrame::kLeft);
 
  247    fGeoFrame->AddFrame(osf, 
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 8, 8, 3, 3));
 
  249    hf = 
new TGHorizontalFrame(osf);
 
  250    hf->AddFrame(
new TGLabel(hf, 
"X:"),
new TGLayoutHints(fLl));
 
  251    fGeomData[kScaleX] = 
new TGNumberEntry(hf, 1.0, 5, kNExs);
 
  252    hf->AddFrame(fGeomData[kScaleX], 
new TGLayoutHints(fLe));
 
  253    fGeomData[kScaleX]->Connect(
"ValueSet(Long_t)", 
"TGLPShapeObjEditor",
 
  254                                this, 
"GeoValueSet(Long_t)");
 
  255    osf->AddFrame(hf, 
new TGLayoutHints(lh));
 
  257    hf = 
new TGHorizontalFrame(osf);
 
  258    hf->AddFrame(
new TGLabel(hf, 
"Y:"),
new TGLayoutHints(fLl));
 
  259    fGeomData[kScaleY] = 
new TGNumberEntry(hf, 1.0, 5, kNEys);
 
  260    hf->AddFrame(fGeomData[kScaleY], 
new TGLayoutHints(fLe));
 
  261    fGeomData[kScaleY]->Connect(
"ValueSet(Long_t)", 
"TGLPShapeObjEditor",
 
  262                                this, 
"GeoValueSet(Long_t)");
 
  263    osf->AddFrame(hf, 
new TGLayoutHints(lh));
 
  265    hf = 
new TGHorizontalFrame(osf);
 
  266    hf->AddFrame(
new TGLabel(hf, 
"Z:"),
new TGLayoutHints(fLl));
 
  267    fGeomData[kScaleZ] = 
new TGNumberEntry(hf, 1.0, 5, kNEzs);
 
  268    hf->AddFrame(fGeomData[kScaleZ], 
new TGLayoutHints(fLe));
 
  269    fGeomData[kScaleZ]->Connect(
"ValueSet(Long_t)", 
"TGLPShapeObjEditor",
 
  270                                this, 
"GeoValueSet(Long_t)");
 
  271    osf->AddFrame(hf, 
new TGLayoutHints(lh));
 
  273    hf = 
new TGHorizontalFrame(osf);
 
  274    fGeomData[kScaleX]->SetLimits(TGNumberFormat::kNELLimitMin, 0.1);
 
  275    fGeomData[kScaleY]->SetLimits(TGNumberFormat::kNELLimitMin, 0.1);
 
  276    fGeomData[kScaleZ]->SetLimits(TGNumberFormat::kNELLimitMin, 0.1);
 
  277    osf->AddFrame(hf, 
new TGLayoutHints(lh));
 
  280    fGeoApplyButton = 
new TGTextButton(fGeoFrame, 
"Modify object");
 
  281    fGeoFrame->AddFrame(fGeoApplyButton, 
new TGLayoutHints(fLb));
 
  282    fGeoApplyButton->SetState(kButtonDisabled);
 
  283    fGeoApplyButton->Connect(
"Pressed()", 
"TGLPShapeObjEditor", 
this, 
"DoGeoButton()");
 
  289 void TGLPShapeObjEditor::SetRGBA(
const Float_t *rgba)
 
  291    fColorApplyButton->SetState(kButtonDisabled);
 
  292    fColorApplyFamily->SetState(kButtonDisabled);
 
  294    for (Int_t i = 0; i < 17; ++i) fRGBA[i] = rgba[i];
 
  296    fRedSlider->SetPosition(Int_t(fRGBA[fLMode * 4] * 100));
 
  297    fGreenSlider->SetPosition(Int_t(fRGBA[fLMode * 4 + 1] * 100));
 
  298    fBlueSlider->SetPosition(Int_t(fRGBA[fLMode * 4 + 2] * 100));
 
  299    fShineSlider->SetPosition(Int_t(fRGBA[16]));
 
  307 void TGLPShapeObjEditor::DoColorSlider(Int_t val)
 
  309    TGSlider *frm = (TGSlider *)gTQSender;
 
  312       Int_t wid = frm->WidgetId();
 
  316          fRGBA[fLMode * 4] = val / 100.f;
 
  319          fRGBA[fLMode * 4 + 1] = val / 100.f;
 
  322          fRGBA[fLMode * 4 + 2] = val / 100.f;
 
  325          fRGBA[fLMode * 4 + 3] = val / 100.f;
 
  332       fColorApplyButton->SetState(kButtonUp);
 
  333       fColorApplyFamily->SetState(kButtonUp);
 
  341 void TGLPShapeObjEditor::DoColorButton()
 
  343    TGButton *btn = (TGButton *) gTQSender;
 
  344    Int_t 
id = btn->WidgetId();
 
  348       fLightTypes[fLMode]->SetState(kButtonUp);
 
  350       SetColorSlidersPos();
 
  353       fLightTypes[fLMode]->SetState(kButtonUp);
 
  355       SetColorSlidersPos();
 
  358       fLightTypes[fLMode]->SetState(kButtonUp);
 
  360       SetColorSlidersPos();
 
  363       fLightTypes[fLMode]->SetState(kButtonUp);
 
  365       SetColorSlidersPos();
 
  368       fColorApplyButton->SetState(kButtonDisabled);
 
  369       fColorApplyFamily->SetState(kButtonDisabled);
 
  371          fPShape->SetColor(GetRGBA());
 
  373       fPShapeObj->fViewer->RequestDraw();
 
  376       fColorApplyButton->SetState(kButtonDisabled);
 
  377       fColorApplyFamily->SetState(kButtonDisabled);
 
  379          fPShape->SetColorOnFamily(GetRGBA());
 
  381       fPShapeObj->fViewer->RequestDraw();
 
  389 void TGLPShapeObjEditor::CreateColorRadioButtons()
 
  391    TGGroupFrame *partFrame = 
new TGGroupFrame(fColorFrame, 
"Color components:", kLHintsTop | kLHintsCenterX);
 
  392    fColorFrame->AddFrame(partFrame, 
new TGLayoutHints(kLHintsTop | kLHintsCenterX, 2, 0, 2, 2));
 
  394    partFrame->SetTitlePos(TGGroupFrame::kLeft);
 
  395    TGMatrixLayout *ml = 
new TGMatrixLayout(partFrame, 0, 1, 10);
 
  396    partFrame->SetLayoutManager(ml);
 
  399    fLightTypes[kDiffuse] = 
new TGRadioButton(partFrame, 
"Diffuse", kCPd);
 
  400    fLightTypes[kDiffuse]->Connect(
"Pressed()", 
"TGLPShapeObjEditor", 
this, 
"DoColorButton()");
 
  401    fLightTypes[kDiffuse]->SetToolTipText(
"Diffuse component of color");
 
  402    partFrame->AddFrame(fLightTypes[kDiffuse]);
 
  404    fLightTypes[kAmbient] = 
new TGRadioButton(partFrame, 
"Ambient", kCPa);
 
  405    fLightTypes[kAmbient]->Connect(
"Pressed()", 
"TGLPShapeObjEditor", 
this, 
"DoColorButton()");
 
  406    fLightTypes[kAmbient]->SetToolTipText(
"Ambient component of color");
 
  407    partFrame->AddFrame(fLightTypes[kAmbient]);
 
  409    fLightTypes[kSpecular] = 
new TGRadioButton(partFrame, 
"Specular", kCPs);
 
  410    fLightTypes[kSpecular]->Connect(
"Pressed()", 
"TGLPShapeObjEditor", 
this, 
"DoColorButton()");
 
  411    fLightTypes[kSpecular]->SetToolTipText(
"Specular component of color");
 
  412    partFrame->AddFrame(fLightTypes[kSpecular]);
 
  414    fLightTypes[kEmission] = 
new TGRadioButton(partFrame, 
"Emissive", kCPe);
 
  415    fLightTypes[kEmission]->Connect(
"Pressed()", 
"TGLPShapeObjEditor", 
this, 
"DoColorButton()");
 
  416    fLightTypes[kEmission]->SetToolTipText(
"Emissive component of color");
 
  417    partFrame->AddFrame(fLightTypes[kEmission]);
 
  420    fLightTypes[fLMode]->SetState(kButtonDown);
 
  426 void TGLPShapeObjEditor::CreateColorSliders()
 
  431    fColorFrame->AddFrame(
new TGLabel(fColorFrame, 
"Red :"), 
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 0, 0, 0));
 
  432    fRedSlider = 
new TGHSlider(fColorFrame, sw, kSlider1 | kScaleBoth, kHSr);
 
  433    fRedSlider->Connect(
"PositionChanged(Int_t)", 
"TGLPShapeObjEditor", 
this, 
"DoColorSlider(Int_t)");
 
  434    fRedSlider->SetRange(0, 100);
 
  435    fRedSlider->SetPosition(Int_t(fRGBA[0] * 100));
 
  436    fColorFrame->AddFrame(fRedSlider, 
new TGLayoutHints(fLs));
 
  439    fColorFrame->AddFrame(
new TGLabel(fColorFrame, 
"Green :"), 
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 0, 0, 0));
 
  440    fGreenSlider = 
new TGHSlider(fColorFrame, sw, kSlider1 | kScaleBoth, kHSg);
 
  441    fGreenSlider->Connect(
"PositionChanged(Int_t)", 
"TGLPShapeObjEditor", 
this, 
"DoColorSlider(Int_t)");
 
  442    fGreenSlider->SetRange(0, 100);
 
  443    fGreenSlider->SetPosition(Int_t(fRGBA[1] * 100));
 
  444    fColorFrame->AddFrame(fGreenSlider, 
new TGLayoutHints(fLs));
 
  447    fColorFrame->AddFrame(
new TGLabel(fColorFrame, 
"Blue :"), 
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 0, 0, 0));
 
  448    fBlueSlider = 
new TGHSlider(fColorFrame, sw, kSlider1 | kScaleBoth, kHSb);
 
  449    fBlueSlider->Connect(
"PositionChanged(Int_t)", 
"TGLPShapeObjEditor", 
this, 
"DoColorSlider(Int_t)");
 
  450    fBlueSlider->SetRange(0, 100);
 
  451    fBlueSlider->SetPosition(Int_t(fRGBA[2] * 100));
 
  452    fColorFrame->AddFrame(fBlueSlider, 
new TGLayoutHints(fLs));
 
  454    fColorFrame->AddFrame(
new TGLabel(fColorFrame, 
"Shine :"), 
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 0, 0, 0));
 
  455    fShineSlider = 
new TGHSlider(fColorFrame, sw, kSlider1 | kScaleBoth, kHSs);
 
  456    fShineSlider->Connect(
"PositionChanged(Int_t)", 
"TGLPShapeObjEditor", 
this, 
"DoColorSlider(Int_t)");
 
  457    fShineSlider->SetRange(0, 128);
 
  458    fColorFrame->AddFrame(fShineSlider, 
new TGLayoutHints(fLs));
 
  464 void TGLPShapeObjEditor::SetColorSlidersPos()
 
  466    fRedSlider->SetPosition(Int_t(fRGBA[fLMode * 4] * 100));
 
  467    fGreenSlider->SetPosition(Int_t(fRGBA[fLMode * 4 + 1] * 100));
 
  468    fBlueSlider->SetPosition(Int_t(fRGBA[fLMode * 4 + 2] * 100));
 
  471    if (fRGBA[16] >= 0.f)
 
  472       fShineSlider->SetPosition(Int_t(fRGBA[16]));
 
  478 void TGLPShapeObjEditor::DoRedraw()
 
  481    TGedFrame::DoRedraw();
 
  487    GLUquadric *GetQuadric()
 
  494             fQuad = gluNewQuadric();
 
  496                Error(
"GetQuadric::Init", 
"could not create quadric object");
 
  498                gluQuadricOrientation(fQuad, (GLenum)GLU_OUTSIDE);
 
  499                gluQuadricDrawStyle(fQuad,   (GLenum)GLU_FILL);
 
  500                gluQuadricNormals(fQuad,     (GLenum)GLU_FLAT);
 
  506                gluDeleteQuadric(fQuad);
 
  511       return singleton.fQuad;
 
  519 void TGLPShapeObjEditor::DrawSphere()
const 
  521    if (!gVirtualX->IsCmdThread()) {
 
  522       gROOT->ProcessLineFast(Form(
"((TGLPShapeObjEditor *)0x%lx)->DrawSphere()", (ULong_t)
this));
 
  526    R__LOCKGUARD(gROOTMutex);
 
  528    fMatView->MakeCurrent();
 
  529    glViewport(0, 0, fMatView->GetWidth(), fMatView->GetHeight());
 
  530    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
  532    glEnable(GL_LIGHTING);
 
  534    glEnable(GL_DEPTH_TEST);
 
  535    glEnable(GL_CULL_FACE);
 
  537    glMatrixMode(GL_PROJECTION);
 
  539    glFrustum(-0.5, 0.5, -0.5, 0.5, 1., 10.);
 
  540    glMatrixMode(GL_MODELVIEW);
 
  542    Float_t ligPos[] = {0.f, 0.f, 0.f, 1.f};
 
  543    glLightfv(GL_LIGHT0, GL_POSITION, ligPos);
 
  544    glTranslated(0., 0., -3.);
 
  546    const Float_t whiteColor[] = {1.f, 1.f, 1.f, 1.f};
 
  547    const Float_t nullColor[] = {0.f, 0.f, 0.f, 1.f};
 
  549    if (fRGBA[16] < 0.f) {
 
  550       glLightfv(GL_LIGHT0, GL_DIFFUSE, fRGBA);
 
  551       glLightfv(GL_LIGHT0, GL_AMBIENT, fRGBA + 4);
 
  552       glLightfv(GL_LIGHT0, GL_SPECULAR, fRGBA + 8);
 
  553       glMaterialfv(GL_FRONT, GL_DIFFUSE, whiteColor);
 
  554       glMaterialfv(GL_FRONT, GL_AMBIENT, nullColor);
 
  555       glMaterialfv(GL_FRONT, GL_SPECULAR, whiteColor);
 
  556       glMaterialfv(GL_FRONT, GL_EMISSION, nullColor);
 
  557       glMaterialf(GL_FRONT, GL_SHININESS, 60.f);
 
  559       glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteColor);
 
  560       glLightfv(GL_LIGHT0, GL_AMBIENT, nullColor);
 
  561       glLightfv(GL_LIGHT0, GL_SPECULAR, whiteColor);
 
  562       glMaterialfv(GL_FRONT, GL_DIFFUSE, fRGBA);
 
  563       glMaterialfv(GL_FRONT, GL_AMBIENT, fRGBA + 4);
 
  564       glMaterialfv(GL_FRONT, GL_SPECULAR, fRGBA + 8);
 
  565       glMaterialfv(GL_FRONT, GL_EMISSION, fRGBA + 12);
 
  566       glMaterialf(GL_FRONT, GL_SHININESS, fRGBA[16]);
 
  570    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
  571    GLUquadric * quad = GetQuadric();
 
  573       glRotated(-90., 1., 0., 0.);
 
  574       gluSphere(quad, 1., 100, 100);
 
  578    fMatView->SwapBuffers();
 
  585 void TGLPShapeObjEditor::CreateColorControls()
 
  589    fMatView = TGLWidget::Create(fColorFrame, kFALSE, kTRUE, 0, 120, 120);
 
  590    fColorFrame->AddFrame(fMatView, 
new TGLayoutHints(kLHintsTop | kLHintsCenterX, 2, 0, 2, 2));
 
  592    CreateColorRadioButtons();
 
  594    CreateColorSliders();
 
  597    fColorApplyButton = 
new TGTextButton(fColorFrame, 
"Apply", kTBa);
 
  598    fColorFrame->AddFrame(fColorApplyButton, 
new TGLayoutHints(fLb));
 
  599    fColorApplyButton->SetState(kButtonDisabled);
 
  600    fColorApplyButton->Connect(
"Pressed()", 
"TGLPShapeObjEditor", 
this, 
"DoColorButton()");
 
  602    fColorApplyFamily = 
new TGTextButton(fColorFrame, 
"Apply to family", kTBaf);
 
  603    fColorFrame->AddFrame(fColorApplyFamily, 
new TGLayoutHints(fLb));
 
  604    fColorApplyFamily->SetState(kButtonDisabled);
 
  605    fColorApplyFamily->Connect(
"Pressed()", 
"TGLPShapeObjEditor", 
this, 
"DoColorButton()");