TransformState
-
class TransformState
Bases:
NodeCachedReferenceCount
Indicates a coordinate-system transform on vertices. TransformStates are the primary means for storing transformations on the scene graph.
Transforms may be specified in one of two ways: componentwise, with a pos- hpr-scale, or with an arbitrary transform matrix. If you specify a transform componentwise, it will remember its original components.
TransformState objects are managed very much like
RenderState
objects. They are immutable and reference-counted automatically.You should not attempt to create or modify a TransformState object directly. Instead, call one of the make() functions to create one for you. And instead of modifying a TransformState object, create a new one.
Inheritance diagram
-
void cache_ref(void) const
Overrides this method to update PStats appropriately.
-
bool cache_unref(void) const
Overrides this method to update PStats appropriately.
-
static int clear_cache(void)
Empties the cache of composed
TransformStates
. This makes everyTransformState
forget what results when it is composed with otherTransformStates
.This will eliminate any
TransformState
objects that have been allocated but have no references outside of the internalTransformState
map. It will not eliminateTransformState
objects that are still in use.Nowadays, this method should not be necessary, as reference-count cycles in the composition cache should be automatically detected and broken.
The return value is the number of
TransformStates
freed by this operation.
-
int compare_to(TransformState const &other) const
-
int compare_to(TransformState const &other, bool uniquify_matrix) const
Provides an arbitrary ordering among all unique
TransformStates
, so we can store the essentially different ones in a big set and throw away the rest.Note that if this returns 0, it doesn’t necessarily imply that operator == returns true; it uses a very slightly different comparison threshold.
Provides an arbitrary ordering among all unique
TransformStates
, so we can store the essentially different ones in a big set and throw away the rest.Note that if this returns 0, it doesn’t necessarily imply that operator == returns true; it uses a very slightly different comparison threshold.
If uniquify_matrix is true, then matrix-defined
TransformStates
are also uniqified. If uniquify_matrix is false, then only component-definedTransformStates
are uniquified, which is less expensive.
-
bool components_given(void) const
Returns true if the transform was specified componentwise, or false if it was specified with a general 4x4 matrix. If this is true, the components returned by
get_pos()
andget_scale()
will be exactly those that were set; otherwise, these functions will return computed values. If this is true, the rotation may have been set either with a hpr trio or with a quaternion;hpr_given()
orquat_given()
can resolve the difference.
-
ConstPointerTo<TransformState> compose(TransformState const *other) const
Returns a new
TransformState
object that represents the composition of this state with the other state.The result of this operation is cached, and will be retained as long as both this
TransformState
object and the otherTransformState
object continue to exist. Should one of them destruct, the cached entry will be removed, and its pointer will be allowed to destruct as well.
-
static int garbage_collect(void)
Performs a garbage-collection cycle. This must be called periodically if garbage-collect-states is true to ensure that
TransformStates
get cleaned up appropriately. It does no harm to call it even if this variable is not true, but there is probably no advantage in that case.
-
static TypeHandle get_class_type(void)
-
PyObject *get_composition_cache(void) const
-
std::size_t get_composition_cache_num_entries(void) const
Returns the number of entries in the composition cache for this
TransformState
. This is the number of otherTransformStates
whose composition with this one has been cached. This number is not useful for any practical reason other than performance analysis.
-
TransformState const *get_composition_cache_result(std::size_t n) const
Returns the result
TransformState
of the nth element in the composition cache. Returns NULL if there doesn’t happen to be an entry in the nth element.In general, a->compose(a->get_composition_cache_source(n)) == a->get_composition_cache_result(n).
This has no practical value other than for examining the cache for performance analysis.
-
std::size_t get_composition_cache_size(void) const
Returns the number of slots in the composition cache for this
TransformState
. You may use this as an upper bound when walking through all of the composition cache results viaget_composition_cache_source()
or result().This has no practical value other than for examining the cache for performance analysis.
-
TransformState const *get_composition_cache_source(std::size_t n) const
Returns the source
TransformState
of the nth element in the composition cache. Returns NULL if there doesn’t happen to be an entry in the nth element. Seeget_composition_cache_result()
.This has no practical value other than for examining the cache for performance analysis.
-
int get_geom_rendering(int geom_rendering) const
Returns the union of the Geom::GeomRendering bits that will be required once this
TransformState
is applied to a geom which includes the indicated geom_rendering bits. The RenderState’s get_geom_rendering() should already have been applied.
-
std::size_t get_hash(void) const
Returns a suitable hash value for phash_map.
-
LVecBase3 get_hpr(void) const
Returns the rotation component of the transform as a trio of Euler angles. It is an error to call this if
has_components()
returned false.
-
ConstPointerTo<TransformState> get_inverse(void) const
Returns the inverse of this transform. If you are going to immediately compose this result with another
TransformState
, it is faster to do it in one operation withinvert_compose()
.
-
PyObject *get_invert_composition_cache(void) const
-
std::size_t get_invert_composition_cache_num_entries(void) const
Returns the number of entries in the invert_composition cache for this
TransformState
. This is similar to the composition cache, but it records cache entries for theinvert_compose()
operation. Seeget_composition_cache_num_entries()
.
-
TransformState const *get_invert_composition_cache_result(std::size_t n) const
Returns the result
TransformState
of the nth element in the invert composition cache. Returns NULL if there doesn’t happen to be an entry in the nth element.In general, a->invert_compose(a->get_invert_composition_cache_source(n)) == a->get_invert_composition_cache_result(n).
This has no practical value other than for examining the cache for performance analysis.
-
std::size_t get_invert_composition_cache_size(void) const
Returns the number of slots in the composition cache for this
TransformState
. You may use this as an upper bound when walking through all of the composition cache results viaget_invert_composition_cache_source()
or result().This has no practical value other than for examining the cache for performance analysis.
-
TransformState const *get_invert_composition_cache_source(std::size_t n) const
Returns the source
TransformState
of the nth element in the invert composition cache. Returns NULL if there doesn’t happen to be an entry in the nth element. Seeget_invert_composition_cache_result()
.This has no practical value other than for examining the cache for performance analysis.
-
LMatrix3 get_mat3(void) const
Returns the 3x3 matrix that describes the 2-d transform. It is an error to call this if
is_2d()
returned false.
-
LQuaternion get_norm_quat(void) const
Returns the rotation component of the transform as a quaternion. Unlike the result of
get_quat()
, the return value of this method is guaranteed to be normalized. It is an error to call this ifhas_components()
returned false.
-
static int get_num_states(void)
Returns the total number of unique
TransformState
objects allocated in the world. This will go up and down during normal operations.
-
static int get_num_unused_states(void)
Returns the total number of
TransformState
objects that have been allocated but have no references outside of the internalTransformState
cache.A nonzero return value is not necessarily indicative of leaked references; it is normal for two
TransformState
objects, both of which have references held outside the cache, to have the result of their composition stored within the cache. This result will be retained within the cache until one of the baseTransformStates
is released.Use
list_cycles()
to get an idea of the number of actual “leaked”TransformState
objects.
-
LPoint3 get_pos(void) const
Force interrogate to make a copy as a temporary solution for #1625.
Force interrogate to make a copy as a temporary solution for #1625.
Returns the pos component of the transform. It is an error to call this if
has_pos()
returned false.
-
LVecBase2 get_pos2d(void) const
Returns the pos component of the 2-d transform. It is an error to call this if
has_pos()
oris_2d()
returned false.
-
LQuaternion get_quat(void) const
Returns the rotation component of the transform as a quaternion. The return value will be normalized if a normalized quaternion was given to the constructor (or if the quaternion was computed implicitly); it will be non- normalized if a non-normalized quaternion was given to the constructor. See also
get_norm_quat()
.It is an error to call this if
has_components()
returned false.
-
PN_stdfloat get_rotate2d(void) const
Returns the rotation component of the 2-d transform as an angle in degrees clockwise about the origin. It is an error to call this if
has_components()
oris_2d()
returned false.
-
LVecBase3 get_scale(void) const
Returns the scale component of the transform. It is an error to call this if
has_components()
returned false.
-
LVecBase2 get_scale2d(void) const
Returns the scale component of the 2-d transform. It is an error to call this if
has_components()
oris_2d()
returned false.
-
LVecBase3 get_shear(void) const
Returns the shear component of the transform. It is an error to call this if
has_components()
returned false.
-
PN_stdfloat get_shear2d(void) const
Returns the shear component of the 2-d transform. It is an error to call this if
has_components()
oris_2d()
returned false.
-
static PyObject *get_states(void)
-
PN_stdfloat get_uniform_scale(void) const
Returns the scale component of the transform, as a single number. It is an error to call this if
has_uniform_scale()
returned false.
-
ConstPointerTo<TransformState> get_unique(void) const
Returns the pointer to the unique
TransformState
in the cache that is equivalent to this one. This may be the same pointer as this object, or it may be a different pointer; but it will be an equivalent object, and it will be a shared pointer. This may be called from time to time to improve cache benefits.
-
static PyObject *get_unused_states(void)
-
bool has_components(void) const
Returns true if the transform can be described by separate pos, hpr, and scale components. Most transforms we use in everyday life can be so described, but some kinds of transforms (for instance, those involving a skew) cannot.
This is not related to whether the transform was originally described componentwise. Even a transform that was constructed with a 4x4 may return true here if the matrix is a simple affine matrix with no skew.
If this returns true, you may safely call
get_hpr()
andget_scale()
to retrieve the components. (You may always safely callget_pos()
whether this returns true or false.)
-
bool has_hpr(void) const
Returns true if the transform’s rotation component can be extracted out separately and described as a set of Euler angles. This is generally true only when
has_components()
is true.
-
bool has_identity_scale(void) const
Returns true if the scale is uniform 1.0, or false if the scale has some real value.
-
bool has_mat(void) const
Returns true if the transform can be described as a matrix. This is generally always true, unless
is_invalid()
is true.
-
bool has_nonzero_shear(void) const
Returns true if the shear component is non-zero, false if it is zero or if the matrix cannot be decomposed.
-
bool has_pos(void) const
Returns true if the transform’s pos component can be extracted out separately. This is generally always true, unless the transform is invalid (i.e.
is_invalid()
returns true).
-
bool has_quat(void) const
Returns true if the transform’s rotation component can be extracted out separately and described as a quaternion. This is generally true only when
has_components()
is true.
-
bool has_scale(void) const
Returns true if the transform’s scale component can be extracted out separately. This is generally true only when
has_components()
is true.
-
bool has_shear(void) const
Returns true if the transform’s shear component can be extracted out separately. This is generally true only when
has_components()
is true.
-
bool has_uniform_scale(void) const
Returns true if the scale is uniform across all three axes (and therefore can be expressed as a single number), or false if the transform has a different scale in different dimensions.
-
bool hpr_given(void) const
Returns true if the rotation was specified via a trio of Euler angles, false otherwise. If this is true,
get_hpr()
will be exactly as set; otherwise, it will return a computed value.
-
ConstPointerTo<TransformState> invert_compose(TransformState const *other) const
Returns a new
TransformState
object that represents the composition of this state’s inverse with the other state.This is similar to
compose()
, but is particularly useful for computing the relative state of a node as viewed from some other node.
-
bool is_2d(void) const
Returns true if the transform has been constructed entirely using the 2-d transform operations, e.g.
make_pos2d()
, and therefore operates strictly in two-dimensional space on X and Y only.
-
bool is_identity(void) const
Returns true if the transform represents the identity matrix, false otherwise.
-
bool is_invalid(void) const
Returns true if the transform represents an invalid matrix, for instance the result of inverting a singular matrix, or false if the transform is valid.
-
bool is_singular(void) const
Returns true if the transform represents a singular transform (that is, it has a zero scale, and it cannot be inverted), or false otherwise.
-
static void list_cycles(std::ostream &out)
Detects all of the reference-count cycles in the cache and reports them to standard output.
These cycles may be inadvertently created when state compositions cycle back to a starting point. Nowadays, these cycles should be automatically detected and broken, so this method should never list any cycles unless there is a bug in that detection logic.
The cycles listed here are not leaks in the strictest sense of the word, since they can be reclaimed by a call to
clear_cache()
; but they will not be reclaimed automatically.
-
static void list_states(std::ostream &out)
Lists all of the
TransformStates
in the cache to the output stream, one per line. This can be quite a lot of output if the cache is large, so be prepared.
-
ConstPointerTo<TransformState> make_hpr(LVecBase3 const &hpr)
Makes a new
TransformState
with the specified components.
-
static ConstPointerTo<TransformState> make_identity(void)
Constructs an identity transform.
-
static ConstPointerTo<TransformState> make_invalid(void)
Constructs an invalid transform; for instance, the result of inverting a singular matrix.
-
static ConstPointerTo<TransformState> make_mat(LMatrix4 const &mat)
Makes a new
TransformState
with the specified transformation matrix.
-
static ConstPointerTo<TransformState> make_mat3(LMatrix3 const &mat)
Makes a new two-dimensional
TransformState
with the specified 3x3 transformation matrix.
-
ConstPointerTo<TransformState> make_pos(LVecBase3 const &pos)
Makes a new
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_pos2d(LVecBase2 const &pos)
Makes a new 2-d
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_pos_hpr(LVecBase3 const &pos, LVecBase3 const &hpr)
Makes a new
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_pos_hpr_scale(LVecBase3 const &pos, LVecBase3 const &hpr, LVecBase3 const &scale)
Makes a new
TransformState
with the specified components.
-
static ConstPointerTo<TransformState> make_pos_hpr_scale_shear(LVecBase3 const &pos, LVecBase3 const &hpr, LVecBase3 const &scale, LVecBase3 const &shear)
Makes a new
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_pos_quat_scale(LVecBase3 const &pos, LQuaternion const &quat, LVecBase3 const &scale)
Makes a new
TransformState
with the specified components.
-
static ConstPointerTo<TransformState> make_pos_quat_scale_shear(LVecBase3 const &pos, LQuaternion const &quat, LVecBase3 const &scale, LVecBase3 const &shear)
Makes a new
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_pos_rotate2d(LVecBase2 const &pos, PN_stdfloat rotate)
Makes a new 2-d
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_pos_rotate_scale2d(LVecBase2 const &pos, PN_stdfloat rotate, LVecBase2 const &scale)
Makes a new 2-d
TransformState
with the specified components.
-
static ConstPointerTo<TransformState> make_pos_rotate_scale_shear2d(LVecBase2 const &pos, PN_stdfloat rotate, LVecBase2 const &scale, PN_stdfloat shear)
Makes a new two-dimensional
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_quat(LQuaternion const &quat)
Makes a new
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_rotate2d(PN_stdfloat rotate)
Makes a new 2-d
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_scale(PN_stdfloat scale)
-
ConstPointerTo<TransformState> make_scale(LVecBase3 const &scale)
Makes a new
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_scale2d(PN_stdfloat scale)
-
ConstPointerTo<TransformState> make_scale2d(LVecBase2 const &scale)
Makes a new 2-d
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_shear(LVecBase3 const &shear)
Makes a new
TransformState
with the specified components.
-
ConstPointerTo<TransformState> make_shear2d(PN_stdfloat shear)
Makes a new 2-d
TransformState
with the specified components.
-
void node_ref(void) const
Overrides this method to update PStats appropriately.
-
bool node_unref(void) const
Overrides this method to update PStats appropriately.
-
void output(std::ostream &out) const
-
bool quat_given(void) const
Returns true if the rotation was specified via a quaternion, false otherwise. If this is true,
get_quat()
will be exactly as set; otherwise, it will return a computed value.
-
ConstPointerTo<TransformState> set_hpr(LVecBase3 const &hpr) const
Returns a new
TransformState
object that represents the originalTransformState
with its rotation component replaced with the indicated value, if possible.
-
ConstPointerTo<TransformState> set_pos(LVecBase3 const &pos) const
Returns a new
TransformState
object that represents the originalTransformState
with its pos component replaced with the indicated value.
-
ConstPointerTo<TransformState> set_pos2d(LVecBase2 const &pos) const
Returns a new
TransformState
object that represents the original 2-dTransformState
with its pos component replaced with the indicated value.
-
ConstPointerTo<TransformState> set_quat(LQuaternion const &quat) const
Returns a new
TransformState
object that represents the originalTransformState
with its rotation component replaced with the indicated value, if possible.
-
ConstPointerTo<TransformState> set_rotate2d(PN_stdfloat rotate) const
Returns a new
TransformState
object that represents the original 2-dTransformState
with its rotation component replaced with the indicated value, if possible.
-
ConstPointerTo<TransformState> set_scale(LVecBase3 const &scale) const
Returns a new
TransformState
object that represents the originalTransformState
with its scale component replaced with the indicated value, if possible.
-
ConstPointerTo<TransformState> set_scale2d(LVecBase2 const &scale) const
Returns a new
TransformState
object that represents the original 2-dTransformState
with its scale component replaced with the indicated value, if possible.
-
ConstPointerTo<TransformState> set_shear(LVecBase3 const &shear) const
Returns a new
TransformState
object that represents the originalTransformState
with its shear component replaced with the indicated value, if possible.
-
ConstPointerTo<TransformState> set_shear2d(PN_stdfloat shear) const
Returns a new
TransformState
object that represents the original 2-dTransformState
with its shear component replaced with the indicated value, if possible.
-
bool validate_composition_cache(void) const
Returns true if the composition cache and invert composition cache for this particular
TransformState
are self-consistent and valid, false otherwise.
-
static bool validate_states(void)
Ensures that the cache is still stored in sorted order, and that none of the cache elements have been inadvertently deleted. Returns true if so, false if there is a problem (which implies someone has modified one of the supposedly-const
TransformState
objects).
-
void write(std::ostream &out, int indent_level) const
-
void write_composition_cache(std::ostream &out, int indent_level) const
Writes a brief description of the composition cache and invert composition cache to the indicated ostream. This is not useful except for performance analysis, to examine the cache structure.
-
void cache_ref(void) const