Files
geant4/source/visualization/G4Ray/include/G4RayView.hh
T
2016-06-01 15:25:35 +02:00

169 lines
5.2 KiB
C++

// This code implementation is the intellectual property of
// the RD44 GEANT4 collaboration.
//
// By copying, distributing or modifying the Program (or any work
// based on the Program) you indicate your acceptance of this statement,
// and all its terms.
//
// $Id: G4RayView.hh,v 2.2 1998/11/06 13:41:51 allison Exp $
// GEANT4 tag $Name: geant4-00 $
//
//
// Nikos Savvas 1st June 1997
// GEANT4 Ray Tracing view.
#include "G4RunManager.hh"
#include "G4RaySteppingAction.hh"
#include "G4RayPrimaryGeneratorAction.hh"
#ifndef G4RAYVIEW_HH
#define G4RAYVIEW_HH
#include "G4VView.hh"
#include "G4Colour.hh"
#include "G4VPhysicalVolume.hh"
#include <rw/tvordvec.h>
#include <rw/tvhdict.h>
class G4RayScene;
class G4RaySteppingAction;
class G4RayColourCell {
public:
G4RayColourCell (): red (0), green (0), blue (0), nHits (0) {}
G4RayColourCell (float rr, float gg, float bb, G4int ii):
red (rr), green (gg), blue (bb), nHits (ii) {}
float red, green, blue;
G4int nHits; // No. of ray hits using this colour.
G4bool operator == (const G4RayColourCell& h) const {
return this == &h;
}
};
class G4RayCoordinate {
public:
G4RayCoordinate (): coord (0) {}
G4RayCoordinate (G4double x, G4double y):
coord (((unsigned int) (0x7fff * (x + 1.0))) |
((unsigned int) (0x7fff * (1.0 - y)) << 16)) {}
// Assumes -1.0 <= x, y <= 1.0. Assigns 16 bits each.
unsigned int coord;
G4bool operator == (const G4RayCoordinate& c) const {
return coord == c.coord;
}
};
class G4RayHitColour {
public:
G4RayHitColour (): colour (0) {}
G4RayHitColour (float r, float g, float b):
colour ((((unsigned int) (0x3ff * r)) << 20) |
(((unsigned int) (0x3ff * g)) << 10) |
((unsigned int) (0x3ff * b))) {}
// Assumes 0.0 <= r, g, b <= 1.0. Assigns 10 bits each.
unsigned int colour;
G4bool operator == (const G4RayHitColour& h) const {
return colour == h.colour;
}
float GetRed () {return (float ((colour >> 20) )) / 0x3ff;}
float GetGreen () {return (float ((colour >> 10) & 0x3ff)) / 0x3ff;}
float GetBlue () {return (float ((colour ) & 0x3ff)) / 0x3ff;}
};
class G4RayView: virtual public G4VView {
public:
G4RayView (G4RayScene& scene, const G4String& name = "");
~G4RayView();
G4double GetResolution () const;
void SetResolution (G4double resolution);
protected:
void SetView ();
void InitialiseImage ();
void TriggerRedraw ();
G4bool Scan (int& i, int& j, int& k,
float& red, float& green, float& blue,
int& iPixVal);
// Iterate over window, return false when finished. Return i, j,
// and k which define a coloured Square of side k whose upper left
// corner is (i, j). Note origin is at upper left corner of window
// - X and PostScript convention. iPixVal is the pixel value for
// this colour, i.e., the key in fRayHitColourIndex.
// The following static members define an image. They are static so
// that (a) there is only ever one of them (they can take a lot of
// memory) and (b) any object of the class or its descendants can
// access it. It is *not* cleared by ClearView (). It is only
// cleared by a change of view parameters and some other crucial
// parameters. It can be progressively refined by multiple calls to
// DrawView.
static G4ViewParameters fImageViewParameters;
static G4double fInitialResolution;
static G4double fRequestedResolution;
static G4double fCurrentResolution;
static G4float fMaxMinColourSeparation;
static G4int fImageWidth, fImageHeight;
static G4int fMaxImageMapEntries;
static G4bool fImageMapRejigged;
static G4bool fTriggerRescan;
static G4int fWaitLimit; // Waits between refresh.
static G4int fWaitCount;
static RWTValOrderedVector <G4RayColourCell> fRayHitColourMap;
static RWTValHashDictionary <G4RayCoordinate, G4RayHitColour> fRayHits;
static unsigned int RayCoordHash (const G4RayCoordinate& rayCoord);
static RWTValHashDictionary <G4RayHitColour, G4int> fRayHitColourIndex;
static unsigned int RayColourHash (const G4RayHitColour& rayColour);
private:
void Trace (G4double x, G4double y, float& red, float& green, float& blue);
// Trace the ray from (x, y) in screen coordinates (-1 <= x,y <= 1)
// and fill colour.
void CompactColour (G4bool Print);
float ColourSeparation (float ri, float gi, float bi,
float rj, float gj, float bj);
static void ChangePixVals (const G4RayHitColour& colour,
G4int& index, void* ij);
static void DecrementPixVals (const G4RayHitColour& colour,
G4int& index, void* ij);
static void PrintPixVals (const G4RayHitColour& colour,
G4int& index, void* ij);
G4RayScene& fScene; // Graphics Scene for this view.
G4Vector3D fXprime;
G4Vector3D fYprime;
G4Point3D fCenterofscreen;
G4Point3D fCamerapoint;
G4RunManager* fG4RayRunManager ;
G4RaySteppingAction* fG4RaySteppingAction;
G4RayPrimaryGeneratorAction* fG4RayGenerator;
G4ParticleGun * fG4RayGun ;
G4VPhysicalVolume * fpWorld;
};
#include "G4RayView.icc"
#endif