Panda3D
Loading...
Searching...
No Matches
lens.h
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file lens.h
10 * @author drose
11 * @date 1999-02-18
12 */
13
14#ifndef LENS_H
15#define LENS_H
16
17#include "pandabase.h"
18
20#include "luse.h"
21#include "geom.h"
22#include "updateSeq.h"
23#include "geomVertexData.h"
24#include "pointerTo.h"
25#include "cycleData.h"
26#include "cycleDataReader.h"
27#include "cycleDataWriter.h"
28#include "pipelineCycler.h"
29
30class BoundingVolume;
31
32/**
33 * A base class for any number of different kinds of lenses, linear and
34 * otherwise. Presently, this includes perspective and orthographic lenses.
35 *
36 * A Lens object is the main part of a Camera node, which defines the
37 * fundamental interface to point-of-view for rendering. Lenses are also used
38 * in other contexts, however; for instance, a Spotlight is also defined using
39 * a lens.
40 */
41class EXPCL_PANDA_GOBJ Lens : public TypedWritableReferenceCount {
42public:
43 Lens();
44 Lens(const Lens &copy);
45 void operator = (const Lens &copy);
46
47PUBLISHED:
48 enum StereoChannel {
49 SC_mono = 0x00,
50 SC_left = 0x01,
51 SC_right = 0x02,
52 SC_stereo = 0x03, // == SC_left | SC_right
53 };
54
55 virtual PT(Lens) make_copy() const=0;
56
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;
66
67 INLINE void set_change_event(const std::string &event);
68 INLINE const std::string &get_change_event() const;
69 MAKE_PROPERTY(change_event, get_change_event, set_change_event);
70
71 void set_coordinate_system(CoordinateSystem cs);
72 INLINE CoordinateSystem get_coordinate_system() const;
73 MAKE_PROPERTY(coordinate_system, get_coordinate_system,
75
76 void clear();
77
78 INLINE void set_film_size(PN_stdfloat width);
79 INLINE void set_film_size(PN_stdfloat width, PN_stdfloat height);
80 INLINE void set_film_size(const LVecBase2 &film_size);
81 INLINE const LVecBase2 &get_film_size() const;
82 MAKE_PROPERTY(film_size, get_film_size, set_film_size);
83
84 INLINE void set_film_offset(PN_stdfloat x, PN_stdfloat y);
85 INLINE void set_film_offset(const LVecBase2 &film_offset);
86 INLINE const LVector2 &get_film_offset() const;
87 MAKE_PROPERTY(film_offset, get_film_offset, set_film_offset);
88
89 INLINE void set_focal_length(PN_stdfloat focal_length);
90 INLINE PN_stdfloat get_focal_length() const;
91 MAKE_PROPERTY(focal_length, get_focal_length, set_focal_length);
92
93 void set_min_fov(PN_stdfloat min_fov);
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;
98 INLINE PN_stdfloat get_hfov() const;
99 INLINE PN_stdfloat get_vfov() const;
100 PN_stdfloat get_min_fov() const;
101 MAKE_PROPERTY(fov, get_fov, set_fov);
102 MAKE_PROPERTY(min_fov, get_min_fov, set_min_fov);
103
104 INLINE void set_aspect_ratio(PN_stdfloat aspect_ratio);
105 INLINE PN_stdfloat get_aspect_ratio() const;
106 MAKE_PROPERTY(aspect_ratio, get_aspect_ratio, set_aspect_ratio);
107
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);
113 MAKE_PROPERTY(near, get_near, set_near);
114 MAKE_PROPERTY(far, get_far, set_far);
115
116 static PN_stdfloat get_default_near();
117 static PN_stdfloat get_default_far();
118
119 INLINE void set_view_hpr(PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
120 void set_view_hpr(const LVecBase3 &view_hpr);
121 const LVecBase3 &get_view_hpr() const;
122 MAKE_PROPERTY(view_hpr, get_view_hpr, set_view_hpr);
123
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);
126 const LVector3 &get_view_vector() const;
127 const LVector3 &get_up_vector() const;
128 LPoint3 get_nodal_point() const;
129 MAKE_PROPERTY(nodal_point, get_nodal_point);
130
131 INLINE void set_interocular_distance(PN_stdfloat interocular_distance);
132 INLINE PN_stdfloat get_interocular_distance() const;
133 INLINE void set_convergence_distance(PN_stdfloat convergence_distance);
134 INLINE PN_stdfloat get_convergence_distance() const;
135 MAKE_PROPERTY(interocular_distance, get_interocular_distance, set_interocular_distance);
136 MAKE_PROPERTY(convergence_distance, get_convergence_distance, set_convergence_distance);
137
138 INLINE void set_view_mat(const LMatrix4 &view_mat);
139 INLINE const LMatrix4 &get_view_mat() const;
140 void clear_view_mat();
141 MAKE_PROPERTY(view_mat, get_view_mat, set_view_mat);
142
143 void set_keystone(const LVecBase2 &keystone);
144 INLINE const LVecBase2 &get_keystone() const;
145 void clear_keystone();
146 MAKE_PROPERTY(keystone, get_keystone, set_keystone);
147
148 void set_custom_film_mat(const LMatrix4 &custom_film_mat);
149 INLINE const LMatrix4 &get_custom_film_mat() const;
151
152 // These flags are passed in as the last parameter to control the behavior
153 // of set_frustum_from_corners(). See the documentation for that method for
154 // an explanation of each flag.
155 enum FromCorners {
156 FC_roll = 0x0001,
157 FC_camera_plane = 0x0002,
158 FC_off_axis = 0x0004,
159 FC_aspect_ratio = 0x0008,
160 FC_shear = 0x0010,
161 FC_keystone = 0x0020,
162 };
163 void set_frustum_from_corners(const LVecBase3 &ul, const LVecBase3 &ur,
164 const LVecBase3 &ll, const LVecBase3 &lr,
165 int flags);
166
167 void recompute_all();
168
169 virtual bool is_linear() const;
170 virtual bool is_perspective() const;
171 virtual bool is_orthographic() const;
172 virtual PT(Geom) make_geometry();
173
174 virtual PT(BoundingVolume) make_bounds() const;
175
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;
178
179 INLINE const LMatrix4 &get_film_mat() const;
180 INLINE const LMatrix4 &get_film_mat_inv() const;
181
182 INLINE const LMatrix4 &get_lens_mat() const;
183 INLINE const LMatrix4 &get_lens_mat_inv() const;
184
185 virtual void output(std::ostream &out) const;
186 virtual void write(std::ostream &out, int indent_level = 0) const;
187
188 INLINE UpdateSeq get_last_change() const;
189
190protected:
191 class CData;
192
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);
195
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;
199
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;
202
203 void do_set_focal_length(CData *cdata, PN_stdfloat focal_length);
204 PN_stdfloat do_get_focal_length(const CData *cdata) const;
205
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;
209
210 void do_set_aspect_ratio(CData *cdata, PN_stdfloat aspect_ratio);
211 PN_stdfloat do_get_aspect_ratio(const CData *cdata) const;
212
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);
218
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;
221
222 const LMatrix4 &do_get_film_mat(const CData *cdata) const;
223 const LMatrix4 &do_get_film_mat_inv(const CData *cdata) const;
224
225 const LMatrix4 &do_get_lens_mat(const CData *cdata) const;
226 const LMatrix4 &do_get_lens_mat_inv(const CData *cdata) const;
227
228 void do_set_interocular_distance(CData *cdata, PN_stdfloat interocular_distance);
229 void do_set_convergence_distance(CData *cdata, PN_stdfloat convergence_distance);
230
231 void do_set_view_mat(CData *cdata, const LMatrix4 &view_mat);
232 const LMatrix4 &do_get_view_mat(const CData *cdata) const;
233
234 void do_throw_change_event(CData *cdata);
235
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;
246
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);
256
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;
260
261private:
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);
270
271protected:
272 enum UserFlags {
273 // Parameters the user may have explicitly specified.
274 UF_film_width = 0x0001,
275 UF_film_height = 0x0002,
276 UF_focal_length = 0x0004,
277 UF_hfov = 0x0008,
278 UF_vfov = 0x0010,
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,
286 UF_min_fov = 0x1000,
287 UF_custom_film_mat = 0x2000,
288 };
289
290 enum CompFlags {
291 // Values that may need to be recomputed.
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,
300 CF_mat = 0x00ff, // all of the above.
301
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,
307 CF_fov = 0x2000,
308 };
309
310 // This is the data that must be cycled between pipeline stages.
311 class EXPCL_PANDA_GOBJ CData : public CycleData {
312 public:
313 CData();
314 CData(const CData &copy);
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();
321 }
322
323 void clear();
324
325 std::string _change_event;
326 UpdateSeq _last_change;
327 CoordinateSystem _cs;
328
329 LVecBase2 _film_size;
330 LVector2 _film_offset;
331 PN_stdfloat _focal_length;
332 LVecBase2 _fov;
333 PN_stdfloat _min_fov;
334 PN_stdfloat _aspect_ratio;
335 PN_stdfloat _near_distance, _far_distance;
336
337 LVecBase3 _view_hpr;
338 LVector3 _view_vector, _up_vector;
339 PN_stdfloat _interocular_distance;
340 PN_stdfloat _convergence_distance;
341 LVecBase2 _keystone;
342 LMatrix4 _custom_film_mat;
343
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;
349
350 short _user_flags;
351 short _comp_flags;
352
353 // The user may only specify two of these three parameters. Specifying
354 // the third parameter wipes out the first one specified. We therefore
355 // need to remember the order in which the user has specified these three
356 // parameters. A bit of a mess.
357 char _focal_length_seq, _fov_seq, _film_size_seq;
358
359 PT(GeomVertexData) _geom_data;
360
361 public:
362 static TypeHandle get_class_type() {
363 return _type_handle;
364 }
365 static void init_type() {
366 register_type(_type_handle, "Lens::CData");
367 }
368
369 private:
370 static TypeHandle _type_handle;
371 };
372
373 PipelineCycler<CData> _cycler;
374 typedef CycleDataReader<CData> CDReader;
375 typedef CycleDataWriter<CData> CDWriter;
376
377public:
378 virtual void write_datagram(BamWriter *manager, Datagram &dg);
379
380protected:
381 void fillin(DatagramIterator &scan, BamReader *manager);
382
383public:
384 virtual TypeHandle get_type() const {
385 return get_class_type();
386 }
387 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
388 static TypeHandle get_class_type() {
389 return _type_handle;
390 }
391 static void init_type() {
392 TypedWritableReferenceCount::init_type();
393 register_type(_type_handle, "Lens",
394 TypedWritableReferenceCount::get_class_type());
395 CData::init_type();
396 }
397
398private:
399 static TypeHandle _type_handle;
400};
401
402EXPCL_PANDA_GOBJ INLINE std::ostream &operator << (std::ostream &out, const Lens &lens);
403
404#include "lens.I"
405
406#endif
This is an abstract class for any volume in any sense which can be said to define the locality of ref...
A container for geometry primitives.
Definition geom.h:54
A base class for any number of different kinds of lenses, linear and otherwise.
Definition lens.h:41
const LMatrix4 & get_custom_film_mat() const
Returns the custom_film_mat specified for the lens.
Definition lens.I:552
get_view_hpr
Returns the direction in which the lens is facing.
Definition lens.h:122
set_aspect_ratio
Sets the aspect ratio of the lens.
Definition lens.h:106
bool project(const LPoint3 &point3d, LPoint3 &point2d) const
Given a 3-d point in space, determine the 2-d point this maps to, in the range (-1,...
Definition lens.I:131
bool extrude_depth(const LPoint3 &point2d, LPoint3 &point3d) const
Uses the depth component of the 3-d result from project() to compute the original point in 3-d space ...
Definition lens.I:54
static PN_stdfloat get_default_near()
Returns the default near plane distance that will be assigned to each newly-created lens.
Definition lens.cxx:148
static PN_stdfloat get_default_far()
Returns the default far plane distance that will be assigned to each newly- created lens.
Definition lens.cxx:157
bool extrude(const LPoint2 &point2d, LPoint3 &near_point, LPoint3 &far_point) const
Given a 2-d point in the range (-1,1) in both dimensions, where (0,0) is the center of the lens and (...
Definition lens.I:24
get_view_mat
Returns the direction in which the lens is facing.
Definition lens.h:141
get_keystone
Returns the keystone correction specified for the lens.
Definition lens.h:146
void set_custom_film_mat(const LMatrix4 &custom_film_mat)
Specifies a custom matrix to transform the points on the film after they have been converted into nom...
Definition lens.cxx:306
void clear()
Resets all lens parameters to their initial default settings.
Definition lens.cxx:78
void set_view_vector(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat i, PN_stdfloat j, PN_stdfloat k)
Specifies the direction in which the lens is facing by giving an axis to look along,...
Definition lens.I:442
void clear_keystone()
Disables the lens keystone correction.
Definition lens.cxx:287
set_view_hpr
Sets the direction in which the lens is facing.
Definition lens.h:122
get_change_event
Returns the name of the event that will be generated whenever any properties of this particular Lens ...
Definition lens.h:69
set_keystone
Indicates the ratio of keystone correction to perform on the lens, in each of three axes.
Definition lens.h:146
get_aspect_ratio
Returns the aspect ratio of the Lens.
Definition lens.h:106
set_film_offset
Sets the horizontal and vertical offset amounts of this Lens.
Definition lens.h:87
set_convergence_distance
Sets the distance between between the camera plane and the point in the distance that the left and ri...
Definition lens.h:136
get_min_fov
Returns the field of view of the narrowest dimension of the window.
Definition lens.h:102
get_far
Returns the position of the far plane (or cylinder, sphere, whatever).
Definition lens.h:114
set_coordinate_system
Specifies the coordinate system that all 3-d computations are performed within for this Lens.
Definition lens.h:74
set_focal_length
Sets the focal length of the lens.
Definition lens.h:91
set_fov
Sets the horizontal field of view of the lens without changing the aspect ratio.
Definition lens.h:101
bool extrude_vec(const LPoint2 &point2d, LVector3 &vec3d) const
Given a 2-d point in the range (-1,1) in both dimensions, where (0,0) is the center of the lens and (...
Definition lens.I:72
set_interocular_distance
Sets the distance between the left and right eyes of a stereo camera.
Definition lens.h:135
get_film_offset
Returns the horizontal and vertical offset amounts of this Lens.
Definition lens.h:87
get_near
Returns the position of the near plane (or cylinder, sphere, whatever).
Definition lens.h:113
const LVector3 & get_up_vector() const
Returns the axis perpendicular to the camera's view vector that indicates the "up" direction.
Definition lens.cxx:227
set_near
Defines the position of the near plane (or cylinder, sphere, whatever).
Definition lens.h:113
get_focal_length
Returns the focal length of the lens.
Definition lens.h:91
set_min_fov
Sets the field of view of the smallest dimension of the window.
Definition lens.h:102
set_change_event
Sets the name of the event that will be generated whenever any properties of the Lens have changed.
Definition lens.h:69
PN_stdfloat get_hfov() const
Returns the horizontal component of fov only.
Definition lens.I:344
void clear_view_mat()
Resets the lens transform to identity.
Definition lens.cxx:248
get_nodal_point
Returns the center point of the lens: the point from which the lens is viewing.
Definition lens.h:129
get_fov
Returns the horizontal and vertical film size of the virtual film.
Definition lens.h:101
get_interocular_distance
See set_interocular_distance().
Definition lens.h:135
get_coordinate_system
Returns the coordinate system that all 3-d computations are performed within for this Lens.
Definition lens.h:74
set_film_size
Sets the horizontal size of the film without changing its shape.
Definition lens.h:82
set_far
Defines the position of the far plane (or cylinder, sphere, whatever).
Definition lens.h:114
set_view_mat
Sets an arbitrary transformation on the lens.
Definition lens.h:141
void clear_custom_film_mat()
Disables the lens custom_film_mat correction.
Definition lens.cxx:321
void set_near_far(PN_stdfloat near_distance, PN_stdfloat far_distance)
Simultaneously changes the near and far planes.
Definition lens.I:419
const LVector3 & get_view_vector() const
Returns the axis along which the lens is facing.
Definition lens.cxx:214
get_convergence_distance
See set_convergence_distance().
Definition lens.h:136
get_film_size
Returns the horizontal and vertical film size of the virtual film.
Definition lens.h:82
PN_stdfloat get_vfov() const
Returns the vertical component of fov only.
Definition lens.I:352
virtual void fillin(DatagramIterator &scan, BamReader *manager)
This internal function is intended to be called by each class's make_from_bam() method to read in all...
virtual void write_datagram(BamWriter *manager, Datagram &dg)
Writes the contents of this object to the datagram for shipping out to a Bam file.
This is a sequence number that increments monotonically.
Definition updateSeq.h:37
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void register_type(TypeHandle &type_handle, const std::string &name)
This inline function is just a convenient way to call TypeRegistry::register_type(),...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.