Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/physics/src/ogreode/OgreOdeJoint.cpp @ 2132

Last change on this file since 2132 was 2119, checked in by rgrieder, 16 years ago

Merged physics branch into physics_new branch.

  • Property svn:eol-style set to native
File size: 20.6 KB
Line 
1#include "OgreOdePrecompiledHeaders.h"
2#include "OgreOdeJoint.h"
3
4#include "OgreOdeWorld.h"
5#include "OgreOdeBody.h"
6#include "OgreOdeGeometry.h"
7
8using namespace OgreOde;
9using namespace Ogre;
10
11//------------------------------------------------------------------------------------------------
12JointGroup::JointGroup(World *world):
13_world(world)
14{
15        _joint_group = dJointGroupCreate(0); 
16        _world->getJointGroupList().registerItem(this);
17}
18//------------------------------------------------------------------------------------------------
19dJointGroupID JointGroup::getJointGroupID() const
20{
21        return _joint_group;
22}
23
24size_t JointGroup::getID()
25{
26        return (size_t)_joint_group;
27}
28
29void JointGroup::empty()
30{
31        dJointGroupEmpty(_joint_group); 
32}
33
34JointGroup::~JointGroup()
35{
36        _world->getJointGroupList().unregisterItem((size_t)_joint_group);
37        dJointGroupDestroy(_joint_group); 
38}
39
40Joint::Joint(World *world, const JointGroup* group):
41    _world(world)
42{
43}
44
45void Joint::registerJoint()
46{
47        _world->getJointList().registerItem(this);
48}
49
50void Joint::setAnchor(const Ogre::Vector3& position)
51{
52}
53
54void Joint::addTorque(Real torque,Real torque2,Real torque3)
55{
56}
57
58void Joint::addForce(Real force,Real force2,Real force3)
59{
60}
61
62const Ogre::Vector3& Joint::getAnchor()
63{
64        return Ogre::Vector3::ZERO;
65}
66
67const Ogre::Vector3& Joint::getAnchorError()
68{
69        return Ogre::Vector3::ZERO;
70}
71
72void Joint::setAxis(const Ogre::Vector3& axis)
73{
74}
75
76const Ogre::Vector3& Joint::getAxis()
77{
78        return Ogre::Vector3::ZERO;
79}
80
81void Joint::setAdditionalAxis(const Ogre::Vector3& axis)
82{
83}
84
85const Ogre::Vector3& Joint::getAdditionalAxis()
86{
87        return Ogre::Vector3::ZERO;
88}
89
90Real Joint::getAngle()
91{
92        return 0.0;
93}
94
95Real Joint::getAngleRate()
96{
97        return 0.0;
98}
99
100Real Joint::getPosition()
101{
102        return 0.0;
103}
104
105Real Joint::getPositionRate()
106{
107        return 0.0;
108}
109
110size_t Joint::getID()
111{
112        return (size_t)_joint;
113}
114
115Joint::~Joint()
116{
117        _world->getJointList().unregisterItem((size_t)_joint);
118        dJointDestroy(_joint); 
119}
120
121dWorldID Joint::getWorldID()
122{
123        return _world->getWorldID();
124}
125
126dJointGroupID Joint::getJointGroupID(const JointGroup* group) const
127{
128        return ((group)?group->getJointGroupID():0);
129}
130
131dJointID Joint::getJointID()
132{
133        return _joint;
134}
135
136Joint::Type Joint::getType()
137{
138        return (Joint::Type)(dJointGetType(_joint));
139}
140
141Body* Joint::getFirstBody()
142{
143        dBodyID b = dJointGetBody(_joint, 0); 
144        return ((Body*)dBodyGetData(b));
145}
146
147Body* Joint::getSecondBody()
148{
149        dBodyID b = dJointGetBody(_joint,1);
150        return b ? ((Body*)dBodyGetData(b)) : 0; 
151}
152
153bool Joint::areConnected(const Body* body_a,const Body* body_b)
154{
155        return (dAreConnected(body_a->getBodyID(),body_b->getBodyID()))?true:false; 
156}
157
158bool Joint::areConnectedExcluding(const Body* body_a,const Body* body_b,Joint::Type joint_type)
159{
160        return (dAreConnectedExcluding(body_a->getBodyID(),body_b->getBodyID(),(int)joint_type))?true:false; 
161}
162
163void Joint::enableFeedback()
164{
165        dJointSetFeedback(_joint,&_feedback); 
166}
167
168void Joint::disableFeedback()
169{
170        dJointSetFeedback(_joint,0); 
171}
172
173void Joint::detach()
174{
175        dJointAttach(_joint,0,0); 
176}
177
178void Joint::attach(const Body* body)
179{
180        dJointAttach(_joint,body->getBodyID(),0); 
181}
182
183void Joint::attach(const Body* body_a,const Body* body_b)
184{
185        dJointAttach(_joint,body_a->getBodyID(),body_b->getBodyID()); 
186}
187
188const Ogre::Vector3& Joint::getFirstForce()
189{
190        assert(dJointGetFeedback(_joint) == &_feedback);
191
192        _first_force.x = _feedback.f1[0];
193        _first_force.y = _feedback.f1[1];
194        _first_force.z = _feedback.f1[2];
195        return _first_force;
196}
197
198const Ogre::Vector3& Joint::getFirstTorque()
199{
200        assert(dJointGetFeedback(_joint) == &_feedback);
201
202        _first_torque.x = _feedback.t1[0];
203        _first_torque.y = _feedback.t1[1];
204        _first_torque.z = _feedback.t1[2];
205        return _first_torque;
206}
207
208const Ogre::Vector3& Joint::getSecondForce()
209{
210        assert(dJointGetFeedback(_joint) == &_feedback);
211
212        _second_force.x = _feedback.f2[0];
213        _second_force.y = _feedback.f2[1];
214        _second_force.z = _feedback.f2[2];
215        return _second_force;
216}
217
218const Ogre::Vector3& Joint::getSecondTorque()
219{
220        assert(dJointGetFeedback(_joint) == &_feedback);
221
222        _second_torque.x = _feedback.t2[0];
223        _second_torque.y = _feedback.t2[1];
224        _second_torque.z = _feedback.t2[2];
225        return _second_torque;
226}
227
228void Joint::setParameter(Joint::Parameter parameter,Real value,int axis)
229{
230}
231
232Real Joint::getParameter(Joint::Parameter parameter,int axis)
233{
234        return 0.0;
235}
236
237BallJoint::BallJoint(World *world, const JointGroup* group) : Joint(world, group)
238{
239        _joint = dJointCreateBall(getWorldID(),getJointGroupID(group));
240        registerJoint();
241}
242
243void BallJoint::setAnchor(const Ogre::Vector3& position)
244{
245        dJointSetBallAnchor(_joint,(dReal)position.x,(dReal)position.y,(dReal)position.z); 
246}
247
248const Ogre::Vector3& BallJoint::getAnchor()
249{
250        dVector3 result;
251        dJointGetBallAnchor(_joint,result); 
252        _anchor.x = (Real)result[0];
253        _anchor.y = (Real)result[1];
254        _anchor.z = (Real)result[2];
255        return _anchor;
256}
257
258const Ogre::Vector3& BallJoint::getAnchorError()
259{
260        dVector3 result1,result2;
261        dJointGetBallAnchor(_joint,result1); 
262        dJointGetBallAnchor2(_joint,result2); 
263        _anchor_error.x = (Real)(result1[0] - result2[0]);
264        _anchor_error.y = (Real)(result1[1] - result2[1]);
265        _anchor_error.z = (Real)(result1[2] - result2[2]);
266        return _anchor_error;
267}
268
269void BallJoint::setParameter(Joint::Parameter parameter,Real value,int axis)
270{
271        dJointSetBallParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value); 
272}
273
274Real BallJoint::getParameter(Joint::Parameter parameter,int axis)
275{
276        return (Real)dJointGetBallParam(_joint,((int)parameter) + dParamGroup * (axis - 1));
277}
278
279
280BallJoint::~BallJoint()
281{
282}
283
284HingeJoint::HingeJoint(World *world, const JointGroup* group) : Joint(world, group)
285{
286        _joint = dJointCreateHinge(getWorldID(),getJointGroupID(group)); 
287        registerJoint();
288}
289
290void HingeJoint::setAnchor(const Ogre::Vector3& position)
291{
292        dJointSetHingeAnchor(_joint,(dReal)position.x,(dReal)position.y,(dReal)position.z); 
293}
294
295void HingeJoint::addTorque(Real torque,Real torque2,Real torque3)
296{
297        dJointAddHingeTorque(_joint,(dReal)torque);
298}
299
300const Ogre::Vector3& HingeJoint::getAnchor()
301{
302        dVector3 result;
303        dJointGetHingeAnchor(_joint,result); 
304        _anchor.x = (Real)result[0];
305        _anchor.y = (Real)result[1];
306        _anchor.z = (Real)result[2];
307        return _anchor;
308}
309
310const Ogre::Vector3& HingeJoint::getAnchorError()
311{
312        dVector3 result1,result2;
313        dJointGetHingeAnchor(_joint,result1); 
314        dJointGetHingeAnchor2(_joint,result2); 
315        _anchor_error.x = (Real)(result1[0] - result2[0]);
316        _anchor_error.y = (Real)(result1[1] - result2[1]);
317        _anchor_error.z = (Real)(result1[2] - result2[2]);
318        return _anchor_error;
319}
320
321void HingeJoint::setAxis(const Ogre::Vector3& axis)
322{
323        dJointSetHingeAxis(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z);
324}
325
326const Ogre::Vector3& HingeJoint::getAxis()
327{
328        dVector3 result;
329        dJointGetHingeAxis(_joint,result); 
330        _axis.x = (Real)result[0];
331        _axis.y = (Real)result[1];
332        _axis.z = (Real)result[2];
333        return _axis;
334}
335
336Real HingeJoint::getAngle()
337{
338        return (Real)dJointGetHingeAngle(_joint); 
339}
340
341Real HingeJoint::getAngleRate()
342{
343        return (Real)dJointGetHingeAngleRate(_joint); 
344}
345
346void HingeJoint::setParameter(Joint::Parameter parameter,Real value,int axis)
347{
348        dJointSetHingeParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value); 
349}
350
351Real HingeJoint::getParameter(Joint::Parameter parameter,int axis)
352{
353        return (Real)dJointGetHingeParam(_joint,((int)parameter) + dParamGroup * (axis - 1));
354}
355
356HingeJoint::~HingeJoint()
357{
358}
359
360SliderJoint::SliderJoint(World *world, const JointGroup* group) : Joint(world, group)
361{
362        _joint = dJointCreateSlider(getWorldID(),getJointGroupID(group)); 
363        registerJoint();
364}
365
366void SliderJoint::setAxis(const Ogre::Vector3& axis)
367{
368        dJointSetSliderAxis(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z);
369}
370
371const Ogre::Vector3& SliderJoint::getAxis()
372{
373        dVector3 result;
374        dJointGetSliderAxis(_joint,result); 
375        _axis.x = (Real)result[0];
376        _axis.y = (Real)result[1];
377        _axis.z = (Real)result[2];
378        return _axis;
379}
380
381void SliderJoint::addForce(Real force,Real force2,Real force3)
382{
383        dJointAddSliderForce(_joint,(dReal)force);
384}
385
386Real SliderJoint::getPosition()
387{
388        return (Real)dJointGetSliderPosition(_joint); 
389}
390
391Real SliderJoint::getPositionRate()
392{
393        return (Real)dJointGetSliderPositionRate(_joint); 
394}
395
396void SliderJoint::setParameter(Joint::Parameter parameter,Real value,int axis)
397{
398        dJointSetSliderParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value); 
399}
400
401Real SliderJoint::getParameter(Joint::Parameter parameter,int axis)
402{
403        return (Real)dJointGetSliderParam(_joint,((int)parameter) + dParamGroup * (axis - 1));
404}
405
406SliderJoint::~SliderJoint()
407{
408}
409
410UniversalJoint::UniversalJoint(World *world, const JointGroup* group) : Joint(world, group)
411{
412        _joint = dJointCreateUniversal(getWorldID(),getJointGroupID(group)); 
413        registerJoint();
414}
415
416void UniversalJoint::setAnchor(const Ogre::Vector3& position)
417{
418        dJointSetUniversalAnchor(_joint,(dReal)position.x,(dReal)position.y,(dReal)position.z); 
419}
420
421void UniversalJoint::addTorque(Real torque,Real torque2,Real torque3)
422{
423        dJointAddUniversalTorques(_joint,(dReal)torque,(dReal)torque2);
424}
425
426const Ogre::Vector3& UniversalJoint::getAnchor()
427{
428        dVector3 result;
429        dJointGetUniversalAnchor(_joint,result); 
430        _anchor.x = (Real)result[0];
431        _anchor.y = (Real)result[1];
432        _anchor.z = (Real)result[2];
433        return _anchor;
434}
435
436const Ogre::Vector3& UniversalJoint::getAnchorError()
437{
438        dVector3 result1,result2;
439        dJointGetUniversalAnchor(_joint,result1); 
440        dJointGetUniversalAnchor2(_joint,result2); 
441        _anchor_error.x = (Real)(result1[0] - result2[0]);
442        _anchor_error.y = (Real)(result1[1] - result2[1]);
443        _anchor_error.z = (Real)(result1[2] - result2[2]);
444        return _anchor_error;
445}
446
447void UniversalJoint::setAxis(const Ogre::Vector3& axis)
448{
449        dJointSetUniversalAxis1(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z);
450}
451
452const Ogre::Vector3& UniversalJoint::getAxis()
453{
454        dVector3 result;
455        dJointGetUniversalAxis1(_joint,result); 
456        _axis.x = (Real)result[0];
457        _axis.y = (Real)result[1];
458        _axis.z = (Real)result[2];
459        return _axis;
460}
461
462void UniversalJoint::setAdditionalAxis(const Ogre::Vector3& axis)
463{
464        dJointSetUniversalAxis2(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z);
465}
466
467const Ogre::Vector3& UniversalJoint::getAdditionalAxis()
468{
469        dVector3 result;
470        dJointGetUniversalAxis2(_joint,result); 
471        _additional_axis.x = (Real)result[0];
472        _additional_axis.y = (Real)result[1];
473        _additional_axis.z = (Real)result[2];
474        return _additional_axis;
475}
476
477void UniversalJoint::setParameter(Joint::Parameter parameter,Real value,int axis)
478{
479        dJointSetUniversalParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value); 
480}
481
482Real UniversalJoint::getParameter(Joint::Parameter parameter,int axis)
483{
484        return (Real)dJointGetUniversalParam(_joint,((int)parameter) + dParamGroup * (axis - 1));
485}
486
487UniversalJoint::~UniversalJoint()
488{
489}
490
491FixedJoint::FixedJoint(World *world, const JointGroup* group) : Joint(world, group)
492{
493        _joint = dJointCreateFixed(getWorldID(),getJointGroupID(group)); 
494        registerJoint();
495}
496
497void FixedJoint::attach(const Body* body)
498{
499        Joint::attach(body);
500        dJointSetFixed(_joint); 
501}
502
503void FixedJoint::attach(const Body* body_a,const Body* body_b)
504{
505        Joint::attach(body_a,body_b);
506        dJointSetFixed(_joint); 
507}
508
509FixedJoint::~FixedJoint()
510{
511}
512
513SuspensionJoint::SuspensionJoint(World *world, const JointGroup* group) : Joint(world, group)
514{
515        _joint = dJointCreateHinge2(getWorldID(),getJointGroupID(group)); 
516        registerJoint();
517}
518
519void SuspensionJoint::setAnchor(const Ogre::Vector3& position)
520{
521        dJointSetHinge2Anchor(_joint,(dReal)position.x,(dReal)position.y,(dReal)position.z); 
522}
523
524
525void SuspensionJoint::addTorque(Real torque,Real torque2,Real torque3)
526{
527        dJointAddHinge2Torques(_joint,(dReal)torque,(dReal)torque2);
528}
529
530const Ogre::Vector3& SuspensionJoint::getAnchor()
531{
532        dVector3 result;
533        dJointGetHinge2Anchor(_joint,result); 
534        _anchor.x = (Real)result[0];
535        _anchor.y = (Real)result[1];
536        _anchor.z = (Real)result[2];
537        return _anchor;
538}
539
540const Ogre::Vector3& SuspensionJoint::getAdditionalAnchor()
541{
542        dVector3 result;
543        dJointGetHinge2Anchor2(_joint,result);
544        _anchor2.x = (Real)result[0];
545        _anchor2.y = (Real)result[1];
546        _anchor2.z = (Real)result[2];
547        return _anchor2;
548}
549
550const Ogre::Vector3& SuspensionJoint::getAnchorError()
551{
552        dVector3 result1,result2;
553        dJointGetHinge2Anchor(_joint,result1); 
554        dJointGetHinge2Anchor2(_joint,result2); 
555        _anchor_error.x = (Real)(result1[0] - result2[0]);
556        _anchor_error.y = (Real)(result1[1] - result2[1]);
557        _anchor_error.z = (Real)(result1[2] - result2[2]);
558        return _anchor_error;
559}
560
561void SuspensionJoint::setAxis(const Ogre::Vector3& axis)
562{
563        dJointSetHinge2Axis1(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z);
564}
565
566const Ogre::Vector3& SuspensionJoint::getAxis()
567{
568        dVector3 result;
569        dJointGetHinge2Axis1(_joint,result); 
570        _axis.x = (Real)result[0];
571        _axis.y = (Real)result[1];
572        _axis.z = (Real)result[2];
573        return _axis;
574}
575
576void SuspensionJoint::setAdditionalAxis(const Ogre::Vector3& axis)
577{
578        dJointSetHinge2Axis2(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z);
579}
580
581const Ogre::Vector3& SuspensionJoint::getAdditionalAxis()
582{
583        dVector3 result;
584        dJointGetHinge2Axis2(_joint,result); 
585        _additional_axis.x = (Real)result[0];
586        _additional_axis.y = (Real)result[1];
587        _additional_axis.z = (Real)result[2];
588        return _additional_axis;
589}
590
591Real SuspensionJoint::getAngle()
592{
593        return (Real)dJointGetHinge2Angle1(_joint); 
594}
595
596Real SuspensionJoint::getAngleRate()
597{
598        return (Real)dJointGetHinge2Angle1Rate(_joint); 
599}
600
601Real SuspensionJoint::getPositionRate()
602{
603        return (Real)dJointGetHinge2Angle2Rate(_joint); 
604}
605
606void SuspensionJoint::setParameter(Joint::Parameter parameter,Real value,int axis)
607{
608        dJointSetHinge2Param(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value); 
609}
610
611Real SuspensionJoint::getParameter(Joint::Parameter parameter,int axis)
612{
613        return (Real)dJointGetHinge2Param(_joint,((int)parameter) + dParamGroup * (axis - 1));
614}
615
616SuspensionJoint::~SuspensionJoint()
617{
618}
619
620AngularMotorJoint::AngularMotorJoint(World *world, const JointGroup* group) : Joint(world, group)
621{
622        _joint = dJointCreateAMotor(getWorldID(),getJointGroupID(group)); 
623        registerJoint();
624}
625
626void AngularMotorJoint::setMode(AngularMotorJoint::Mode mode)
627{
628        dJointSetAMotorMode(_joint,(int)mode); 
629}
630
631AngularMotorJoint::Mode AngularMotorJoint::getMode()
632{
633        return (AngularMotorJoint::Mode)dJointGetAMotorMode(_joint); 
634}
635
636void AngularMotorJoint::addTorque(Real torque,Real torque2,Real torque3)
637{
638        dJointAddAMotorTorques(_joint,(dReal)torque,(dReal)torque2,(dReal)torque3);
639}
640
641void AngularMotorJoint::setAxisCount(int axes)
642{
643        assert((axes >= 0) && (axes <= 3));
644        dJointSetAMotorNumAxes(_joint,axes); 
645}
646
647int AngularMotorJoint::getAxisCount()
648{
649        return dJointGetAMotorNumAxes(_joint); 
650}
651
652void AngularMotorJoint::setAxis(int axis_number,AngularMotorJoint::RelativeOrientation orientation,const Ogre::Vector3& axis)
653{
654        dJointSetAMotorAxis(_joint,axis_number,(int)orientation,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z); 
655}
656
657const Ogre::Vector3& AngularMotorJoint::getAxis(int axis_number)
658{
659        dVector3 result;
660        dJointGetAMotorAxis(_joint,axis_number,result); 
661        _axis.x = (Real)result[0];
662        _axis.y = (Real)result[1];
663        _axis.z = (Real)result[2];
664        return _axis;
665}
666
667AngularMotorJoint::RelativeOrientation AngularMotorJoint::getAxisRelativeOrientation(int axis_number)
668{
669        return (AngularMotorJoint::RelativeOrientation)dJointGetAMotorAxisRel(_joint,axis_number); 
670}
671
672void AngularMotorJoint::setAngle(int axis,Real angle)
673{
674        dJointSetAMotorAngle(_joint,axis,(dReal)angle); 
675}
676
677Real AngularMotorJoint::getAngle(int axis)
678{
679        return (Real)dJointGetAMotorAngle(_joint,axis); 
680}
681
682Real AngularMotorJoint::getAngleRate(int axis)
683{
684        return (Real)dJointGetAMotorAngleRate(_joint,axis); 
685}
686
687void AngularMotorJoint::setParameter(Joint::Parameter parameter,Real value,int axis)
688{
689        dJointSetAMotorParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value); 
690}
691
692Real AngularMotorJoint::getParameter(Joint::Parameter parameter,int axis)
693{
694        return (Real)dJointGetAMotorParam(_joint,((int)parameter) + dParamGroup * (axis - 1));
695}
696
697AngularMotorJoint::~AngularMotorJoint()
698{
699}
700
701PlanarJoint::PlanarJoint(World *world, const JointGroup* group) : Joint(world, group)
702{
703        _joint = dJointCreatePlane2D(getWorldID(),getJointGroupID(group)); 
704        registerJoint();
705}
706
707void PlanarJoint::setParameterX(Joint::Parameter parameter,Real value,int axis)
708{
709        dJointSetPlane2DXParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value);
710}
711
712void PlanarJoint::setParameterY(Joint::Parameter parameter,Real value,int axis)
713{
714        dJointSetPlane2DYParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value);
715}
716
717void PlanarJoint::setParameterAngle(Joint::Parameter parameter,Real value,int axis)
718{
719        dJointSetPlane2DAngleParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value);
720}
721
722PlanarJoint::~PlanarJoint()
723{
724}
725
726
727
728SliderHingeJoint::SliderHingeJoint(World *world, const JointGroup* group) : Joint(world, group)
729{
730        _joint = dJointCreatePR(getWorldID(),getJointGroupID(group)); 
731        registerJoint();
732}
733
734SliderHingeJoint::~SliderHingeJoint()
735{
736}
737
738void SliderHingeJoint::setAnchor(const Ogre::Vector3& position)
739{
740        dJointSetPRAnchor(_joint,(dReal)position.x,(dReal)position.y,(dReal)position.z); 
741}
742
743const Ogre::Vector3& SliderHingeJoint::getAnchor()
744{
745        dVector3 result;
746        dJointGetPRAnchor(_joint,result); 
747        _anchor.x = (Real)result[0];
748        _anchor.y = (Real)result[1];
749        _anchor.z = (Real)result[2];
750        return _anchor;
751}
752
753
754Real SliderHingeJoint::getPosition()
755{
756        return (Real)dJointGetPRPosition(_joint); 
757}
758
759Real SliderHingeJoint::getPositionRate()
760{
761        return (Real)dJointGetPRPositionRate(_joint); 
762}
763
764void SliderHingeJoint::setAxis(const Ogre::Vector3& axis)
765{
766        dJointSetPRAxis1(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z);
767}
768
769const Ogre::Vector3& SliderHingeJoint::getAxis()
770{
771        dVector3 result;
772        dJointGetPRAxis1(_joint,result); 
773        _axis.x = (Real)result[0];
774        _axis.y = (Real)result[1];
775        _axis.z = (Real)result[2];
776        return _axis;
777}
778
779void SliderHingeJoint::setAdditionalAxis(const Ogre::Vector3& axis)
780{
781        dJointSetPRAxis2(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z);
782}
783
784const Ogre::Vector3& SliderHingeJoint::getAdditionalAxis()
785{
786        dVector3 result;
787        dJointGetPRAxis2(_joint,result); 
788        _additional_axis.x = (Real)result[0];
789        _additional_axis.y = (Real)result[1];
790        _additional_axis.z = (Real)result[2];
791        return _additional_axis;
792}
793
794void SliderHingeJoint::setParameter(Joint::Parameter parameter,Real value,int axis)
795{
796        dJointSetPRParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value); 
797}
798
799Real SliderHingeJoint::getParameter(Joint::Parameter parameter,int axis)
800{
801        return (Real)dJointGetPRParam(_joint,((int)parameter) + dParamGroup * (axis - 1));
802}
803
804void SliderHingeJoint::addTorque(Real torque,Real torque2,Real torque3)
805{
806        dJointAddPRTorque(_joint, (dReal)torque);
807}
808
809
810
811#if ODE_VERSION_MINOR > 9
812
813PistonJoint::PistonJoint(World *world, const JointGroup* group) : Joint(world, group)
814{
815        _joint = dJointCreatePiston(getWorldID(), getJointGroupID(group)); 
816        registerJoint();
817}
818
819void PistonJoint::setAnchor(const Ogre::Vector3& position)
820{
821        dJointSetPistonAnchor(_joint,(dReal)position.x,(dReal)position.y,(dReal)position.z); 
822}
823
824const Ogre::Vector3& PistonJoint::getAnchor()
825{
826        dVector3 result;
827        dJointGetPistonAnchor(_joint,result); 
828        _anchor.x = (Real)result[0];
829        _anchor.y = (Real)result[1];
830        _anchor.z = (Real)result[2];
831        return _anchor;
832}
833
834const Ogre::Vector3& PistonJoint::getAnchorError()
835{
836        dVector3 result1,result2;
837        dJointGetPistonAnchor(_joint,result1); 
838        dJointGetPistonAnchor2(_joint,result2); 
839        _anchor_error.x = (Real)(result1[0] - result2[0]);
840        _anchor_error.y = (Real)(result1[1] - result2[1]);
841        _anchor_error.z = (Real)(result1[2] - result2[2]);
842        return _anchor_error;
843}
844
845void PistonJoint::setAxis(const Ogre::Vector3& axis)
846{
847        dJointSetPistonAxis(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z);
848}
849
850const Ogre::Vector3& PistonJoint::getAxis()
851{
852        dVector3 result;
853        dJointGetPistonAxis(_joint,result); 
854        _axis.x = (Real)result[0];
855        _axis.y = (Real)result[1];
856        _axis.z = (Real)result[2];
857        return _axis;
858}
859
860void PistonJoint::setAxisDelta(const Ogre::Vector3& axis, const Ogre::Vector3& initalPosition)
861{
862        dJointSetPistonAxisDelta(_joint,(dReal)axis.x,(dReal)axis.y,(dReal)axis.z,
863                (dReal)initalPosition.x,(dReal)initalPosition.y,(dReal)initalPosition.z);
864}
865
866Real PistonJoint::getPosition()
867{
868        return (Real)dJointGetPistonPosition(_joint); 
869}
870
871Real PistonJoint::getPositionRate()
872{
873        return (Real)dJointGetPistonPositionRate(_joint); 
874}
875
876Real PistonJoint::getAngle()
877{
878        return (Real)dJointGetPistonAngle(_joint); 
879}
880
881Real PistonJoint::getAngleRate()
882{
883        return (Real)dJointGetPistonAngleRate(_joint); 
884}
885
886void PistonJoint::addForce(Real force,Real force2,Real force3)
887{
888        dJointAddPistonForce(_joint,(dReal)force);
889}
890
891void PistonJoint::setParameter(Joint::Parameter parameter,Real value,int axis)
892{
893        dJointSetPistonParam(_joint,((int)parameter) + dParamGroup * (axis - 1),(dReal)value); 
894}
895
896Real PistonJoint::getParameter(Joint::Parameter parameter,int axis)
897{
898        return (Real)dJointGetPistonParam(_joint,((int)parameter) + dParamGroup * (axis - 1));
899}
900
901#endif /* ODE_VERSION_MINOR > 9 */
Note: See TracBrowser for help on using the repository browser.