00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifdef G4VIS_BUILD_OPENGL_DRIVER
00035
00036
00037 #include "G4NURBS.hh"
00038
00039
00040
00041 #define CENTERLINE_CLPP
00042
00043
00044 #include "G4OpenGLImmediateSceneHandler.hh"
00045
00046 #include "G4OpenGLViewer.hh"
00047 #include "G4OpenGLTransform3D.hh"
00048 #include "G4Polyline.hh"
00049 #include "G4Polymarker.hh"
00050 #include "G4Text.hh"
00051 #include "G4Circle.hh"
00052 #include "G4Square.hh"
00053 #include "G4Scale.hh"
00054 #include "G4Polyhedron.hh"
00055 #include "G4AttHolder.hh"
00056
00057 #include <typeinfo>
00058
00059 G4OpenGLImmediateSceneHandler::G4OpenGLImmediateSceneHandler
00060 (G4VGraphicsSystem& system,const G4String& name):
00061 G4OpenGLSceneHandler (system, fSceneIdCount++, name)
00062 {}
00063
00064 G4OpenGLImmediateSceneHandler::~G4OpenGLImmediateSceneHandler ()
00065 {}
00066
00067 #include <iomanip>
00068
00069 G4bool G4OpenGLImmediateSceneHandler::AddPrimitivePreamble(const G4Visible& visible)
00070 {
00071 const G4Colour& c = GetColour (visible);
00072 G4double opacity = c.GetAlpha ();
00073
00074 G4bool transparency_enabled = true;
00075 G4bool isMarkerNotHidden = true;
00076 G4OpenGLViewer* pViewer = dynamic_cast<G4OpenGLViewer*>(fpViewer);
00077 if (pViewer) {
00078 transparency_enabled = pViewer->transparency_enabled;
00079 isMarkerNotHidden = pViewer->fVP.IsMarkerNotHidden();
00080 }
00081
00082 G4bool isMarker = false;
00083 try {
00084 (void) dynamic_cast<const G4VMarker&>(visible);
00085 isMarker = true;
00086 }
00087 catch (std::bad_cast) {}
00088
00089 G4bool isPolyline = false;
00090 try {
00091 (void) dynamic_cast<const G4Polyline&>(visible);
00092 isPolyline = true;
00093 }
00094 catch (std::bad_cast) {}
00095
00096 G4bool isMarkerOrPolyline = isMarker || isPolyline;
00097 G4bool treatAsTransparent = transparency_enabled && opacity < 1.;
00098 G4bool treatAsNotHidden = isMarkerNotHidden && (isMarker || isPolyline);
00099
00100 if (fProcessing2D) glDisable (GL_DEPTH_TEST);
00101 else {
00102 if (isMarkerOrPolyline && isMarkerNotHidden)
00103 glDisable (GL_DEPTH_TEST);
00104 else {glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL);}
00105 }
00106
00107 if (fThreePassCapable) {
00108
00109
00110
00111
00112 if (!(fSecondPassForTransparency || fThirdPassForNonHiddenMarkers)) {
00113
00114 if (treatAsTransparent) {
00115 fSecondPassForTransparencyRequested = true;
00116 }
00117 if (treatAsNotHidden) {
00118 fThirdPassForNonHiddenMarkersRequested = true;
00119 }
00120
00121 if (treatAsTransparent || treatAsNotHidden) {
00122 return false;
00123 }
00124 }
00125
00126
00127 if (fSecondPassForTransparency) {
00128 if (!treatAsTransparent) {
00129 return false;
00130 }
00131 }
00132
00133
00134 if (fThirdPassForNonHiddenMarkers) {
00135 if (!treatAsNotHidden) {
00136 return false;
00137 }
00138 }
00139 }
00140
00141
00142 if (fpViewer->GetViewParameters().IsPicking()) {
00143 glLoadName(++fPickName);
00144 G4AttHolder* holder = new G4AttHolder;
00145 LoadAtts(visible, holder);
00146 fPickMap[fPickName] = holder;
00147 }
00148
00149 if (transparency_enabled) {
00150 glColor4d(c.GetRed(),c.GetGreen(),c.GetBlue(),c.GetAlpha());
00151 } else {
00152 glColor3d(c.GetRed(),c.GetGreen(),c.GetBlue());
00153 }
00154
00155 return true;
00156 }
00157
00158 void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Polyline& polyline)
00159 {
00160 G4bool furtherprocessing = AddPrimitivePreamble(polyline);
00161 if (furtherprocessing) {
00162 G4OpenGLSceneHandler::AddPrimitive(polyline);
00163 }
00164 }
00165
00166 void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Polymarker& polymarker)
00167 {
00168 G4bool furtherprocessing = AddPrimitivePreamble(polymarker);
00169 if (furtherprocessing) {
00170 G4OpenGLSceneHandler::AddPrimitive(polymarker);
00171 }
00172 }
00173
00174 void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Text& text)
00175 {
00176
00177
00178 G4bool furtherprocessing = AddPrimitivePreamble(text);
00179 if (furtherprocessing) {
00180 G4OpenGLSceneHandler::AddPrimitive(text);
00181 }
00182 }
00183
00184 void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Circle& circle)
00185 {
00186 G4bool furtherprocessing = AddPrimitivePreamble(circle);
00187 if (furtherprocessing) {
00188 G4OpenGLSceneHandler::AddPrimitive(circle);
00189 }
00190 }
00191
00192 void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Square& square)
00193 {
00194 G4bool furtherprocessing = AddPrimitivePreamble(square);
00195 if (furtherprocessing) {
00196 G4OpenGLSceneHandler::AddPrimitive(square);
00197 }
00198 }
00199
00200 void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Scale& scale)
00201 {
00202 G4bool furtherprocessing = AddPrimitivePreamble(scale);
00203 if (furtherprocessing) {
00204 G4OpenGLSceneHandler::AddPrimitive(scale);
00205 }
00206 }
00207
00208 void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4Polyhedron& polyhedron)
00209 {
00210
00211
00212 G4bool furtherprocessing = AddPrimitivePreamble(polyhedron);
00213 if (furtherprocessing) {
00214 G4OpenGLSceneHandler::AddPrimitive(polyhedron);
00215 }
00216 }
00217
00218 void G4OpenGLImmediateSceneHandler::AddPrimitive (const G4NURBS& nurbs)
00219 {
00220
00221
00222 G4bool furtherprocessing = AddPrimitivePreamble(nurbs);
00223 if (furtherprocessing) {
00224 G4OpenGLSceneHandler::AddPrimitive(nurbs);
00225 }
00226 }
00227
00228 void G4OpenGLImmediateSceneHandler::BeginPrimitives
00229 (const G4Transform3D& objectTransformation)
00230 {
00231 G4OpenGLSceneHandler::BeginPrimitives (objectTransformation);
00232
00233 G4OpenGLTransform3D oglt (objectTransformation);
00234
00235 glPushMatrix();
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 glMultMatrixd (oglt.GetGLMatrix ());
00248 }
00249
00250 void G4OpenGLImmediateSceneHandler::EndPrimitives ()
00251 {
00252 glPopMatrix();
00253
00254
00255 ScaledFlush();
00256
00257 G4OpenGLSceneHandler::EndPrimitives ();
00258 }
00259
00260 void G4OpenGLImmediateSceneHandler::BeginPrimitives2D
00261 (const G4Transform3D& objectTransformation)
00262 {
00263 G4OpenGLSceneHandler::BeginPrimitives2D(objectTransformation);
00264
00265
00266
00267 glMatrixMode (GL_PROJECTION);
00268 glPushMatrix();
00269 glLoadIdentity();
00270 glOrtho (-1., 1., -1., 1., -G4OPENGL_FLT_BIG, G4OPENGL_FLT_BIG);
00271 glMatrixMode (GL_MODELVIEW);
00272 glPushMatrix();
00273 glLoadIdentity();
00274 G4OpenGLTransform3D oglt (objectTransformation);
00275 glMultMatrixd (oglt.GetGLMatrix ());
00276 glDisable(GL_DEPTH_TEST);
00277 glDisable (GL_LIGHTING);
00278 }
00279
00280 void G4OpenGLImmediateSceneHandler::EndPrimitives2D()
00281 {
00282
00283 glMatrixMode (GL_PROJECTION);
00284 glPopMatrix();
00285 glMatrixMode (GL_MODELVIEW);
00286 glPopMatrix();
00287
00288
00289 glFlush ();
00290
00291 G4OpenGLSceneHandler::EndPrimitives2D ();
00292 }
00293
00294 void G4OpenGLImmediateSceneHandler::BeginModeling () {
00295 G4VSceneHandler::BeginModeling();
00296 }
00297
00298 void G4OpenGLImmediateSceneHandler::EndModeling () {
00299 G4VSceneHandler::EndModeling ();
00300 }
00301
00302 void G4OpenGLImmediateSceneHandler::ClearTransientStore ()
00303 {
00304
00305 if (fpViewer) {
00306 fpViewer -> SetView ();
00307 fpViewer -> ClearView ();
00308 fpViewer -> DrawView ();
00309 }
00310 }
00311
00312 G4int G4OpenGLImmediateSceneHandler::fSceneIdCount = 0;
00313
00314 #endif