41class EXPCL_PANDA_GOBJ Lens :
public TypedWritableReferenceCount {
44 Lens(
const Lens ©);
45 void operator = (
const Lens ©);
55 virtual PT(Lens) make_copy()
const=0;
57 INLINE
bool extrude(
const LPoint2 &point2d,
58 LPoint3 &near_point, LPoint3 &far_point)
const;
59 INLINE
bool extrude(
const LPoint3 &point2d,
60 LPoint3 &near_point, LPoint3 &far_point)
const;
61 INLINE
bool extrude_depth(
const LPoint3 &point2d, LPoint3 &point3d)
const;
62 INLINE
bool extrude_vec(
const LPoint2 &point2d, LVector3 &vec3d)
const;
63 INLINE
bool extrude_vec(
const LPoint3 &point2d, LVector3 &vec3d)
const;
64 INLINE
bool project(
const LPoint3 &point3d, LPoint3 &point2d)
const;
65 INLINE
bool project(
const LPoint3 &point3d, LPoint2 &point2d)
const;
79 INLINE
void set_film_size(PN_stdfloat width, PN_stdfloat height);
94 INLINE
void set_fov(PN_stdfloat fov);
95 INLINE
void set_fov(PN_stdfloat hfov, PN_stdfloat vfov);
96 INLINE
void set_fov(
const LVecBase2 &fov);
97 INLINE
const LVecBase2 &
get_fov()
const;
108 INLINE
void set_near(PN_stdfloat near_distance);
109 INLINE PN_stdfloat
get_near()
const;
110 INLINE
void set_far(PN_stdfloat far_distance);
111 INLINE PN_stdfloat
get_far()
const;
112 INLINE
void set_near_far(PN_stdfloat near_distance, PN_stdfloat far_distance);
119 INLINE
void set_view_hpr(PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
124 INLINE
void set_view_vector(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat i, PN_stdfloat j, PN_stdfloat k);
125 void set_view_vector(
const LVector3 &view_vector,
const LVector3 &up_vector);
157 FC_camera_plane = 0x0002,
158 FC_off_axis = 0x0004,
159 FC_aspect_ratio = 0x0008,
161 FC_keystone = 0x0020,
163 void set_frustum_from_corners(
const LVecBase3 &ul,
const LVecBase3 &ur,
164 const LVecBase3 &ll,
const LVecBase3 &lr,
167 void recompute_all();
169 virtual bool is_linear()
const;
170 virtual bool is_perspective()
const;
171 virtual bool is_orthographic()
const;
172 virtual PT(
Geom) make_geometry();
176 INLINE
const LMatrix4 &get_projection_mat(StereoChannel channel = SC_mono)
const;
177 INLINE
const LMatrix4 &get_projection_mat_inv(StereoChannel channel = SC_mono)
const;
179 INLINE
const LMatrix4 &get_film_mat()
const;
180 INLINE
const LMatrix4 &get_film_mat_inv()
const;
182 INLINE
const LMatrix4 &get_lens_mat()
const;
183 INLINE
const LMatrix4 &get_lens_mat_inv()
const;
185 virtual void output(std::ostream &out)
const;
186 virtual void write(std::ostream &out,
int indent_level = 0)
const;
188 INLINE
UpdateSeq get_last_change()
const;
193 INLINE
void do_adjust_user_flags(CData *cdata,
int clear_flags,
int set_flags);
194 INLINE
void do_adjust_comp_flags(CData *cdata,
int clear_flags,
int set_flags);
196 void do_set_film_size(CData *cdata, PN_stdfloat width);
197 void do_set_film_size(CData *cdata,
const LVecBase2 &film_size);
198 const LVecBase2 &do_get_film_size(
const CData *cdata)
const;
200 INLINE
void do_set_film_offset(CData *cdata,
const LVecBase2 &film_offset);
201 INLINE
const LVector2 &do_get_film_offset(
const CData *cdata)
const;
203 void do_set_focal_length(CData *cdata, PN_stdfloat focal_length);
204 PN_stdfloat do_get_focal_length(
const CData *cdata)
const;
206 void do_set_fov(CData *cdata, PN_stdfloat fov);
207 void do_set_fov(CData *cdata,
const LVecBase2 &fov);
208 const LVecBase2 &do_get_fov(
const CData *cdata)
const;
210 void do_set_aspect_ratio(CData *cdata, PN_stdfloat aspect_ratio);
211 PN_stdfloat do_get_aspect_ratio(
const CData *cdata)
const;
213 INLINE
void do_set_near(CData *cdata, PN_stdfloat near_distance);
214 INLINE PN_stdfloat do_get_near(
const CData *cdata)
const;
215 INLINE
void do_set_far(CData *cdata, PN_stdfloat far_distance);
216 INLINE PN_stdfloat do_get_far(
const CData *cdata)
const;
217 INLINE
void do_set_near_far(CData *cdata, PN_stdfloat near_distance, PN_stdfloat far_distance);
219 const LMatrix4 &do_get_projection_mat(
const CData *cdata, StereoChannel channel = SC_mono)
const;
220 const LMatrix4 &do_get_projection_mat_inv(
const CData *cdata, StereoChannel channel = SC_mono)
const;
222 const LMatrix4 &do_get_film_mat(
const CData *cdata)
const;
223 const LMatrix4 &do_get_film_mat_inv(
const CData *cdata)
const;
225 const LMatrix4 &do_get_lens_mat(
const CData *cdata)
const;
226 const LMatrix4 &do_get_lens_mat_inv(
const CData *cdata)
const;
228 void do_set_interocular_distance(CData *cdata, PN_stdfloat interocular_distance);
229 void do_set_convergence_distance(CData *cdata, PN_stdfloat convergence_distance);
231 void do_set_view_mat(CData *cdata,
const LMatrix4 &view_mat);
232 const LMatrix4 &do_get_view_mat(
const CData *cdata)
const;
234 void do_throw_change_event(CData *cdata);
236 virtual bool do_extrude(
const CData *cdata,
const LPoint3 &point2d,
237 LPoint3 &near_point, LPoint3 &far_point)
const;
238 virtual bool do_extrude_depth(
const CData *cdata,
const LPoint3 &point2d,
239 LPoint3 &point3d)
const;
240 bool do_extrude_depth_with_mat(
const CData *cdata,
const LPoint3 &point2d,
241 LPoint3 &point3d)
const;
242 virtual bool do_extrude_vec(
const CData *cdata,
243 const LPoint3 &point2d, LVector3 &vec)
const;
244 virtual bool do_project(
const CData *cdata,
245 const LPoint3 &point3d, LPoint3 &point2d)
const;
247 virtual void do_compute_film_size(CData *cdata);
248 virtual void do_compute_focal_length(CData *cdata);
249 virtual void do_compute_fov(CData *cdata);
250 virtual void do_compute_aspect_ratio(CData *cdata);
251 virtual void do_compute_view_hpr(CData *cdata);
252 virtual void do_compute_view_vector(CData *cdata);
253 virtual void do_compute_projection_mat(CData *cdata);
254 virtual void do_compute_film_mat(CData *cdata);
255 virtual void do_compute_lens_mat(CData *cdata);
257 virtual PN_stdfloat fov_to_film(PN_stdfloat fov, PN_stdfloat focal_length,
bool horiz)
const;
258 virtual PN_stdfloat fov_to_focal_length(PN_stdfloat fov, PN_stdfloat film_size,
bool horiz)
const;
259 virtual PN_stdfloat film_to_fov(PN_stdfloat film_size, PN_stdfloat focal_length,
bool horiz)
const;
262 void do_resequence_fov_triad(
const CData *cdata,
263 char &newest,
char &older_a,
char &older_b)
const;
264 int do_define_geom_data(CData *cdata);
265 static void build_shear_mat(LMatrix4 &shear_mat,
266 const LPoint3 &cul,
const LPoint3 &cur,
267 const LPoint3 &cll,
const LPoint3 &clr);
268 static PN_stdfloat sqr_dist_to_line(
const LPoint3 &point,
const LPoint3 &origin,
269 const LVector3 &vec);
274 UF_film_width = 0x0001,
275 UF_film_height = 0x0002,
276 UF_focal_length = 0x0004,
279 UF_aspect_ratio = 0x0020,
280 UF_view_hpr = 0x0040,
281 UF_view_vector = 0x0080,
282 UF_interocular_distance = 0x0100,
283 UF_convergence_distance = 0x0200,
284 UF_view_mat = 0x0400,
285 UF_keystone = 0x0800,
287 UF_custom_film_mat = 0x2000,
292 CF_film_mat = 0x0001,
293 CF_film_mat_inv = 0x0002,
294 CF_lens_mat = 0x0004,
295 CF_lens_mat_inv = 0x0008,
296 CF_projection_mat = 0x0010,
297 CF_projection_mat_inv = 0x0020,
298 CF_projection_mat_left_inv = 0x0040,
299 CF_projection_mat_right_inv = 0x0080,
302 CF_film_size = 0x0100,
303 CF_aspect_ratio = 0x0200,
304 CF_view_hpr = 0x0400,
305 CF_view_vector = 0x0800,
306 CF_focal_length = 0x1000,
311 class EXPCL_PANDA_GOBJ CData :
public CycleData {
314 CData(
const CData ©);
315 ALLOC_DELETED_CHAIN(CData);
316 virtual CycleData *make_copy()
const;
317 virtual void write_datagram(BamWriter *manager, Datagram &dg)
const;
318 virtual void fillin(DatagramIterator &scan, BamReader *manager);
319 virtual TypeHandle get_parent_type()
const {
320 return Lens::get_class_type();
325 std::string _change_event;
326 UpdateSeq _last_change;
327 CoordinateSystem _cs;
329 LVecBase2 _film_size;
330 LVector2 _film_offset;
331 PN_stdfloat _focal_length;
333 PN_stdfloat _min_fov;
334 PN_stdfloat _aspect_ratio;
335 PN_stdfloat _near_distance, _far_distance;
338 LVector3 _view_vector, _up_vector;
339 PN_stdfloat _interocular_distance;
340 PN_stdfloat _convergence_distance;
342 LMatrix4 _custom_film_mat;
344 LMatrix4 _film_mat, _film_mat_inv;
345 LMatrix4 _lens_mat, _lens_mat_inv;
346 LMatrix4 _projection_mat, _projection_mat_inv;
347 LMatrix4 _projection_mat_left, _projection_mat_left_inv;
348 LMatrix4 _projection_mat_right, _projection_mat_right_inv;
357 char _focal_length_seq, _fov_seq, _film_size_seq;
359 PT(GeomVertexData) _geom_data;
362 static TypeHandle get_class_type() {
365 static void init_type() {
370 static TypeHandle _type_handle;
373 PipelineCycler<CData> _cycler;
374 typedef CycleDataReader<CData> CDReader;
375 typedef CycleDataWriter<CData> CDWriter;
381 void fillin(DatagramIterator &scan, BamReader *manager);
384 virtual TypeHandle get_type()
const {
385 return get_class_type();
387 virtual TypeHandle force_init_type() {init_type();
return get_class_type();}
388 static TypeHandle get_class_type() {
391 static void init_type() {
392 TypedWritableReferenceCount::init_type();
394 TypedWritableReferenceCount::get_class_type());
399 static TypeHandle _type_handle;