// Filename: eggTransform.h // Created by: drose (21Jun02) // //////////////////////////////////////////////////////////////////// // // PANDA 3D SOFTWARE // Copyright (c) Carnegie Mellon University. All rights reserved. // // All use of this software is subject to the terms of the revised BSD // license. You should have received a copy of this license along // with this source code in a file named "LICENSE." // //////////////////////////////////////////////////////////////////// #ifndef EGGTRANSFORM_H #define EGGTRANSFORM_H #include "pandabase.h" #include "luse.h" #include "eggObject.h" //////////////////////////////////////////////////////////////////// // Class : EggTransform // Description : This represents the entry of a group // or texture node: a list of component transform // operations, applied in order, that describe a net // transform matrix. // // This may be either a 3-d transform, and therefore // described by a 4x4 matrix, or a 2-d transform, // described by a 3x3 matrix. //////////////////////////////////////////////////////////////////// class EXPCL_PANDAEGG EggTransform { PUBLISHED: EggTransform(); EggTransform(const EggTransform ©); EggTransform &operator = (const EggTransform ©); virtual ~EggTransform(); INLINE void clear_transform(); void add_translate2d(const LVector2d &translate); void add_translate3d(const LVector3d &translate); void add_rotate2d(double angle); void add_rotx(double angle); void add_roty(double angle); void add_rotz(double angle); void add_rotate3d(double angle, const LVector3d &axis); void add_rotate3d(const LQuaterniond &quat); void add_scale2d(const LVecBase2d &scale); void add_scale3d(const LVecBase3d &scale); void add_uniform_scale(double scale); INLINE void add_matrix3(const LMatrix3d &mat); INLINE void add_matrix4(const LMatrix4d &mat); INLINE bool has_transform() const; INLINE bool has_transform2d() const; INLINE void set_transform2d(const LMatrix3d &mat); INLINE bool has_transform3d() const; INLINE void set_transform3d(const LMatrix4d &mat); INLINE LMatrix3d get_transform2d() const; INLINE const LMatrix4d &get_transform3d() const; INLINE bool transform_is_identity() const; enum ComponentType { CT_invalid, CT_translate2d, CT_translate3d, CT_rotate2d, CT_rotx, CT_roty, CT_rotz, CT_rotate3d, CT_scale2d, CT_scale3d, CT_uniform_scale, CT_matrix3, CT_matrix4 }; INLINE int get_num_components() const; INLINE ComponentType get_component_type(int n) const; INLINE double get_component_number(int n) const; INLINE const LVecBase2d &get_component_vec2(int n) const; INLINE const LVecBase3d &get_component_vec3(int n) const; INLINE const LMatrix3d &get_component_mat3(int n) const; INLINE const LMatrix4d &get_component_mat4(int n) const; void write(ostream &out, int indent_level, const string &label) const; protected: void internal_clear_transform(); void internal_add_matrix(const LMatrix3d &mat); void internal_add_matrix(const LMatrix4d &mat); INLINE void internal_set_transform(const LMatrix3d &mat); INLINE void internal_set_transform(const LMatrix4d &mat); virtual void transform_changed(); private: class Component { public: INLINE Component(ComponentType type, double number = 0.0); INLINE Component(const Component ©); INLINE void operator = (const Component ©); INLINE ~Component(); ComponentType _type; double _number; LVecBase2d *_vec2; LVecBase3d *_vec3; LMatrix3d *_mat3; LMatrix4d *_mat4; }; bool _is_transform_2d; typedef pvector Components; Components _components; LMatrix4d _transform; }; #include "eggTransform.I" #endif