206 lines
7.5 KiB
Plaintext
206 lines
7.5 KiB
Plaintext
// Filename: eggTransform3d.I
|
|
// Created by: drose (21Jun02)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://www.panda3d.org/license.txt .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d@yahoogroups.com .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::Component::Constructor
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggTransform3d::Component::
|
|
Component(EggTransform3d::ComponentType type, double number) :
|
|
_type(type),
|
|
_number(number)
|
|
{
|
|
_vector = (LVector3d *)NULL;
|
|
_matrix = (LMatrix4d *)NULL;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::Component::Copy Constructor
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggTransform3d::Component::
|
|
Component(const EggTransform3d::Component ©) :
|
|
_type(copy._type),
|
|
_number(copy._number)
|
|
{
|
|
_vector = (LVector3d *)NULL;
|
|
_matrix = (LMatrix4d *)NULL;
|
|
if (copy._vector != (LVector3d *)NULL) {
|
|
_vector = new LVector3d(*copy._vector);
|
|
}
|
|
if (copy._matrix != (LMatrix4d *)NULL) {
|
|
_matrix = new LMatrix4d(*copy._matrix);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::Component::Copy Assignment Operator
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE void EggTransform3d::Component::
|
|
operator = (const EggTransform3d::Component ©) {
|
|
_type = copy._type;
|
|
_number = copy._number;
|
|
if (_vector != (LVector3d *)NULL) {
|
|
delete _vector;
|
|
_vector = (LVector3d *)NULL;
|
|
}
|
|
if (_matrix != (LMatrix4d *)NULL) {
|
|
delete _matrix;
|
|
_matrix = (LMatrix4d *)NULL;
|
|
}
|
|
if (copy._vector != (LVector3d *)NULL) {
|
|
_vector = new LVector3d(*copy._vector);
|
|
}
|
|
if (copy._matrix != (LMatrix4d *)NULL) {
|
|
_matrix = new LMatrix4d(*copy._matrix);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::Component::Destructor
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggTransform3d::Component::
|
|
~Component() {
|
|
if (_vector != (LVector3d *)NULL) {
|
|
delete _vector;
|
|
}
|
|
if (_matrix != (LMatrix4d *)NULL) {
|
|
delete _matrix;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::has_transform
|
|
// Access: Public
|
|
// Description: Returns true if the transform is nonempty, false if
|
|
// it is empty (no transform components have been
|
|
// added).
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggTransform3d::
|
|
has_transform() const {
|
|
return !_components.empty();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::set_transform
|
|
// Access: Public
|
|
// Description: Sets the overall transform as a 4x4 matrix. This
|
|
// completely replaces whatever componentwise transform
|
|
// may have been defined.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE void EggTransform3d::
|
|
set_transform(const LMatrix4d &mat) {
|
|
clear_transform();
|
|
add_matrix(mat);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::get_transform
|
|
// Access: Public
|
|
// Description: Returns the overall transform as a 4x4 matrix.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE const LMatrix4d &EggTransform3d::
|
|
get_transform() const {
|
|
return _transform;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::transform_is_identity
|
|
// Access: Public
|
|
// Description: Returns true if the described transform is identity,
|
|
// false otherwise.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggTransform3d::
|
|
transform_is_identity() const {
|
|
return _components.empty() ||
|
|
_transform.almost_equal(LMatrix4d::ident_mat(), 0.0001);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::get_num_components
|
|
// Access: Public
|
|
// Description: Returns the number of components that make up the
|
|
// transform.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE int EggTransform3d::
|
|
get_num_components() const {
|
|
return _components.size();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::get_component_type
|
|
// Access: Public
|
|
// Description: Returns the type of the nth component.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggTransform3d::ComponentType EggTransform3d::
|
|
get_component_type(int n) const {
|
|
nassertr(n >= 0 && n < (int)_components.size(), CT_invalid);
|
|
return _components[n]._type;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::get_component_number
|
|
// Access: Public
|
|
// Description: Returns the solitary number associated with the nth
|
|
// component. In the case of a rotation, this is the
|
|
// angle in degrees to rotate; in the case of uniform
|
|
// scale, this is the amount of the scale. Other types
|
|
// do not use this property.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE double EggTransform3d::
|
|
get_component_number(int n) const {
|
|
nassertr(n >= 0 && n < (int)_components.size(), 0.0);
|
|
return _components[n]._number;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::get_component_vector
|
|
// Access: Public
|
|
// Description: Returns the 3-component vector associated with the
|
|
// nth component. This may be the translate vector,
|
|
// rotate axis, or non-uniform scale. It is an error to
|
|
// call this if the component type does not use a vector
|
|
// property.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE const LVector3d &EggTransform3d::
|
|
get_component_vector(int n) const {
|
|
nassertr(n >= 0 && n < (int)_components.size(), LVector3d::zero());
|
|
nassertr(_components[n]._vector != (LVector3d *)NULL, LVector3d::zero());
|
|
return *_components[n]._vector;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggTransform3d::get_component_matrix
|
|
// Access: Public
|
|
// Description: Returns the 4x4 matrix associated with the nth
|
|
// component. It is an error to call this if the
|
|
// component type is not CT_matrix.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE const LMatrix4d &EggTransform3d::
|
|
get_component_matrix(int n) const {
|
|
nassertr(n >= 0 && n < (int)_components.size(), LMatrix4d::ident_mat());
|
|
nassertr(_components[n]._matrix != (LMatrix4d *)NULL, LMatrix4d::ident_mat());
|
|
return *_components[n]._matrix;
|
|
}
|