Panda3D
 All Classes Functions Variables Enumerations
odeJoint.cxx
00001 // Filename: odeJoint.cxx
00002 // Created by:  joswilso (27Dec06)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 #include "config_ode.h"
00016 #include "odeJoint.h"
00017 
00018 TypeHandle OdeJoint::_type_handle;
00019 
00020 OdeJoint::
00021 OdeJoint() : 
00022   _id(0) {
00023   ostream &out = odejoint_cat.debug();
00024   out << get_type() << "(" << _id  << ")\n";
00025 }
00026 
00027 OdeJoint::
00028 OdeJoint(dJointID id) : 
00029   _id(id) {
00030   ostream &out = odejoint_cat.debug();
00031   out << get_type() << "(" << _id  << ")\n";
00032 }
00033 
00034 OdeJoint::
00035 ~OdeJoint() {
00036 }
00037 
00038 void OdeJoint::
00039 destroy() {
00040   nassertv(_id);
00041   dJointDestroy(_id);
00042 }
00043 
00044 ////////////////////////////////////////////////////////////////////
00045 //     Function: OdeJoint::attach_bodies
00046 //       Access: Published
00047 //  Description: Attaches two OdeBody objects to this joint.
00048 //               Order is important.
00049 //               Consider using the OdeJoint::attach extension
00050 //               function if you're using the Python interface.
00051 ////////////////////////////////////////////////////////////////////
00052 void OdeJoint::
00053 attach_bodies(const OdeBody &body1, const OdeBody &body2) {
00054   nassertv(_id);
00055   nassertv(body1.get_id() != 0 && body2.get_id() != 0);
00056   dJointAttach(_id, body1.get_id(), body2.get_id());
00057 }
00058 
00059 ////////////////////////////////////////////////////////////////////
00060 //     Function: OdeJoint::attach_body
00061 //       Access: Published
00062 //  Description: Attaches a single OdeBody to this joint at the
00063 //               specified index (0 or 1).  The other index will be 
00064 //               set to the environment (null).
00065 //               Consider using the OdeJoint::attach extension
00066 //               function if you're using the Python interface.
00067 ////////////////////////////////////////////////////////////////////
00068 void OdeJoint::
00069 attach_body(const OdeBody &body, int index) {
00070   nassertv(_id);
00071   nassertv(body.get_id() != 0);
00072   nassertv(index == 0 || index == 1);
00073   if (index == 0) {
00074     dJointAttach(_id, body.get_id(), 0);
00075   } else {
00076     dJointAttach(_id, 0, body.get_id());
00077   }
00078 }
00079 
00080 void OdeJoint::
00081 detach() {
00082   nassertv(_id);
00083   dJointAttach(_id, 0, 0);
00084 }
00085 
00086 OdeBody OdeJoint::
00087 get_body(int index) const {
00088   nassertr(_id, OdeBody(0));
00089   nassertr(index == 0 || index == 1, OdeBody(0));
00090   return OdeBody(dJointGetBody(_id, index));
00091 }
00092 
00093 void OdeJoint::
00094 write(ostream &out, unsigned int indent) const {
00095   out.width(indent); out << "" << get_type() \
00096                          << "(id = " << _id \
00097                          << ", body1 = ";
00098   OdeBody body = get_body(0);
00099   if (body.get_id() != 0) {
00100     body.write(out);
00101   }
00102   else {
00103     out << "0";
00104   }
00105   out << ", body2 = ";
00106   body = get_body(1);
00107   if (body.get_id() != 0) {
00108     body.write(out);
00109   }
00110   else {
00111     out << "0";
00112   }
00113   out << ")";
00114 
00115 }
00116 
00117 OdeJoint::
00118 operator bool () const {
00119   return (_id != NULL);
00120 }
00121 
00122 OdeBallJoint OdeJoint::
00123 convert_to_ball() const {
00124   nassertr(_id != 0, OdeBallJoint(0));
00125   nassertr(get_joint_type() == JT_ball, OdeBallJoint(0));
00126   return OdeBallJoint(_id);
00127 }
00128 
00129 OdeHingeJoint OdeJoint::
00130 convert_to_hinge() const {
00131   nassertr(_id != 0, OdeHingeJoint(0));
00132   nassertr(get_joint_type() == JT_hinge, OdeHingeJoint(0));
00133   return OdeHingeJoint(_id);
00134 }
00135 
00136 OdeSliderJoint OdeJoint::
00137 convert_to_slider() const {
00138   nassertr(_id != 0, OdeSliderJoint(0));
00139   nassertr(get_joint_type() == JT_slider, OdeSliderJoint(0));
00140   return OdeSliderJoint(_id);
00141 }
00142 
00143 OdeContactJoint OdeJoint::
00144 convert_to_contact() const {
00145   nassertr(_id != 0, OdeContactJoint(0));
00146   nassertr(get_joint_type() == JT_contact, OdeContactJoint(0));
00147   return OdeContactJoint(_id);
00148 }
00149 
00150 OdeUniversalJoint OdeJoint::
00151 convert_to_universal() const {
00152   nassertr(_id != 0, OdeUniversalJoint(0));
00153   nassertr(get_joint_type() == JT_universal, OdeUniversalJoint(0));
00154   return OdeUniversalJoint(_id);
00155 }
00156 
00157 OdeHinge2Joint OdeJoint::
00158 convert_to_hinge2() const {
00159   nassertr(_id != 0, OdeHinge2Joint(0));
00160   nassertr(get_joint_type() == JT_hinge2, OdeHinge2Joint(0));
00161   return OdeHinge2Joint(_id);
00162 }
00163 
00164 OdeFixedJoint OdeJoint::
00165 convert_to_fixed() const {
00166   nassertr(_id != 0, OdeFixedJoint(0));
00167   nassertr(get_joint_type() == JT_fixed, OdeFixedJoint(0));
00168   return OdeFixedJoint(_id);
00169 }
00170 
00171 OdeNullJoint OdeJoint::
00172 convert_to_null() const {
00173   nassertr(_id != 0, OdeNullJoint(0));
00174   nassertr(get_joint_type() == JT_null, OdeNullJoint(0));
00175   return OdeNullJoint(_id);
00176 }
00177 
00178 OdeAMotorJoint OdeJoint::
00179 convert_to_a_motor() const {
00180   nassertr(_id != 0, OdeAMotorJoint(0));
00181   nassertr(get_joint_type() == JT_a_motor, OdeAMotorJoint(0));
00182   return OdeAMotorJoint(_id);
00183 }
00184 
00185 OdeLMotorJoint OdeJoint::
00186 convert_to_l_motor() const {
00187   nassertr(_id != 0, OdeLMotorJoint(0));
00188   nassertr(get_joint_type() == JT_l_motor, OdeLMotorJoint(0));
00189   return OdeLMotorJoint(_id);
00190 }
00191 
00192 OdePlane2dJoint OdeJoint::
00193 convert_to_plane2d() const {
00194   nassertr(_id != 0, OdePlane2dJoint(0));
00195   nassertr(get_joint_type() == JT_plane2d, OdePlane2dJoint(0));
00196   return OdePlane2dJoint(_id);
00197 }
00198 
 All Classes Functions Variables Enumerations