00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef LENS_H
00016 #define LENS_H
00017
00018 #include "pandabase.h"
00019
00020 #include "typedWritableReferenceCount.h"
00021 #include "luse.h"
00022 #include "geom.h"
00023 #include "updateSeq.h"
00024 #include "geomVertexData.h"
00025 #include "pointerTo.h"
00026
00027 class BoundingVolume;
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 class EXPCL_PANDA_GOBJ Lens : public TypedWritableReferenceCount {
00042 public:
00043 Lens();
00044 Lens(const Lens ©);
00045 void operator = (const Lens ©);
00046
00047 PUBLISHED:
00048 enum StereoChannel {
00049 SC_mono = 0x00,
00050 SC_left = 0x01,
00051 SC_right = 0x02,
00052 SC_stereo = 0x03,
00053 };
00054
00055 virtual PT(Lens) make_copy() const=0;
00056
00057 INLINE bool extrude(const LPoint2f &point2d,
00058 LPoint3f &near_point, LPoint3f &far_point) const;
00059 INLINE bool extrude(const LPoint3f &point2d,
00060 LPoint3f &near_point, LPoint3f &far_point) const;
00061 INLINE bool extrude_vec(const LPoint2f &point2d, LVector3f &vec3d) const;
00062 INLINE bool extrude_vec(const LPoint3f &point2d, LVector3f &vec3d) const;
00063 INLINE bool project(const LPoint3f &point3d, LPoint3f &point2d) const;
00064 INLINE bool project(const LPoint3f &point3d, LPoint2f &point2d) const;
00065
00066 INLINE void set_change_event(const string &event);
00067 INLINE const string &get_change_event() const;
00068
00069 void set_coordinate_system(CoordinateSystem cs);
00070 INLINE CoordinateSystem get_coordinate_system() const;
00071
00072 void clear();
00073
00074 void set_film_size(float width);
00075 INLINE void set_film_size(float width, float height);
00076 void set_film_size(const LVecBase2f &film_size);
00077 const LVecBase2f &get_film_size() const;
00078
00079 INLINE void set_film_offset(float x, float y);
00080 INLINE void set_film_offset(const LVecBase2f &film_offset);
00081 INLINE const LVector2f &get_film_offset() const;
00082
00083 void set_focal_length(float focal_length);
00084 float get_focal_length() const;
00085
00086 void set_min_fov(float min_fov);
00087 void set_fov(float fov);
00088 INLINE void set_fov(float hfov, float vfov);
00089 void set_fov(const LVecBase2f &fov);
00090 const LVecBase2f &get_fov() const;
00091 INLINE float get_hfov() const;
00092 INLINE float get_vfov() const;
00093 float get_min_fov() const;
00094
00095 void set_aspect_ratio(float aspect_ratio);
00096 float get_aspect_ratio() const;
00097
00098 INLINE void set_near(float near_distance);
00099 INLINE float get_near() const;
00100 INLINE void set_far(float far_distance);
00101 INLINE float get_far() const;
00102 INLINE void set_near_far(float near_distance, float far_distance);
00103
00104 static float get_default_near();
00105 static float get_default_far();
00106
00107 INLINE void set_view_hpr(float h, float p, float r);
00108 void set_view_hpr(const LVecBase3f &view_hpr);
00109 const LVecBase3f &get_view_hpr() const;
00110 INLINE void set_view_vector(float x, float y, float z, float i, float j, float k);
00111 void set_view_vector(const LVector3f &view_vector, const LVector3f &up_vector);
00112 const LVector3f &get_view_vector() const;
00113 const LVector3f &get_up_vector() const;
00114 LPoint3f get_nodal_point() const;
00115
00116 void set_interocular_distance(float interocular_distance);
00117 float get_interocular_distance() const;
00118 void set_convergence_distance(float convergence_distance);
00119 float get_convergence_distance() const;
00120
00121 void set_view_mat(const LMatrix4f &view_mat);
00122 const LMatrix4f &get_view_mat() const;
00123 void clear_view_mat();
00124
00125 void set_keystone(const LVecBase2f &keystone);
00126 INLINE const LVecBase2f &get_keystone() const;
00127 void clear_keystone();
00128
00129
00130
00131
00132 enum FromCorners {
00133 FC_roll = 0x0001,
00134 FC_camera_plane = 0x0002,
00135 FC_off_axis = 0x0004,
00136 FC_aspect_ratio = 0x0008,
00137 FC_shear = 0x0010,
00138 FC_keystone = 0x0020,
00139 };
00140 void set_frustum_from_corners(const LVecBase3f &ul, const LVecBase3f &ur,
00141 const LVecBase3f &ll, const LVecBase3f &lr,
00142 int flags);
00143
00144 void recompute_all();
00145
00146 virtual bool is_linear() const;
00147 virtual bool is_perspective() const;
00148 virtual bool is_orthographic() const;
00149 virtual PT(Geom) make_geometry();
00150
00151 virtual PT(BoundingVolume) make_bounds() const;
00152
00153 const LMatrix4f &get_projection_mat(StereoChannel channel = SC_mono) const;
00154 const LMatrix4f &get_projection_mat_inv(StereoChannel channel = SC_mono) const;
00155
00156 const LMatrix4f &get_film_mat() const;
00157 const LMatrix4f &get_film_mat_inv() const;
00158
00159 const LMatrix4f &get_lens_mat() const;
00160 const LMatrix4f &get_lens_mat_inv() const;
00161
00162 virtual void output(ostream &out) const;
00163 virtual void write(ostream &out, int indent_level = 0) const;
00164
00165 public:
00166 INLINE const UpdateSeq &get_last_change() const;
00167
00168 protected:
00169 INLINE void adjust_user_flags(int clear_flags, int set_flags);
00170 INLINE void adjust_comp_flags(int clear_flags, int set_flags);
00171
00172 void throw_change_event();
00173
00174 virtual bool extrude_impl(const LPoint3f &point2d,
00175 LPoint3f &near_point, LPoint3f &far_point) const;
00176 virtual bool extrude_vec_impl(const LPoint3f &point2d, LVector3f &vec) const;
00177 virtual bool project_impl(const LPoint3f &point3d, LPoint3f &point2d) const;
00178
00179 virtual void compute_film_size();
00180 virtual void compute_focal_length();
00181 virtual void compute_fov();
00182 virtual void compute_aspect_ratio();
00183 virtual void compute_view_hpr();
00184 virtual void compute_view_vector();
00185 virtual void compute_projection_mat();
00186 virtual void compute_film_mat();
00187 virtual void compute_lens_mat();
00188
00189 virtual float fov_to_film(float fov, float focal_length, bool horiz) const;
00190 virtual float fov_to_focal_length(float fov, float film_size, bool horiz) const;
00191 virtual float film_to_fov(float film_size, float focal_length, bool horiz) const;
00192
00193 private:
00194 static void resequence_fov_triad(char &newest, char &older_a, char &older_b);
00195 int define_geom_data();
00196 static void build_shear_mat(LMatrix4f &shear_mat,
00197 const LPoint3f &cul, const LPoint3f &cur,
00198 const LPoint3f &cll, const LPoint3f &clr);
00199 static float sqr_dist_to_line(const LPoint3f &point, const LPoint3f &origin,
00200 const LVector3f &vec);
00201
00202 protected:
00203 string _change_event;
00204 UpdateSeq _last_change;
00205 CoordinateSystem _cs;
00206
00207 LVecBase2f _film_size;
00208 LVector2f _film_offset;
00209 float _focal_length;
00210 LVecBase2f _fov;
00211 float _min_fov;
00212 float _aspect_ratio;
00213 float _near_distance, _far_distance;
00214
00215 LVecBase3f _view_hpr;
00216 LVector3f _view_vector, _up_vector;
00217 float _interocular_distance;
00218 float _convergence_distance;
00219 LVecBase2f _keystone;
00220
00221 LMatrix4f _film_mat, _film_mat_inv;
00222 LMatrix4f _lens_mat, _lens_mat_inv;
00223 LMatrix4f _projection_mat, _projection_mat_inv;
00224 LMatrix4f _projection_mat_left, _projection_mat_left_inv;
00225 LMatrix4f _projection_mat_right, _projection_mat_right_inv;
00226
00227 enum UserFlags {
00228
00229 UF_film_width = 0x0001,
00230 UF_film_height = 0x0002,
00231 UF_focal_length = 0x0004,
00232 UF_hfov = 0x0008,
00233 UF_vfov = 0x0010,
00234 UF_aspect_ratio = 0x0020,
00235 UF_view_hpr = 0x0040,
00236 UF_view_vector = 0x0080,
00237 UF_interocular_distance = 0x0100,
00238 UF_convergence_distance = 0x0200,
00239 UF_view_mat = 0x0400,
00240 UF_keystone = 0x0800,
00241 UF_min_fov = 0x1000,
00242 };
00243
00244 enum CompFlags {
00245
00246 CF_film_mat = 0x0001,
00247 CF_film_mat_inv = 0x0002,
00248 CF_lens_mat = 0x0004,
00249 CF_lens_mat_inv = 0x0008,
00250 CF_projection_mat = 0x0010,
00251 CF_projection_mat_inv = 0x0020,
00252 CF_projection_mat_left_inv = 0x0040,
00253 CF_projection_mat_right_inv = 0x0080,
00254 CF_mat = 0x00ff,
00255
00256 CF_film_size = 0x0100,
00257 CF_aspect_ratio = 0x0200,
00258 CF_view_hpr = 0x0400,
00259 CF_view_vector = 0x0800,
00260 CF_focal_length = 0x1000,
00261 CF_fov = 0x2000,
00262 };
00263 short _user_flags;
00264 short _comp_flags;
00265
00266
00267
00268
00269
00270 char _focal_length_seq, _fov_seq, _film_size_seq;
00271
00272 PT(GeomVertexData) _geom_data;
00273
00274 public:
00275 virtual void write_datagram(BamWriter *manager, Datagram &dg);
00276
00277 protected:
00278 void fillin(DatagramIterator &scan, BamReader *manager);
00279
00280 public:
00281 virtual TypeHandle get_type() const {
00282 return get_class_type();
00283 }
00284 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00285 static TypeHandle get_class_type() {
00286 return _type_handle;
00287 }
00288 static void init_type() {
00289 TypedWritableReferenceCount::init_type();
00290 register_type(_type_handle, "Lens",
00291 TypedWritableReferenceCount::get_class_type());
00292 }
00293
00294 private:
00295 static TypeHandle _type_handle;
00296 };
00297
00298 EXPCL_PANDA_GOBJ INLINE ostream &operator << (ostream &out, const Lens &lens);
00299
00300 #include "lens.I"
00301
00302 #endif
00303