Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // >> 23 // >> 24 // $Id: G4OpenInventorViewer.cc,v 1.9 2002/11/27 12:46:07 johna Exp $ >> 25 // GEANT4 tag $Name: geant4-05-00 $ >> 26 // >> 27 /* >> 28 * jck 05 Feb 1997 - Initial Implementation >> 29 * jck 21 Apr 1997 >> 30 * Mods for SoXtHepViewer >> 31 * gb : on Win32 use an SoXtExaminerViewer. >> 32 */ >> 33 #ifdef G4VIS_BUILD_OI_DRIVER 26 34 27 // 03-MAY-2021 F.W. Jones: removed the camera << 35 #include <Inventor/Xt/SoXt.h> 28 // since the group node sensor receives all ca << 36 #include <Inventor/nodes/SoSelection.h> 29 // can update the view parameters, irrespectiv << 37 #include <Inventor/nodes/SoSelection.h> 30 // camera type. << 31 38 32 // this : << 39 #include "G4SoWindow.hh" 33 #include "G4OpenInventorViewer.hh" << 34 40 35 #include <Inventor/nodes/SoSelection.h> << 41 #ifdef WIN32 36 #include <Inventor/nodes/SoShape.h> << 42 #include <Inventor/Xt/viewers/SoXtExaminerViewer.h> 37 #include <Inventor/nodes/SoOrthographicCamera. << 43 #else 38 #include <Inventor/nodes/SoPerspectiveCamera.h << 44 #include <HEPVis/Xt/viewers/SoXtHepViewer.h> 39 #include <Inventor/actions/SoCallbackAction.h> << 45 #endif 40 #include <Inventor/actions/SoWriteAction.h> << 41 #include <Inventor/sensors/SoNodeSensor.h> << 42 << 43 #include "HEPVis/nodes/SoImageWriter.h" << 44 #include "HEPVis/actions/SoGL2PSAction.h" << 45 #include "HEPVis/actions/SoCounterAction.h" << 46 #include "HEPVis/actions/SoAlternateRepAction. << 47 46 48 #include "G4OpenInventor.hh" 47 #include "G4OpenInventor.hh" >> 48 #include "G4OpenInventorViewer.hh" 49 #include "G4OpenInventorSceneHandler.hh" 49 #include "G4OpenInventorSceneHandler.hh" >> 50 50 #include "G4VInteractorManager.hh" 51 #include "G4VInteractorManager.hh" 51 #include "G4Scene.hh" << 52 #include "Geant4_SoPolyhedron.h" << 53 #include "G4AttValue.hh" << 54 #include "G4AttDef.hh" << 55 #include "G4AttCheck.hh" << 56 #include "G4AttHolder.hh" << 57 << 58 G4OpenInventorViewer::G4OpenInventorViewer( << 59 G4OpenInventorSceneHandler& sceneHandler << 60 ,const G4String& name) << 61 :G4VViewer(sceneHandler, sceneHandler.Incremen << 62 ,fG4OpenInventorSceneHandler(sceneHandler) << 63 ,fInteractorManager(0) << 64 ,fSoSelection(0) << 65 ,fSoImageWriter(0) << 66 ,fGL2PSAction(0) //To be set be suclass. << 67 ,fGroupCameraSensor(0) << 68 //,fCameraSensor(0) << 69 { << 70 fVP.SetAutoRefresh(true); << 71 fDefaultVP.SetAutoRefresh(true); << 72 fVP.SetPicking(true); << 73 fDefaultVP.SetPicking(true); << 74 << 75 //FIXME : G.Barrand : not convinced that we << 76 // For viewing of all objects by default : << 77 //fDefaultVP.SetCulling(false); << 78 //fVP.SetCulling(false); << 79 52 80 fInteractorManager = << 53 // 81 ((G4OpenInventor*)fG4OpenInventorSceneHand << 54 // Global variables 82 GetInteractorManager(); << 55 // >> 56 >> 57 //static void SecondaryLoopPostAction (); 83 58 84 // Main user scene graph root sent to the vi << 59 void G4OpenInventorViewer::FinishView () { 85 fSoSelection = new SoSelection; << 60 if(fViewer==NULL) return; 86 fSoSelection->ref(); << 61 #ifdef WIN32 87 fSoSelection->addSelectionCallback(Selection << 62 ((SoXtViewer*)fViewer)->viewAll(); 88 //fSoSelection->addDeselectionCallback(Desel << 63 ((SoXtViewer*)fViewer)->saveHomePosition(); 89 fSoSelection->policy = SoSelection::SINGLE; << 64 #else 90 << 65 ((SoXtHepViewer*)fViewer)->getCurrentViewer()->viewAll(); 91 SoGroup* group = new SoGroup; << 66 ((SoXtHepViewer*)fViewer)->getCurrentViewer()->saveHomePosition(); 92 fSoSelection->addChild(group); << 67 #endif 93 << 94 // Have a camera under fSoSelection in orde << 95 // that the below SceneGraphSensor be notife << 96 // when the viewer changes the camera type. << 97 // But we put the camera under a SoGroup so << 98 // the SceneGraphSensor be not triggered at << 99 // under the fG4OpenInventorSceneHandler.fRo << 100 SoOrthographicCamera* camera = new SoOrthogr << 101 camera->viewportMapping.setValue(SoCamera::A << 102 //camera->aspectRatio.setValue(10); << 103 camera->position.setValue(0,0,10); << 104 camera->orientation.setValue(SbRotation(SbVe << 105 camera->height.setValue(10); << 106 camera->nearDistance.setValue(1); << 107 camera->farDistance.setValue(100); << 108 camera->focalDistance.setValue(10); << 109 group->addChild(camera); << 110 << 111 {SoInput soInput; << 112 if(soInput.openFile("g4view.iv",TRUE)) { << 113 SoSeparator* separator = SoDB::readAll(&so << 114 if(separator) fSoSelection->addChild(separ << 115 }} << 116 << 117 fSoSelection->addChild(fG4OpenInventorSceneH << 118 << 119 // SoImageWriter should be the last. << 120 fSoImageWriter = new SoImageWriter(); << 121 fSoImageWriter->fileName.setValue("g4out.ps" << 122 fSoSelection->addChild(fSoImageWriter); << 123 << 124 // Sensors : << 125 // To detect that the viewer had changed the << 126 fGroupCameraSensor = new SoNodeSensor(GroupC << 127 fGroupCameraSensor->setPriority(0);//Needed << 128 fGroupCameraSensor->attach(group); << 129 // FWJ Upgraded the group sensor so the came << 130 // fCameraSensor = new SoNodeSensor(CameraS << 131 // fCameraSensor->setPriority(0);//Needed i << 132 // fCameraSensor->attach(camera); << 133 } 68 } 134 69 135 G4OpenInventorViewer::~G4OpenInventorViewer () << 70 // 136 // fCameraSensor->detach(); << 71 // Exit 137 // delete fCameraSensor; << 72 // 138 fGroupCameraSensor->detach(); << 73 int quitCB(void* interactorManager) { 139 delete fGroupCameraSensor; << 74 ((G4VInteractorManager*)interactorManager) -> 140 fSoSelection->unref(); << 75 RequireExitSecondaryLoop (OIV_EXIT_CODE); >> 76 return 0; 141 } 77 } 142 78 >> 79 //static void SecondaryLoopPostAction () >> 80 //{ >> 81 // Display *display = fViewer->getDisplay(); >> 82 // XSync(display, False); >> 83 // if(interactorManager -> GetExitSecondaryLoopCode ()==OIV_EXIT_CODE) { >> 84 // if (fShell!=NULL) XtRealizeWidget(fShell); >> 85 // } >> 86 //} >> 87 143 void G4OpenInventorViewer::KernelVisitDecision 88 void G4OpenInventorViewer::KernelVisitDecision () { 144 89 145 // If there's a significant difference with 90 // If there's a significant difference with the last view parameters 146 // of either the scene handler or this viewe 91 // of either the scene handler or this viewer, trigger a rebuild. 147 92 148 if ( 93 if ( 149 //??fG4OpenInventorSceneHandler.fPODLLis 94 //??fG4OpenInventorSceneHandler.fPODLList.size() == 0 || 150 // We need a test for empty scene graph, 95 // We need a test for empty scene graph, such as 151 // staticRoot.size() or something??????? 96 // staticRoot.size() or something?????????? See temporary fix 152 // in contructor. (John Allison Aug 200 97 // in contructor. (John Allison Aug 2001) >> 98 CompareForKernelVisit(fG4OpenInventorSceneHandler.fLastVP) || 153 CompareForKernelVisit(fLastVP)) { 99 CompareForKernelVisit(fLastVP)) { 154 NeedKernelVisit (); 100 NeedKernelVisit (); 155 } 101 } >> 102 fLastVP = fVP; >> 103 fG4OpenInventorSceneHandler.fLastVP = fVP; 156 } 104 } 157 105 158 G4bool G4OpenInventorViewer::CompareForKernelV << 106 G4bool G4OpenInventorViewer::CompareForKernelVisit >> 107 (G4ViewParameters& lastVP) { 159 108 160 if ( 109 if ( 161 (vp.GetDrawingStyle () != fVP.GetDraw << 110 (fLastVP.GetDrawingStyle () != fVP.GetDrawingStyle ()) || 162 (vp.GetNumberOfCloudPoints() != fVP.Get << 111 (fLastVP.GetRepStyle () != fVP.GetRepStyle ()) || 163 (vp.IsAuxEdgeVisible () != fVP.IsAuxEd << 112 (fLastVP.IsCulling () != fVP.IsCulling ()) || 164 (vp.IsCulling () != fVP.IsCulli << 113 (fLastVP.IsCullingInvisible () != fVP.IsCullingInvisible ()) || 165 (vp.IsCullingInvisible () != fVP.IsCulli << 114 (fLastVP.IsDensityCulling () != fVP.IsDensityCulling ()) || 166 (vp.IsDensityCulling () != fVP.IsDensi << 115 (fLastVP.IsCullingCovered () != fVP.IsCullingCovered ()) || 167 (vp.IsCullingCovered () != fVP.IsCulli << 116 (fLastVP.IsSection () != fVP.IsSection ()) || 168 (vp.GetCBDAlgorithmNumber() != << 117 // No need to visit kernel if section plane changes. 169 fVP.GetCBDAlgorithmNumber()) << 118 (fLastVP.IsCutaway () != fVP.IsCutaway ()) || 170 (vp.IsSection () != fVP.IsSecti << 119 (fLastVP.GetCutawayPlanes ().size () != 171 (vp.IsCutaway () != fVP.IsCutaw << 120 fVP.GetCutawayPlanes ().size ()) || 172 // This assumes use of generic clipping << 121 // No need to visit kernel if cutaway planes change. 173 // DCUT, cutaway). If a decision is mad << 122 (fLastVP.IsExplode () != fVP.IsExplode ()) || 174 // this will need changing. See G4OpenG << 123 (fLastVP.GetNoOfSides () != fVP.GetNoOfSides ()) 175 // G4OpenGLStoredViewer.cc::CompareForKe << 124 ) { 176 // G4OpenGLStoredSceneHander::CreateSect << 125 return true;; 177 (vp.IsExplode () != fVP.IsExplo << 178 (vp.GetNoOfSides () != fVP.GetNoOf << 179 (vp.GetGlobalMarkerScale() != fVP.Get << 180 (vp.GetGlobalLineWidthScale() != fVP.Get << 181 (vp.IsMarkerNotHidden () != fVP.IsMarke << 182 (vp.GetDefaultVisAttributes()->GetColour << 183 fVP.GetDefaultVisAttributes()->GetColou << 184 (vp.GetDefaultTextVisAttributes()->GetCo << 185 fVP.GetDefaultTextVisAttributes()->GetC << 186 (vp.GetBackgroundColour ()!= fVP.GetBack << 187 (vp.IsPicking () != fVP.IsPicki << 188 // Scaling for Open Inventor is done by << 189 // needs a kernel visit. (In this respe << 190 // OpenGL drivers, where it's done in Se << 191 (vp.GetScaleFactor () != fVP.GetScal << 192 (vp.GetVisAttributesModifiers() != << 193 fVP.GetVisAttributesModifiers()) << 194 (vp.IsSpecialMeshRendering() != << 195 fVP.IsSpecialMeshRendering()) << 196 (vp.GetSpecialMeshRenderingOption() != << 197 fVP.GetSpecialMeshRenderingOption()) << 198 ) << 199 return true; << 200 << 201 if (vp.IsDensityCulling () && << 202 (vp.GetVisibleDensity () != fVP.GetVisib << 203 return true; << 204 << 205 if (vp.GetCBDAlgorithmNumber() > 0) { << 206 if (vp.GetCBDParameters().size() != fVP.Ge << 207 else if (vp.GetCBDParameters() != fVP.GetC << 208 } 126 } 209 << 127 if (fLastVP.IsDensityCulling () && 210 if (vp.IsSection () && << 128 (fLastVP.GetVisibleDensity () != fVP.GetVisibleDensity ())) 211 (vp.GetSectionPlane () != fVP.GetSection << 212 return true; 129 return true; 213 130 214 if (vp.IsCutaway ()) { << 131 if (fLastVP.IsExplode () && 215 if (vp.GetCutawayMode() != fVP.GetCutawayM << 132 (fLastVP.GetExplodeFactor () != fVP.GetExplodeFactor ())) 216 if (vp.GetCutawayPlanes ().size () != << 217 fVP.GetCutawayPlanes ().size ()) return true << 218 for (size_t i = 0; i < vp.GetCutawayPlanes << 219 if (vp.GetCutawayPlanes()[i] != fVP.GetC << 220 return true; << 221 } << 222 << 223 if (vp.IsExplode () && << 224 (vp.GetExplodeFactor () != fVP.GetExplod << 225 return true; 133 return true; 226 134 227 if (vp.IsSpecialMeshRendering() && << 228 (vp.GetSpecialMeshVolumes() != fVP.GetSp << 229 return true; << 230 << 231 return false; 135 return false; 232 } 136 } 233 137 234 void G4OpenInventorViewer::ClearView () { << 138 G4OpenInventorViewer::G4OpenInventorViewer 235 } << 139 (G4OpenInventorSceneHandler& sceneHandler, 236 << 140 const G4String& name) 237 void G4OpenInventorViewer::SetView () { << 141 :G4VViewer (sceneHandler, sceneHandler.IncrementViewCount(), name) 238 << 142 ,fG4OpenInventorSceneHandler(sceneHandler) 239 // Get G4 camera infos : << 143 ,fShell(NULL) 240 const G4Point3D target << 144 ,fWindow(NULL) 241 = fSceneHandler.GetScene()->GetStandardTar << 145 ,fViewer(NULL) 242 + fVP.GetCurrentTargetPoint (); << 146 ,fSelection(NULL) 243 G4double radius = fSceneHandler.GetScene()-> << 147 ,fInteractorManager(NULL) 244 if(radius<=0.) radius = 1.; << 245 const G4double cameraDistance = fVP.GetCamer << 246 const G4Vector3D& direction = fVP.GetViewpoi << 247 const G4Point3D cameraPosition = target + ca << 248 //const G4double pnear = fVP.GetNearDistance << 249 //const G4double pfar = fVP.GetFarDistance << 250 const G4Normal3D& up = fVP.GetUpVector (); << 251 << 252 /* << 253 printf("debug : target : %g %g %g\n",target. << 254 target. << 255 target. << 256 printf("debug : dir : %g %g %g\n",direction. << 257 direction. << 258 direction. << 259 printf("debug : pos : %g %g %g\n",cameraPosi << 260 cameraPosi << 261 cameraPosi << 262 //printf("debug : near %g far %g\n",pnear,pf << 263 */ << 264 << 265 SoCamera* camera = GetCamera(); << 266 if(!camera) return; << 267 << 268 // viewer camera setup : << 269 camera->position.setValue((float)cameraPosit << 270 (float)cameraPo << 271 (float)cameraPo << 272 << 273 SbVec3f sbTarget((float)target.x(), << 274 (float)target.y(), << 275 (float)target.z()); << 276 SbVec3f sbUp((float)up.x(), << 277 (float)up.y(), << 278 (float)up.z()); << 279 sbUp.normalize(); << 280 // Need Coin's camera->pointAt(sbTarget,sbUp << 281 // Stole Coin's code... << 282 pointAt(camera,sbTarget,sbUp); << 283 << 284 //camera->height.setValue(10); << 285 //camera->nearDistance.setValue((float)pnear << 286 //camera->farDistance.setValue((float)pfar); << 287 //camera->focalDistance.setValue((float)came << 288 << 289 if(camera->isOfType(SoOrthographicCamera::ge << 290 if (fVP.GetFieldHalfAngle() == 0.) { << 291 //FIXME : ((SoOrthographicCamera*)camera << 292 //FIXME : (Don't think we have to do tha << 293 } else { << 294 //FIXME : Have to set a perspective came << 295 //FIXME : viewer->setCameraType(SoPerspe << 296 //FIXME : ((SoPerspectiveCamera*)camera) << 297 //FIXME : (2.*fVP.GetFieldHalfAngle()) << 298 } << 299 } else if(camera->isOfType(SoPerspectiveCame << 300 if (fVP.GetFieldHalfAngle() == 0.) { << 301 //FIXME : Have to set an orthographic ca << 302 //FIXME : viewer->setCameraType(SoOrthog << 303 } else { << 304 //FIXME : ((SoPerspectiveCamera*)camera) << 305 //FIXME : (2.*fVP.GetFieldHalfAngle()) << 306 } << 307 } << 308 } << 309 << 310 //COIN_FUNCTION_EXTENSION << 311 void << 312 G4OpenInventorViewer::pointAt(SoCamera* camera << 313 { << 314 SbVec3f dir = targetpoint - camera->position << 315 if (dir.normalize() == 0.0f) return; << 316 lookAt(camera,dir, upvector); << 317 } << 318 << 319 //COIN_FUNCTION << 320 // Private method that calculates a new orient << 321 // direction and camera up vector. Vectors mus << 322 void << 323 G4OpenInventorViewer::lookAt(SoCamera* camera, << 324 { << 325 SbVec3f z = -dir; << 326 SbVec3f y = up; << 327 SbVec3f x = y.cross(z); << 328 << 329 // recompute y to create a valid coordinate << 330 y = z.cross(x); << 331 << 332 // normalize x and y to create an orthonorma << 333 y.normalize(); << 334 x.normalize(); << 335 << 336 // create a rotation matrix << 337 SbMatrix rot = SbMatrix::identity(); << 338 rot[0][0] = x[0]; << 339 rot[0][1] = x[1]; << 340 rot[0][2] = x[2]; << 341 << 342 rot[1][0] = y[0]; << 343 rot[1][1] = y[1]; << 344 rot[1][2] = y[2]; << 345 << 346 rot[2][0] = z[0]; << 347 rot[2][1] = z[1]; << 348 rot[2][2] = z[2]; << 349 << 350 camera->orientation.setValue(SbRotation(rot) << 351 } << 352 << 353 void << 354 G4OpenInventorViewer::lookedAt(SoCamera* camer << 355 { 148 { 356 SbRotation rot = camera->orientation.getValu << 149 fNeedKernelVisit = true; //?? Temporary, until KernelVisitDecision fixed. 357 SbMatrix mrot; rot.getValue(mrot); << 358 << 359 SbVec3f x, y, z; << 360 << 361 // create a rotation matrix << 362 x[0] = mrot[0][0]; << 363 x[1] = mrot[0][1]; << 364 x[2] = mrot[0][2]; << 365 << 366 y[0] = mrot[1][0]; << 367 y[1] = mrot[1][1]; << 368 y[2] = mrot[1][2]; << 369 << 370 z[0] = mrot[2][0]; << 371 z[1] = mrot[2][1]; << 372 z[2] = mrot[2][2]; << 373 << 374 dir = -z; << 375 dir.normalize(); << 376 up = SbVec3f(0.f,1.f,0.f); // Choose y-axis << 377 if (std::abs(up.dot(z)) > 1.e-6) { << 378 up = y; << 379 up.normalize(); << 380 } << 381 } << 382 << 383 void G4OpenInventorViewer::DrawView () { << 384 //G4cout << "debug Iv::DrawViewer " <<G4endl << 385 if (!fNeedKernelVisit) KernelVisitDecision() << 386 fLastVP= fVP; << 387 ProcessView(); << 388 FinishView(); << 389 } << 390 << 391 void G4OpenInventorViewer::ShowView () { << 392 fInteractorManager -> SecondaryLoop (); << 393 } << 394 << 395 // FWJ This sensor now performs the fVP update << 396 void G4OpenInventorViewer::GroupCameraSensorCB << 397 { << 398 G4OpenInventorViewer* This = (G4OpenInventor << 399 << 400 SoNode* node = ((SoNodeSensor*)aSensor)->get << 401 // printf("debug : GroupCameraSensorCB %s\n << 402 // node->getTypeId().getName().getSt << 403 << 404 if(node->isOfType(SoCamera::getClassTypeId() << 405 SoCamera* camera = (SoCamera*)node; << 406 << 407 // FWJ DEBUG << 408 // G4cout << " UPDATING fVP FROM CAME << 409 SbVec3f direction, up; << 410 lookedAt(camera, direction, up); << 411 This->fVP.SetViewpointDirection << 412 (G4Vector3D(-direction[0], -direction[1] << 413 This->fVP.SetUpVector(G4Vector3D(up[0], up << 414 << 415 SbVec3f pos = camera->position.getValue(); << 416 SbVec3f target = pos + direction * camera- << 417 << 418 This->fVP.SetCurrentTargetPoint(G4Point3D( << 419 << 420 // FWJ camera sensor no longer needed << 421 // Viewer had changed the camera type, << 422 // attach the fCameraSensor to the new cam << 423 // FWJ DEBUG << 424 // G4cout << " SWITCHING TO CAMERA " << 425 // This->fCameraSensor->detach(); << 426 // This->fCameraSensor->attach(camera); << 427 } << 428 << 429 } << 430 << 431 /* FWJ This sensor is no longer needed << 432 void G4OpenInventorViewer::CameraSensorCB(void << 433 G4OpenInventorViewer* This = (G4OpenInventor << 434 << 435 // printf("debug : CameraSensorCB\n"); << 436 << 437 SoNode* node = ((SoNodeSensor*)aSensor)->get << 438 // printf("debug : CameraSensorCB %s\n", << 439 // node->getTypeId().getName().getStri << 440 << 441 if(node->isOfType(SoCamera::getClassTypeId() << 442 SoCamera* camera = (SoCamera*)node; << 443 << 444 SbVec3f direction, up; << 445 lookedAt(camera,direction, up); << 446 This->fVP.SetViewpointDirection << 447 (G4Vector3D(-direction[0],-direction[1], << 448 This->fVP.SetUpVector(G4Vector3D(up[0],up[ << 449 150 450 SbVec3f pos = camera->position.getValue(); << 151 fInteractorManager = 451 SbVec3f target = pos + direction * camera- << 152 ((G4OpenInventor*)fG4OpenInventorSceneHandler.GetGraphicsSystem())-> >> 153 GetInteractorManager(); >> 154 //Widget toplevel = (Widget)fInteractorManager->GetMainInteractor (); 452 155 453 This->fVP.SetCurrentTargetPoint(G4Point3D( << 156 //fInteractorManager-> 454 } << 157 //AddSecondaryLoopPostAction ((G4SecondaryLoopAction)SecondaryLoopPostAction); 455 } << 456 */ << 457 158 458 void G4OpenInventorViewer::SelectionCB( << 159 G4cout << "Window name: " << fName << G4endl; 459 void* aThis << 160 // 460 ,SoPath* aPath << 161 // Selection 461 ) << 162 // 462 { << 163 fSelection = new SoSelection; 463 G4OpenInventorViewer* This = (G4OpenInventor << 164 fSelection->policy = SoSelection::SINGLE; 464 SoNode* node = ((SoFullPath*)aPath)->getTail << 165 fSelection->ref(); 465 G4AttHolder* attHolder = dynamic_cast<G4AttH << 166 fSelection->addChild(fG4OpenInventorSceneHandler.root); 466 if(attHolder && attHolder->GetAttDefs().size << 167 467 for (size_t i = 0; i < attHolder->GetAttDe << 168 Widget parent = (Widget)fInteractorManager->GetParentInteractor (); 468 G4cout << G4AttCheck(attHolder->GetAttVa << 169 469 attHolder->GetAttDefs()[i]); << 170 G4String wName = fName; 470 } << 171 const char* wname = wName.data(); >> 172 >> 173 #define SIZE 400 >> 174 if(parent==NULL) { //Create a shell window : >> 175 fWindow = new G4SoWindow(wname); >> 176 fWindow->setTitle(wname); >> 177 fWindow->setSize(SbVec2s(SIZE,SIZE)); >> 178 fShell = parent = fWindow->getWidget(); >> 179 fInteractorManager->AddShell(fShell); 471 } else { 180 } else { 472 G4String name((char*)node->getName().getSt << 181 char* str = fInteractorManager->GetCreationString (); 473 G4String cls((char*)node->getTypeId().getN << 182 if(str!=NULL) wname = str; 474 G4cout << "SoNode : " << node << 475 << " SoType : " << cls << 476 << " name : " << name << 477 << G4endl; << 478 G4cout << "No attributes attached." << G4e << 479 } 183 } 480 /*FIXME : to explore (need different button << 184 // 481 if(node->isOfType(Geant4_SoPolyhedron::getCl << 185 // Create and Customize the Viewer 482 Geant4_SoPolyhedron* polyhedron = (Geant4_ << 186 // 483 if(polyhedron->solid.getValue()==FALSE) << 187 #ifdef WIN32 484 polyhedron->solid.setValue(TRUE); << 188 fViewer = new SoXtExaminerViewer(parent,wname,TRUE); 485 else << 189 fViewer->setSize(SbVec2s(SIZE,SIZE)); 486 polyhedron->solid.setValue(FALSE); << 190 ((SoXtViewer*)fViewer)->setSceneGraph(fSelection); 487 }*/ << 191 ((SoXtViewer*)fViewer)->viewAll(); 488 This->fSoSelection->deselectAll(); << 192 ((SoXtViewer*)fViewer)->saveHomePosition(); 489 } << 193 #else 490 /* << 194 fViewer = new SoXtHepViewer (parent,wname,TRUE); 491 void G4OpenInventorViewer::DeselectionCB( << 195 ((SoXtHepViewer*)fViewer)->hideTextArea(); 492 void* aThis << 196 ((SoXtHepViewer*)fViewer)->resizeMain(SIZE,SIZE); 493 ,SoPath* aPath << 197 ((SoXtHepViewer*)fViewer)->setQuitCallback(quitCB, fInteractorManager); 494 ) << 198 ((SoXtHepViewer*)fViewer)->setSceneGraph(fSelection); 495 { << 199 ((SoXtHepViewer*)fViewer)->getCurrentViewer()->viewAll(); 496 //G4OpenInventorViewer* This = (G4OpenInvent << 200 ((SoXtHepViewer*)fViewer)->getCurrentViewer()->saveHomePosition(); 497 G4String name((char*)aPath->getTail()->getTy << 201 #endif 498 G4cout << "Deselect : " << name << G4endl; << 202 fViewer->setTitle(fName); 499 } << 203 fViewer->show(); 500 */ << 204 501 << 205 if(fWindow!=NULL) { 502 void G4OpenInventorViewer::DrawDetector() { << 206 fWindow->show(); 503 /* Replace this... - JA << 207 fInteractorManager->FlushAndWaitExecution (); 504 // DrawView does a ClearStore. Do not clear << 505 SoSeparator* tmp = fG4OpenInventorSceneHandl << 506 fG4OpenInventorSceneHandler.fTransientRoot = << 507 if (!fNeedKernelVisit) KernelVisitDecision() << 508 ProcessView(); << 509 fG4OpenInventorSceneHandler.fTransientRoot-> << 510 fG4OpenInventorSceneHandler.fTransientRoot = << 511 */ << 512 // ...by this... - JA << 513 DrawView(); << 514 } << 515 << 516 ////////////////////////////////////////////// << 517 /// Menu items callbacks ///////////////////// << 518 ////////////////////////////////////////////// << 519 << 520 void G4OpenInventorViewer::Escape(){ << 521 G4cout << "Escape..." <<G4endl; << 522 fInteractorManager->RequireExitSecondaryLoop << 523 } << 524 << 525 void G4OpenInventorViewer::WritePostScript(con << 526 if(!fGL2PSAction) return; << 527 fGL2PSAction->setFileName(aFile.c_str()); << 528 fGL2PSAction->setExportImageFormat_EPS(); << 529 fGL2PSAction->setTitleAndProducer("Geant4 ou << 530 G4cout << "Produce " << aFile << "..." << G4 << 531 if (fGL2PSAction->enableFileWriting()) { << 532 ViewerRender(); << 533 fGL2PSAction->disableFileWriting(); << 534 } 208 } 535 } << 536 209 537 void G4OpenInventorViewer::WritePDF(const G4St << 210 fInteractorManager->SetCreatedInteractor (fViewer -> getWidget()); 538 if(!fGL2PSAction) return; << 539 fGL2PSAction->setFileName(aFile.c_str()); << 540 fGL2PSAction->setExportImageFormat_PDF(); << 541 fGL2PSAction->setTitleAndProducer("Geant4 ou << 542 G4cout << "Produce " << aFile << "..." << G4 << 543 if (fGL2PSAction->enableFileWriting()) { << 544 ViewerRender(); << 545 fGL2PSAction->disableFileWriting(); << 546 } << 547 } 211 } 548 212 549 void G4OpenInventorViewer::WritePixmapPostScri << 213 G4OpenInventorViewer::~G4OpenInventorViewer () { 550 fSoImageWriter->fileName.setValue(aFile.c_st << 214 if(fShell!=NULL) fInteractorManager -> RemoveShell (fShell); 551 //imageWriter->format.setValue(SoImageWriter << 215 if(fViewer!=NULL) { 552 fSoImageWriter->enable(); << 216 #ifdef WIN32 553 ViewerRender(); << 217 delete ((SoXtExaminerViewer*)fViewer); 554 fSoImageWriter->disable(); << 218 #else 555 if(fSoImageWriter->getStatus()) { << 219 delete ((SoXtHepViewer*)fViewer); 556 G4cout << G4String(fSoImageWriter->fileNam << 220 #endif 557 << " produced." << 558 << G4endl; << 559 } else { << 560 G4cout << G4String(fSoImageWriter->fileNam << 561 << " not produced." << 562 << G4endl; << 563 } << 564 } << 565 << 566 void G4OpenInventorViewer::WriteInventor(const << 567 G4cout << "Produce " << aFile << "..." << G4 << 568 << 569 SbBool genAlternateRep = TRUE; << 570 //SbBool binary = FALSE; << 571 SbBool binary = TRUE; << 572 SoAlternateRepAction alternateRepAction; << 573 if(genAlternateRep==TRUE) { << 574 alternateRepAction.setGenerate(TRUE); //Cl << 575 alternateRepAction.apply(fSoSelection); << 576 } << 577 << 578 SoWriteAction writeAction; << 579 writeAction.getOutput()->openFile(aFile.c_st << 580 writeAction.getOutput()->setBinary(binary); << 581 writeAction.apply(fSoSelection); << 582 writeAction.getOutput()->closeFile(); << 583 << 584 if(genAlternateRep==TRUE) { << 585 alternateRepAction.setGenerate(FALSE); //C << 586 alternateRepAction.apply(fSoSelection); << 587 } 221 } 588 << 222 if(fWindow!=NULL) delete fWindow; 589 << 223 if(fSelection!=NULL) fSelection->unref(); 590 << 591 } 224 } 592 225 593 struct Counter { << 226 void G4OpenInventorViewer::ClearView () { 594 int fTriangles; << 595 int fLineSegments; << 596 int fPoints; << 597 }; << 598 << 599 static void CountTrianglesCB( << 600 void* userData << 601 ,SoCallbackAction* << 602 ,const SoPrimitiveVertex* << 603 ,const SoPrimitiveVertex*, << 604 const SoPrimitiveVertex*) << 605 { << 606 Counter* counter = (Counter*)userData; << 607 counter->fTriangles++; << 608 } << 609 << 610 static void CountLineSegmentsCB( << 611 void* userData << 612 ,SoCallbackAction* << 613 ,const SoPrimitiveVertex* << 614 ,const SoPrimitiveVertex*) << 615 { << 616 Counter* counter = (Counter*)userData; << 617 counter->fLineSegments++; << 618 } 227 } 619 228 620 static void CountPointsCB( << 229 void G4OpenInventorViewer::SetView () { 621 void* userData << 622 ,SoCallbackAction* << 623 ,const SoPrimitiveVertex*) << 624 { << 625 Counter* counter = (Counter*)userData; << 626 counter->fPoints++; << 627 } 230 } 628 231 629 void G4OpenInventorViewer::SceneGraphStatistic << 232 void G4OpenInventorViewer::DrawView () { 630 Counter counter; << 233 G4cout << "debug Iv::DrawViewer " <<G4endl; 631 counter.fTriangles = 0; << 234 KernelVisitDecision (); 632 counter.fLineSegments = 0; << 235 ProcessView (); 633 counter.fPoints = 0; << 236 FinishView (); 634 << 635 SoCallbackAction callbackAction; << 636 callbackAction.addTriangleCallback << 637 (SoShape::getClassTypeId(),CountTrianglesC << 638 callbackAction.addLineSegmentCallback << 639 (SoShape::getClassTypeId(),CountLineSegmen << 640 callbackAction.addPointCallback << 641 (SoShape::getClassTypeId(),CountPointsCB,( << 642 callbackAction.apply(fSoSelection); << 643 << 644 SoCounterAction counterAction; << 645 counterAction.apply(fSoSelection); << 646 int nodes = counterAction.getCount(); << 647 << 648 counterAction.setLookFor(SoCounterAction::TY << 649 counterAction.setType(SoShape::getClassTypeI << 650 counterAction.apply(fSoSelection); << 651 int shapes = counterAction.getCount(); << 652 << 653 G4cout << "Number of triangles : " << counte << 654 G4cout << "Number of line segments : " << co << 655 G4cout << "Number of points : " << counter.f << 656 G4cout << "Number of nodes : " << nodes << G << 657 G4cout << "Number of shapes : " << shapes << << 658 } 237 } 659 238 660 void G4OpenInventorViewer::EraseDetector() { << 239 void G4OpenInventorViewer::ShowView () { 661 fG4OpenInventorSceneHandler.fDetectorRoot->r << 240 fInteractorManager -> SecondaryLoop (); 662 } << 663 void G4OpenInventorViewer::EraseEvent() { << 664 fG4OpenInventorSceneHandler.fTransientRoot-> << 665 } 241 } 666 242 667 void G4OpenInventorViewer::SetPreviewAndFull() << 243 #endif 668 fG4OpenInventorSceneHandler.fPreviewAndFull << 669 244 670 NeedKernelVisit(); << 671 DrawDetector(); << 672 } << 673 245 674 void G4OpenInventorViewer::SetPreview() { << 675 fG4OpenInventorSceneHandler.fPreviewAndFull << 676 246 677 NeedKernelVisit(); << 678 DrawDetector(); << 679 } << 680 247 681 // When ViewParameter <-> SoCamera mapping rea << 682 // uncomment the below << 683 //#define USE_SET_VIEW << 684 << 685 void G4OpenInventorViewer::SetSolid() { << 686 G4ViewParameters vp = GetViewParameters(); << 687 G4ViewParameters::DrawingStyle existingStyle << 688 //From G4VisCommandsViewerSet : /vis/viewer/ << 689 switch (existingStyle) { << 690 case G4ViewParameters::wireframe: << 691 vp.SetDrawingStyle(G4ViewParameters::hsr); << 692 break; << 693 case G4ViewParameters::hlr: << 694 vp.SetDrawingStyle(G4ViewParameters::hlhsr << 695 break; << 696 case G4ViewParameters::hsr: << 697 break; << 698 case G4ViewParameters::hlhsr: << 699 break; << 700 case G4ViewParameters::cloud: << 701 vp.SetDrawingStyle(G4ViewParameters::hsr); << 702 break; << 703 } << 704 SetViewParameters(vp); << 705 DrawDetector(); << 706 } << 707 void G4OpenInventorViewer::SetWireFrame() { << 708 G4ViewParameters vp = GetViewParameters(); << 709 G4ViewParameters::DrawingStyle existingStyle << 710 switch (existingStyle) { << 711 case G4ViewParameters::wireframe: << 712 break; << 713 case G4ViewParameters::hlr: << 714 break; << 715 case G4ViewParameters::hsr: << 716 vp.SetDrawingStyle(G4ViewParameters::wiref << 717 break; << 718 case G4ViewParameters::hlhsr: << 719 vp.SetDrawingStyle(G4ViewParameters::hlr); << 720 break; << 721 case G4ViewParameters::cloud: << 722 vp.SetDrawingStyle(G4ViewParameters::wiref << 723 break; << 724 } << 725 SetViewParameters(vp); << 726 DrawDetector(); << 727 } << 728 248 729 249 730 void G4OpenInventorViewer::SetReducedWireFrame << 731 G4ViewParameters vp = GetViewParameters(); << 732 250 733 // Set the wire frame kind : << 734 vp.SetAuxEdgeVisible(!aValue); << 735 251 736 // Set wire frame : << 737 G4ViewParameters::DrawingStyle existingStyle << 738 switch (existingStyle) { << 739 case G4ViewParameters::wireframe: << 740 break; << 741 case G4ViewParameters::hlr: << 742 break; << 743 case G4ViewParameters::hsr: << 744 vp.SetDrawingStyle(G4ViewParameters::wiref << 745 break; << 746 case G4ViewParameters::hlhsr: << 747 vp.SetDrawingStyle(G4ViewParameters::hlr); << 748 break; << 749 case G4ViewParameters::cloud: << 750 vp.SetDrawingStyle(G4ViewParameters::wiref << 751 break; << 752 } << 753 SetViewParameters(vp); << 754 NeedKernelVisit(); // Just in case it was al << 755 DrawDetector(); << 756 } << 757 << 758 void G4OpenInventorViewer::UpdateScene() { << 759 /* Replace this... - JA << 760 fG4OpenInventorSceneHandler.ClearStore(); << 761 ClearView(); << 762 if (!fNeedKernelVisit) KernelVisitDecision() << 763 ProcessView(); << 764 ShowView(); << 765 */ << 766 // ...by this - JA << 767 NeedKernelVisit(); << 768 DrawView(); << 769 } << 770 G4String G4OpenInventorViewer::Help(const G4St << 771 if(aTopic=="controls") { << 772 return G4String("\ << 773 Controls on an Inventor examiner viewer are :\ << 774 - in picking mode (cursor is the upper left ar << 775 Ctrl + pick a volume : see daughters.\n\ << 776 Shift + pick a volume : see mother.\n\ << 777 - in viewing mode (cursor is the hand)\n\ << 778 Left-button + pointer move : rotate.\n\ << 779 Ctrl+Left-button + pointer move : pan.\n\ << 780 Ctrl+Shift+Left-button + pointer move : scal << 781 Middle-button + pointer move : pan.\n\ << 782 Right-button : popup menu.\n"); << 783 } else { << 784 return ""; << 785 } << 786 } << 787 252