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()");