g4tools  5.4.0
perspective
Go to the documentation of this file.
1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
2 // See the file tools.license for terms.
3 
4 #ifndef tools_sg_perspective
5 #define tools_sg_perspective
6 
7 #include "base_camera"
8 
9 #include "../mathf"
10 
11 namespace tools {
12 namespace sg {
13 
14 class perspective : public base_camera {
16 public:
17  virtual float near_height() const {
18  return 2.0f*znear.value()*ftan(height_angle.value()*0.5f);
19  }
20  virtual void zoom(float a_fac) {
21  //for exa :
22  // a_fac = 0.99f is a zoom in
23  // a_fac = 1.01f is a zoom out
25  }
26  virtual camera_type type() const {return camera_perspective;}
27 public:
29 public:
30  virtual const desc_fields& node_desc_fields() const {
32  static const desc_fields s_v(parent::node_desc_fields(),1, //WARNING : take care of count.
34  );
35  return s_v;
36  }
37 private:
38  void add_fields(){
40  }
41 public:
43  :parent()
44  ,height_angle(fpi()/4.0f) //45 degrees.
45  {
46 #ifdef TOOLS_MEM
47  mem::increment(s_class().c_str());
48 #endif
49  add_fields();
50  }
51  virtual ~perspective(){
52 #ifdef TOOLS_MEM
53  mem::decrement(s_class().c_str());
54 #endif
55  }
56 public:
57  perspective(const perspective& a_from)
58  :parent(a_from)
59  ,height_angle(a_from.height_angle)
60  {
61 #ifdef TOOLS_MEM
62  mem::increment(s_class().c_str());
63 #endif
64  add_fields();
65  }
67  parent::operator=(a_from);
68  height_angle = a_from.height_angle;
69  return *this;
70  }
71 public: //operators:
72  bool operator==(const perspective& a_from) const{
73  if(!parent::operator==(a_from)) return false;
74  if(height_angle!=a_from.height_angle) return false;
75  return true;
76  }
77  bool operator!=(const perspective& a_from) const {
78  return !operator==(a_from);
79  }
80 public:
81  void dump(std::ostream& a_out) {
82  parent::dump(a_out);
83  a_out << " height_angle " << height_angle.value() << std::endl;
84  }
85 
86 protected:
87  virtual void get_lrbt(unsigned int a_ww,unsigned int a_wh,
88  float& a_l,float& a_r,float& a_b,float& a_t) {
89  float aspect = float(a_ww)/float(a_wh);
90  float hh = near_height()*0.5f;
91  a_l = -aspect*hh;
92  a_r = aspect*hh;
93  a_b = -hh;
94  a_t = hh;
95  }
96 };
97 
98 inline perspective* cast_perspective(base_camera& a_bcam) {return safe_cast<base_camera,perspective>(a_bcam);}
99 
100 }}
101 
102 #endif
tools::sg::perspective::height_angle
sf< float > height_angle
Definition: perspective:28
tools::sg::perspective::operator!=
bool operator!=(const perspective &a_from) const
Definition: perspective:77
tools::sg::camera_type
camera_type
Definition: enums:167
TOOLS_NODE
#define TOOLS_NODE(a__class, a__sclass, a__parent)
Definition: node:324
tools::fpi
float fpi()
Definition: mathf:11
tools::sg::perspective::node_desc_fields
virtual const desc_fields & node_desc_fields() const
Definition: perspective:30
tools::sg::desc_fields
Definition: field_desc:148
tools::dump
void dump(std::ostream &a_out, const tools::array< T > &a_array, const std::string &a_title)
Definition: array:519
tools::ftan
float ftan(const float &x)
Definition: mathf:46
tools::sg::perspective::near_height
virtual float near_height() const
Definition: perspective:17
tools::sg::perspective::get_lrbt
virtual void get_lrbt(unsigned int a_ww, unsigned int a_wh, float &a_l, float &a_r, float &a_b, float &a_t)
Definition: perspective:87
tools::sg::perspective::operator=
perspective & operator=(const perspective &a_from)
Definition: perspective:66
tools::sg::camera_perspective
@ camera_perspective
Definition: enums:169
tools
inlined C code : ///////////////////////////////////
Definition: aida_ntuple:26
tools::sg::perspective::perspective
perspective()
Definition: perspective:42
tools::sg::node::add_field
void add_field(field *a_field)
Definition: node:128
tools::sg::perspective::zoom
virtual void zoom(float a_fac)
Definition: perspective:20
TOOLS_FIELD_DESC_NODE_CLASS
#define TOOLS_FIELD_DESC_NODE_CLASS(a__class)
Definition: field:68
tools::sg::perspective::~perspective
virtual ~perspective()
Definition: perspective:51
tools::sg::perspective::type
virtual camera_type type() const
Definition: perspective:26
tools::sg::perspective::operator==
bool operator==(const perspective &a_from) const
Definition: perspective:72
tools::sg::bsf::value
T & value()
Definition: bsf:98
tools::sg::perspective::dump
void dump(std::ostream &a_out)
Definition: perspective:81
tools::sg::base_camera
Definition: base_camera:24
tools::sg::cast_perspective
perspective * cast_perspective(base_camera &a_bcam)
Definition: perspective:98
tools::sg::perspective::perspective
perspective(const perspective &a_from)
Definition: perspective:57
tools::sg::base_camera::znear
sf< float > znear
Definition: base_camera:27
tools::sg::perspective
Definition: perspective:14
tools::sg::sf< float >
base_camera
TOOLS_ARG_FIELD_DESC
#define TOOLS_ARG_FIELD_DESC(a__field)
Definition: field:71