33 #ifdef G4VIS_BUILD_OPENGL_DRIVER
54 G4OpenGLStoredSceneHandler::PO::PO():
58 fMarkerOrPolyline(false)
61 G4OpenGLStoredSceneHandler::PO::PO(
const G4OpenGLStoredSceneHandler::PO& po):
62 fDisplayListId(po.fDisplayListId),
63 fTransform(po.fTransform),
64 fPickName(po.fPickName),
66 fpG4TextPlus(po.fpG4TextPlus? new G4TextPlus(*po.fpG4TextPlus): 0),
67 fMarkerOrPolyline(po.fMarkerOrPolyline)
75 fMarkerOrPolyline(false)
78 G4OpenGLStoredSceneHandler::PO::~PO()
83 G4OpenGLStoredSceneHandler::PO& G4OpenGLStoredSceneHandler::PO::operator=
84 (
const G4OpenGLStoredSceneHandler::PO& rhs)
86 if (&rhs ==
this)
return *
this;
87 fDisplayListId = rhs.fDisplayListId;
88 fTransform = rhs.fTransform;
89 fPickName = rhs.fPickName;
90 fColour = rhs.fColour;
91 fpG4TextPlus = rhs.fpG4TextPlus?
new G4TextPlus(*rhs.fpG4TextPlus): 0;
92 fMarkerOrPolyline = rhs.fMarkerOrPolyline;
96 G4OpenGLStoredSceneHandler::TO::TO():
102 fMarkerOrPolyline(false)
105 G4OpenGLStoredSceneHandler::TO::TO(
const G4OpenGLStoredSceneHandler::TO& to):
106 fDisplayListId(to.fDisplayListId),
107 fTransform(to.fTransform),
108 fPickName(to.fPickName),
109 fStartTime(to.fStartTime),
110 fEndTime(to.fEndTime),
112 fpG4TextPlus(to.fpG4TextPlus? new G4TextPlus(*to.fpG4TextPlus): 0),
113 fMarkerOrPolyline(to.fMarkerOrPolyline)
123 fMarkerOrPolyline(false)
126 G4OpenGLStoredSceneHandler::TO::~TO()
131 G4OpenGLStoredSceneHandler::TO& G4OpenGLStoredSceneHandler::TO::operator=
132 (
const G4OpenGLStoredSceneHandler::TO& rhs)
134 if (&rhs ==
this)
return *
this;
135 fDisplayListId = rhs.fDisplayListId;
136 fTransform = rhs.fTransform;
137 fPickName = rhs.fPickName;
138 fStartTime = rhs.fStartTime;
139 fEndTime = rhs.fEndTime;
140 fColour = rhs.fColour;
141 fpG4TextPlus = rhs.fpG4TextPlus?
new G4TextPlus(*rhs.fpG4TextPlus): 0;
142 fMarkerOrPolyline = rhs.fMarkerOrPolyline;
146 G4OpenGLStoredSceneHandler::G4OpenGLStoredSceneHandler
149 G4OpenGLSceneHandler (system, fSceneIdCount++, name),
153 G4OpenGLStoredSceneHandler::~G4OpenGLStoredSceneHandler ()
156 void G4OpenGLStoredSceneHandler::BeginPrimitives
159 G4OpenGLSceneHandler::BeginPrimitives (objectTransformation);
160 if (fReadyForTransients) glDrawBuffer (GL_FRONT);
164 void G4OpenGLStoredSceneHandler::EndPrimitives ()
168 glDrawBuffer (GL_BACK);
169 G4OpenGLSceneHandler::EndPrimitives ();
172 void G4OpenGLStoredSceneHandler::BeginPrimitives2D
175 G4OpenGLSceneHandler::BeginPrimitives2D(objectTransformation);
176 if (fReadyForTransients) glDrawBuffer (GL_FRONT);
179 void G4OpenGLStoredSceneHandler::EndPrimitives2D ()
183 glDrawBuffer (GL_BACK);
184 G4OpenGLSceneHandler::EndPrimitives2D ();
187 G4bool G4OpenGLStoredSceneHandler::AddPrimitivePreamble(
const G4VMarker& visible)
189 return AddPrimitivePreambleInternal(visible,
true,
false);
191 G4bool G4OpenGLStoredSceneHandler::AddPrimitivePreamble(
const G4Polyline& visible)
193 return AddPrimitivePreambleInternal(visible,
false,
true);
197 return AddPrimitivePreambleInternal(visible,
false,
false);
200 G4bool G4OpenGLStoredSceneHandler::AddPrimitivePreambleInternal(
const G4Visible& visible,
bool isMarker,
bool isPolyline)
202 const G4Colour& c = GetColour (visible);
205 G4bool transparency_enabled =
true;
206 G4bool isMarkerNotHidden =
true;
207 G4OpenGLViewer* pViewer =
dynamic_cast<G4OpenGLViewer*
>(fpViewer);
209 transparency_enabled = pViewer->transparency_enabled;
210 isMarkerNotHidden = pViewer->fVP.IsMarkerNotHidden();
213 G4bool isTransparent = opacity < 1.;
214 G4bool isMarkerOrPolyline = isMarker || isPolyline;
215 G4bool treatAsTransparent = transparency_enabled && isTransparent;
216 G4bool treatAsNotHidden = isMarkerNotHidden && isMarkerOrPolyline;
218 if (fProcessing2D) glDisable (GL_DEPTH_TEST);
220 if (isMarkerOrPolyline && isMarkerNotHidden)
221 glDisable (GL_DEPTH_TEST);
222 else {glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL);}
225 if (fThreePassCapable) {
230 if (!(fSecondPassForTransparency || fThirdPassForNonHiddenMarkers)) {
232 if (treatAsTransparent) {
233 fSecondPassForTransparencyRequested =
true;
235 if (treatAsNotHidden) {
236 fThirdPassForNonHiddenMarkersRequested =
true;
239 if (treatAsTransparent || treatAsNotHidden) {
245 if (fSecondPassForTransparency) {
246 if (!treatAsTransparent) {
252 if (fThirdPassForNonHiddenMarkers) {
253 if (!treatAsNotHidden) {
262 if (fpViewer->GetViewParameters().IsPicking()) {
264 glLoadName(++fPickName);
266 LoadAtts(visible, holder);
267 fPickMap[fPickName] = holder;
274 if (fpViewer->GetViewParameters().GetVisAttributesModifiers().size())
276 goto end_of_display_list_reuse_test;
284 goto end_of_display_list_reuse_test;
293 goto end_of_display_list_reuse_test;
297 goto end_of_display_list_reuse_test;
301 if (pCurrentPV -> IsReplicated ()) {
310 if (!(pCurrentPV -> IsParameterised ()) &&
313 !(pCurrentPV -> IsReplicated () && axis ==
kRho) &&
315 (fSolidMap.find (pSolid) != fSolidMap.end ())) {
316 fDisplayListId = fSolidMap [pSolid];
317 PO po(fDisplayListId,fObjectTransformation);
318 if (isPicking) po.fPickName = fPickName;
320 po.fMarkerOrPolyline = isMarkerOrPolyline;
321 fPOList.push_back(po);
326 (void) ExtraPOProcessing(
G4Visible(), fPOList.size() - 1);
330 end_of_display_list_reuse_test:
336 if (fMemoryForDisplayLists) {
337 fDisplayListId = glGenLists (1);
338 if (glGetError() == GL_OUT_OF_MEMORY ||
339 fDisplayListId > fDisplayListLimit) {
341 "********************* WARNING! ********************"
342 "\n* Display list limit reached in OpenGL."
343 "\n* Continuing drawing WITHOUT STORING. Scene only partially refreshable."
344 "\n* Current limit: " << fDisplayListLimit <<
345 ". Change with \"/vis/ogl/set/displayListLimit\"."
346 "\n***************************************************"
348 fMemoryForDisplayLists =
false;
352 if (pSolid) fSolidMap [pSolid] = fDisplayListId;
354 if (fMemoryForDisplayLists) {
355 if (fReadyForTransients) {
356 TO to(fDisplayListId, fObjectTransformation);
357 if (isPicking) to.fPickName = fPickName;
363 to.fMarkerOrPolyline = isMarkerOrPolyline;
364 fTOList.push_back(to);
371 G4OpenGLTransform3D oglt (fObjectTransformation);
372 glMultMatrixd (oglt.GetGLMatrix ());
373 if (transparency_enabled) {
378 (void) ExtraTOProcessing(visible, fTOList.size() - 1);
382 glNewList (fDisplayListId, GL_COMPILE_AND_EXECUTE);
384 PO po(fDisplayListId, fObjectTransformation);
385 if (isPicking) po.fPickName = fPickName;
387 po.fMarkerOrPolyline = isMarkerOrPolyline;
388 fPOList.push_back(po);
394 if (transparency_enabled) {
399 G4bool usesGLCommands = ExtraPOProcessing(visible, fPOList.size() - 1);
409 if (!usesGLCommands)
return false;
410 glNewList (fDisplayListId, GL_COMPILE);
413 glDrawBuffer (GL_FRONT);
415 G4OpenGLTransform3D oglt (fObjectTransformation);
416 glMultMatrixd (oglt.GetGLMatrix ());
417 if (transparency_enabled) {
427 glMatrixMode (GL_PROJECTION);
430 glOrtho (-1., 1., -1., 1., -G4OPENGL_FLT_BIG, G4OPENGL_FLT_BIG);
431 glMatrixMode (GL_MODELVIEW);
434 G4OpenGLTransform3D oglt (fObjectTransformation);
435 glMultMatrixd (oglt.GetGLMatrix ());
436 glDisable (GL_LIGHTING);
438 glEnable (GL_LIGHTING);
444 void G4OpenGLStoredSceneHandler::AddPrimitivePostamble()
448 glMatrixMode (GL_PROJECTION);
450 glMatrixMode (GL_MODELVIEW);
455 if (glGetError() == GL_OUT_OF_MEMORY) {
457 "ERROR: G4OpenGLStoredSceneHandler::AddPrimitivePostamble: Failure"
458 " to allocate display List for fTopPODL - try OpenGL Immediated mode."
461 if (fMemoryForDisplayLists) {
463 if (glGetError() == GL_OUT_OF_MEMORY) {
465 "ERROR: G4OpenGLStoredSceneHandler::AddPrimitivePostamble: Failure"
466 " to allocate display List for fTopPODL - try OpenGL Immediated mode."
470 if (fReadyForTransients || !fMemoryForDisplayLists) {
475 void G4OpenGLStoredSceneHandler::AddPrimitive (
const G4Polyline& polyline)
477 G4bool furtherprocessing = AddPrimitivePreamble(polyline);
478 if (furtherprocessing) {
479 G4OpenGLSceneHandler::AddPrimitive(polyline);
480 AddPrimitivePostamble();
484 void G4OpenGLStoredSceneHandler::AddPrimitive (
const G4Polymarker& polymarker)
486 G4bool furtherprocessing = AddPrimitivePreamble(polymarker);
487 if (furtherprocessing) {
488 G4OpenGLSceneHandler::AddPrimitive(polymarker);
489 AddPrimitivePostamble();
493 void G4OpenGLStoredSceneHandler::AddPrimitive (
const G4Text& text)
498 G4bool furtherprocessing = AddPrimitivePreamble(text);
499 if (furtherprocessing) {
500 G4OpenGLSceneHandler::AddPrimitive(text);
501 AddPrimitivePostamble();
505 void G4OpenGLStoredSceneHandler::AddPrimitive (
const G4Circle& circle)
507 G4bool furtherprocessing = AddPrimitivePreamble(circle);
508 if (furtherprocessing) {
509 G4OpenGLSceneHandler::AddPrimitive(circle);
510 AddPrimitivePostamble();
514 void G4OpenGLStoredSceneHandler::AddPrimitive (
const G4Square& square)
516 G4bool furtherprocessing = AddPrimitivePreamble(square);
517 if (furtherprocessing) {
518 G4OpenGLSceneHandler::AddPrimitive(square);
519 AddPrimitivePostamble();
523 void G4OpenGLStoredSceneHandler::AddPrimitive (
const G4Scale& scale)
526 G4OpenGLSceneHandler::AddPrimitive(scale);
529 void G4OpenGLStoredSceneHandler::AddPrimitive (
const G4Polyhedron& polyhedron)
534 G4bool furtherprocessing = AddPrimitivePreamble(polyhedron);
535 if (furtherprocessing) {
536 G4OpenGLSceneHandler::AddPrimitive(polyhedron);
537 AddPrimitivePostamble();
541 void G4OpenGLStoredSceneHandler::BeginModeling () {
549 void G4OpenGLStoredSceneHandler::EndModeling () {
551 fTopPODL = glGenLists (1);
552 if (glGetError() == GL_OUT_OF_MEMORY) {
554 "ERROR: G4OpenGLStoredSceneHandler::EndModeling: Failure to allocate"
555 " display List for fTopPODL - try OpenGL Immediated mode."
559 glNewList (fTopPODL, GL_COMPILE); {
560 for (
size_t i = 0; i < fPOList.size (); i++) {
562 G4OpenGLTransform3D oglt (fPOList[i].fTransform);
563 glMultMatrixd (oglt.GetGLMatrix ());
564 if (fpViewer->GetViewParameters().IsPicking())
565 glLoadName(fPOList[i].fPickName);
566 glCallList (fPOList[i].fDisplayListId);
572 if (glGetError() == GL_OUT_OF_MEMORY) {
574 "ERROR: G4OpenGLStoredSceneHandler::EndModeling: Failure to allocate"
575 " display List for fTopPODL - try OpenGL Immediated mode."
583 void G4OpenGLStoredSceneHandler::ClearStore () {
590 for (
size_t i = 0; i < fPOList.size (); i++)
591 glDeleteLists (fPOList[i].fDisplayListId, 1);
592 if (fTopPODL) glDeleteLists (fTopPODL, 1);
598 ClearAndDestroyAtts();
601 for (
size_t i = 0; i < fTOList.size (); i++)
602 glDeleteLists(fTOList[i].fDisplayListId, 1);
605 fMemoryForDisplayLists =
true;
608 void G4OpenGLStoredSceneHandler::ClearTransientStore ()
613 for (
size_t i = 0; i < fTOList.size (); i++)
614 glDeleteLists(fTOList[i].fDisplayListId, 1);
617 fMemoryForDisplayLists =
true;
621 fpViewer -> SetView ();
622 fpViewer -> ClearView ();
623 fpViewer -> DrawView ();
627 G4int G4OpenGLStoredSceneHandler::fSceneIdCount = 0;
629 G4int G4OpenGLStoredSceneHandler::fDisplayListId = 0;
630 G4bool G4OpenGLStoredSceneHandler::fMemoryForDisplayLists =
true;
631 G4int G4OpenGLStoredSceneHandler::fDisplayListLimit = 50000;
G4double GetStartTime() const
virtual void ClearStore()
G4double GetAlpha() const
virtual void BeginModeling()
const G4VisAttributes * GetVisAttributes() const
G4GLOB_DLL std::ostream G4cout
G4double GetGreen() const
virtual void EndModeling()
G4LogicalVolume * GetLogicalVolume() const
G4double GetEndTime() const
virtual void GetReplicationData(EAxis &axis, G4int &nReplicas, G4double &width, G4double &offset, G4bool &consuming) const =0
G4VPhysicalVolume * GetCurrentPV() const
G4VSolid * GetSolid() const
G4GLOB_DLL std::ostream G4cerr