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