From 2dd29ce829ee8d46332b6e809b4ccaa566987aea Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 20 Jun 2002 23:07:38 +0000 Subject: [PATCH] DriveInterface sends componentwise transforms instead of composed matrices --- panda/src/pgraph/config_pgraph.cxx | 2 + panda/src/pgraph/transformState.h | 7 +++ panda/src/tform/driveInterface.I | 69 ---------------------- panda/src/tform/driveInterface.cxx | 91 +++++------------------------- panda/src/tform/driveInterface.h | 20 ++----- panda/src/tform/trackball.cxx | 6 +- panda/src/tform/trackball.h | 4 +- panda/src/tform/transform2sg.cxx | 8 +-- 8 files changed, 39 insertions(+), 168 deletions(-) diff --git a/panda/src/pgraph/config_pgraph.cxx b/panda/src/pgraph/config_pgraph.cxx index 5a9d2931d2..0e7593c111 100644 --- a/panda/src/pgraph/config_pgraph.cxx +++ b/panda/src/pgraph/config_pgraph.cxx @@ -221,6 +221,8 @@ init_libpgraph() { ColorLerpFunctor::init_type(); ColorScaleLerpFunctor::init_type(); + EventStoreTransform::init_type("EventStoreTransform"); + AlphaTestAttrib::register_with_read_factory(); AmbientLight::register_with_read_factory(); BillboardEffect::register_with_read_factory(); diff --git a/panda/src/pgraph/transformState.h b/panda/src/pgraph/transformState.h index 39e6ab6910..81f8d2f023 100644 --- a/panda/src/pgraph/transformState.h +++ b/panda/src/pgraph/transformState.h @@ -26,6 +26,7 @@ #include "indirectLess.h" #include "luse.h" #include "pset.h" +#include "event.h" class GraphicsStateGuardianBase; class FactoryParams; @@ -225,6 +226,12 @@ INLINE ostream &operator << (ostream &out, const TransformState &state) { return out; } +// This class is used to pass TransformState pointers as parameters to +// events, or as elements on a data graph. +EXPORT_TEMPLATE_CLASS(EXPCL_PANDA, EXPTP_PANDA, EventStoreValue); + +typedef EventStoreValue EventStoreTransform; + #include "transformState.I" #endif diff --git a/panda/src/tform/driveInterface.I b/panda/src/tform/driveInterface.I index 8d7dbdb17f..3393578712 100644 --- a/panda/src/tform/driveInterface.I +++ b/panda/src/tform/driveInterface.I @@ -300,31 +300,26 @@ get_z() const { INLINE void DriveInterface:: set_pos(const LVecBase3f &vec) { _xyz = vec; - recompute(); } INLINE void DriveInterface:: set_pos(float x, float y, float z) { _xyz.set(x, y, z); - recompute(); } INLINE void DriveInterface:: set_x(float x) { _xyz[0] = x; - recompute(); } INLINE void DriveInterface:: set_y(float y) { _xyz[1] = y; - recompute(); } INLINE void DriveInterface:: set_z(float z) { _xyz[2] = z; - recompute(); } @@ -362,90 +357,26 @@ get_r() const { INLINE void DriveInterface:: set_hpr(const LVecBase3f &hpr) { _hpr = hpr; - recompute(); } INLINE void DriveInterface:: set_hpr(float h, float p, float r) { _hpr.set(h, p, r); - recompute(); - - if (_is_force_roll && r != _force_roll) { - reextract(); - } } INLINE void DriveInterface:: set_h(float h) { _hpr[0] = h; - recompute(); } INLINE void DriveInterface:: set_p(float p) { _hpr[1] = p; - recompute(); } INLINE void DriveInterface:: set_r(float r) { _hpr[2] = r; - recompute(); - - if (_is_force_roll && r != _force_roll) { - reextract(); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: DriveInterface::is_force_roll -// Access: Published -// Description: Returns true if the force_roll state is in effect, -// e.g. because of a previous call to set_force_roll(). -// In this state, the roll cannot be set to any value -// other than what the force_roll value indicates. -//////////////////////////////////////////////////////////////////// -INLINE bool DriveInterface:: -is_force_roll() const { - return _is_force_roll; -} - -//////////////////////////////////////////////////////////////////// -// Function: DriveInterface::clear_force_roll -// Access: Published -// Description: Disables the force_roll state. See set_force_roll(). -//////////////////////////////////////////////////////////////////// -INLINE void DriveInterface:: -clear_force_roll() { - _is_force_roll = false; -} - - -//////////////////////////////////////////////////////////////////// -// Function: DriveInterface::set_coordinate_system -// Access: Published -// Description: Sets the coordinate system of the DriveInterface. -// Normally, this is the default coordinate system. -// This changes the plane the user drives around in; -// it's normally the horizontal plane (e.g. the X-Y -// plane in a Z-up coordinate system, or the X-Z plane -// in a Y-up coordinate system). -//////////////////////////////////////////////////////////////////// -INLINE void DriveInterface:: -set_coordinate_system(CoordinateSystem cs) { - _cs = cs; - recompute(); -} - -//////////////////////////////////////////////////////////////////// -// Function: DriveInterface::get_coordinate_system -// Access: Published -// Description: Returns the coordinate system of the DriveInterface. -// See set_coordinate_system(). -//////////////////////////////////////////////////////////////////// -INLINE CoordinateSystem DriveInterface:: -get_coordinate_system() const { - return _cs; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/tform/driveInterface.cxx b/panda/src/tform/driveInterface.cxx index 0752f73408..e52e41ccfc 100644 --- a/panda/src/tform/driveInterface.cxx +++ b/panda/src/tform/driveInterface.cxx @@ -111,10 +111,10 @@ DriveInterface(const string &name) : _xy_input = define_input("xy", EventStoreVec2::get_class_type()); _button_events_input = define_input("button_events", ButtonEventList::get_class_type()); - _transform_output = define_output("transform", EventStoreMat4::get_class_type()); + _transform_output = define_output("transform", EventStoreTransform::get_class_type()); _velocity_output = define_output("velocity", EventStoreVec3::get_class_type()); - _transform = new EventStoreMat4(LMatrix4f::ident_mat()); + _transform = new EventStoreTransform(TransformState::make_identity()); _velocity = new EventStoreVec3(LVector3f::zero()); _forward_speed = drive_forward_speed; @@ -135,11 +135,7 @@ DriveInterface(const string &name) : _xyz.set(0.0f, 0.0f, 0.0f); _hpr.set(0.0f, 0.0f, 0.0f); - _mat = LMatrix4f::ident_mat(); - _force_roll = 0.0f; - _is_force_roll = true; - _cs = default_coordinate_system; _ignore_mouse = false; _force_mouse = false; @@ -169,8 +165,6 @@ void DriveInterface:: reset() { _xyz.set(0.0f, 0.0f, 0.0f); _hpr.set(0.0f, 0.0f, 0.0f); - _force_roll = 0.0f; - _mat = LMatrix4f::ident_mat(); _up_arrow.clear(); _down_arrow.clear(); _left_arrow.clear(); @@ -183,49 +177,32 @@ reset() { //////////////////////////////////////////////////////////////////// // Function: DriveInterface::set_force_roll // Access: Published -// Description: Sets the force_roll state. In this state, roll is -// always fixed to a particular value (typically zero), -// regardless of what it is explicitly set to via -// set_hpr(). +// Description: This function is no longer used and does nothing. It +// will be removed soon. //////////////////////////////////////////////////////////////////// void DriveInterface:: -set_force_roll(float force_roll) { - if (_is_force_roll) { - // If we already had force_roll() in effect, we have to - // recompensate for it. - if (_force_roll != force_roll) { - _force_roll = force_roll; - reextract(); - } - - } else { - _force_roll = force_roll; - _is_force_roll = true; - } +set_force_roll(float) { } //////////////////////////////////////////////////////////////////// // Function: DriveInterface::set_mat // Access: Published // Description: Stores the indicated transform in the DriveInterface. -// This is a transform in global space, regardless of -// the rel_to node. //////////////////////////////////////////////////////////////////// void DriveInterface:: set_mat(const LMatrix4f &mat) { - _mat = mat; - reextract(); + LVecBase3f scale; + decompose_matrix(mat, scale, _hpr, _xyz); } - //////////////////////////////////////////////////////////////////// // Function: DriveInterface::get_mat // Access: Published -// Description: Returns the net transformation applied by the -// current state. +// Description: Returns the current transform. //////////////////////////////////////////////////////////////////// const LMatrix4f &DriveInterface:: -get_mat() const { +get_mat() { + compose_matrix(_mat, LVecBase3f(1.0f, 1.0f, 1.0f), _hpr, _xyz); return _mat; } @@ -240,7 +217,7 @@ get_mat() const { //////////////////////////////////////////////////////////////////// void DriveInterface:: force_dgraph() { - _transform->set_value(_mat); + _transform->set_value(TransformState::make_pos_hpr(_xyz, _hpr)); _velocity->set_value(_vel); DataNodeTransmit output; @@ -373,16 +350,16 @@ apply(double x, double y, bool any_button) { // rot_mat is the rotation matrix corresponding to our previous // heading. LMatrix3f rot_mat = - LMatrix3f::rotate_mat_normaxis(_hpr[0], LVector3f::up(_cs), _cs); + LMatrix3f::rotate_mat_normaxis(_hpr[0], LVector3f::up()); // Take a step in the direction of our previous heading. - _vel = LVector3f::forward(_cs) * distance; + _vel = LVector3f::forward() * distance; LVector3f step = (_vel * rot_mat); // To prevent upward drift due to numerical errors, force the // vertical component of our step to zero (it should be pretty near // zero anyway). - switch (_cs) { + switch (default_coordinate_system) { case CS_zup_right: case CS_zup_left: step[2] = 0.0f; @@ -399,44 +376,6 @@ apply(double x, double y, bool any_button) { _xyz += step; _hpr[0] -= rotation; - - recompute(); -} - - -//////////////////////////////////////////////////////////////////// -// Function: DriveInterface::reextract -// Access: Private -// Description: Given a correctly computed _mat matrix, rederive the -// translation and rotation elements. -//////////////////////////////////////////////////////////////////// -void DriveInterface:: -reextract() { - LVecBase3f scale; - - if (_is_force_roll) { - // We strongly discourage a roll other than _force_roll. - decompose_matrix(_mat, scale, _hpr, _xyz, _force_roll); - } else { - decompose_matrix(_mat, scale, _hpr, _xyz); - } - - if (tform_cat.is_debug()) { - tform_cat.debug() - << "Reextract " << _hpr << ", " << _xyz << " from:\n"; - _mat.write(tform_cat.debug(false), 2); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: DriveInterface::recompute -// Access: Private -// Description: Rebuilds the matrix according to the stored rotation -// and translation components. -//////////////////////////////////////////////////////////////////// -void DriveInterface:: -recompute() { - compose_matrix(_mat, LVecBase3f(1.0f, 1.0f, 1.0f), _hpr, _xyz, _cs); } //////////////////////////////////////////////////////////////////// @@ -508,7 +447,7 @@ do_transmit_data(const DataNodeTransmit &input, DataNodeTransmit &output) { } apply(x, y, _mods.is_any_down()); - _transform->set_value(_mat); + _transform->set_value(TransformState::make_pos_hpr(_xyz, _hpr)); _velocity->set_value(_vel); output.set_data(_transform_output, EventParameter(_transform)); output.set_data(_velocity_output, EventParameter(_velocity)); diff --git a/panda/src/tform/driveInterface.h b/panda/src/tform/driveInterface.h index 2d15fa61f5..95fc5557bf 100644 --- a/panda/src/tform/driveInterface.h +++ b/panda/src/tform/driveInterface.h @@ -25,6 +25,7 @@ #include "modifierButtons.h" #include "luse.h" #include "linmath_events.h" +#include "transformState.h" //////////////////////////////////////////////////////////////////// @@ -89,11 +90,6 @@ PUBLISHED: INLINE void set_r(float r); void set_force_roll(float force_roll); - INLINE bool is_force_roll() const; - INLINE void clear_force_roll(); - - INLINE void set_coordinate_system(CoordinateSystem cs); - INLINE CoordinateSystem get_coordinate_system() const; INLINE void set_ignore_mouse(bool ignore_mouse); INLINE bool get_ignore_mouse() const; @@ -102,16 +98,13 @@ PUBLISHED: INLINE bool get_force_mouse() const; void set_mat(const LMatrix4f &mat); - const LMatrix4f &get_mat() const; + const LMatrix4f &get_mat(); void force_dgraph(); private: void apply(double x, double y, bool any_button); - void reextract(); - void recompute(); - float _forward_speed; // units / sec, mouse all the way up float _reverse_speed; // units / sec, mouse all the way down float _rotate_speed; // degrees / sec, mouse all the way over @@ -132,14 +125,13 @@ private: LPoint3f _xyz; LVecBase3f _hpr; - LMatrix4f _mat; LVector3f _vel; - float _force_roll; - bool _is_force_roll; - CoordinateSystem _cs; bool _ignore_mouse; bool _force_mouse; + // This is only used to return a temporary value in get_mat(). + LMatrix4f _mat; + // Remember which mouse buttons are being held down. ModifierButtons _mods; @@ -176,7 +168,7 @@ private: int _transform_output; int _velocity_output; - PT(EventStoreMat4) _transform; + PT(EventStoreTransform) _transform; PT(EventStoreVec3) _velocity; public: diff --git a/panda/src/tform/trackball.cxx b/panda/src/tform/trackball.cxx index 64998c7c46..af9eed65bd 100644 --- a/panda/src/tform/trackball.cxx +++ b/panda/src/tform/trackball.cxx @@ -43,9 +43,9 @@ Trackball(const string &name) : _pixel_xy_input = define_input("pixel_xy", EventStoreVec2::get_class_type()); _button_events_input = define_input("button_events", ButtonEventList::get_class_type()); - _transform_output = define_output("transform", EventStoreMat4::get_class_type()); + _transform_output = define_output("transform", EventStoreTransform::get_class_type()); - _transform = new EventStoreMat4(LMatrix4f::ident_mat()); + _transform = new EventStoreTransform(TransformState::make_identity()); _rotscale = 0.3f; _fwdscale = 0.3f; @@ -570,6 +570,6 @@ do_transmit_data(const DataNodeTransmit &input, DataNodeTransmit &output) { } // Now send our matrix down the pipe. - _transform->set_value(_mat); + _transform->set_value(TransformState::make_mat(_mat)); output.set_data(_transform_output, EventParameter(_transform)); } diff --git a/panda/src/tform/trackball.h b/panda/src/tform/trackball.h index c63ab6e95e..80b87d00cd 100644 --- a/panda/src/tform/trackball.h +++ b/panda/src/tform/trackball.h @@ -25,7 +25,7 @@ #include "nodePath.h" #include "modifierButtons.h" #include "luse.h" -#include "linmath_events.h" +#include "transformState.h" //////////////////////////////////////////////////////////////////// @@ -135,7 +135,7 @@ private: // outputs int _transform_output; - PT(EventStoreMat4) _transform; + PT(EventStoreTransform) _transform; public: static TypeHandle get_class_type() { diff --git a/panda/src/tform/transform2sg.cxx b/panda/src/tform/transform2sg.cxx index 61068bd20d..86961eea35 100644 --- a/panda/src/tform/transform2sg.cxx +++ b/panda/src/tform/transform2sg.cxx @@ -31,7 +31,7 @@ Transform2SG:: Transform2SG(const string &name) : DataNode(name) { - _transform_input = define_input("transform", EventStoreMat4::get_class_type()); + _transform_input = define_input("transform", EventStoreTransform::get_class_type()); _velocity_input = define_input("velocity", EventStoreVec3::get_class_type()); _node = NULL; @@ -103,11 +103,11 @@ get_velocity_node() const { void Transform2SG:: do_transmit_data(const DataNodeTransmit &input, DataNodeTransmit &) { if (input.has_data(_transform_input)) { - const EventStoreMat4 *transform; + const EventStoreTransform *transform; DCAST_INTO_V(transform, input.get_data(_transform_input).get_ptr()); - const LMatrix4f &mat = transform->get_value(); + CPT(TransformState) ts = transform->get_value(); if (_node != (PandaNode *)NULL) { - _node->set_transform(TransformState::make_mat(mat)); + _node->set_transform(ts); } }