![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /****************************************************************************** 00002 ** Copyright (c) 2011 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 ******************************************************************************/ 00005 /****************************************************************************** 00006 ** $RCSfile: DtMotionModel.h,v $ $Revision: 1.16 $ $State: Exp $ 00007 ******************************************************************************/ 00008 00012 00013 #pragma once 00014 #include <vrvCore/vrvCore.h> 00015 #include <matrix/vlVector.h> 00016 #include <matrix/vlTaitBryan.h> 00017 #include <vlutil/vlTime.h> 00018 #include <vlpi/disEnums.h> 00019 00020 namespace makVrv 00021 { 00022 class DtSceneObject; 00023 class DtModel; 00024 class DtDe; 00025 00028 class DT_DLL_VRVCORE DtMotionModel 00029 { 00030 public: 00031 00032 DtMotionModel(); 00033 00034 virtual ~DtMotionModel(); 00035 00036 virtual void updateMotion(double dtTime) = 0; 00037 00039 virtual void modelAdded(DtModel*) = 0; 00040 00042 virtual void modelRemoved(DtModel*) = 0; 00043 00045 virtual void setLocation(const DtVector& loc, DtTime curTime) = 0; 00046 00049 virtual const DtVector& approxLocation(DtTime curTime) const = 0; 00050 00052 virtual void setVelocity(const DtVector& vel, DtTime curTime) = 0; 00053 00056 virtual const DtVector& approxVelocity(DtTime curTime) const = 0; 00057 00059 virtual void setOrientation(const DtTaitBryan& ori, DtTime curTime) = 0; 00060 00063 virtual const DtTaitBryan& approxEuler(DtTime curTime) const = 0; 00064 00066 virtual void setAcceleration(const DtVector& acc, DtTime curTime) = 0; 00067 virtual const DtVector& acceleration(DtTime curTime) const = 0; 00068 00070 virtual void setRotationalVelocity(const DtVector& vel, DtTime curTime) = 0; 00071 virtual const DtVector& rotationalVelocity(DtTime curTime) const = 0; 00072 00074 virtual void setSmoothPeriod(float period) = 0; 00076 virtual void setSmoothingEnabled(bool enabled) = 0; 00077 00080 virtual void setAlgorithm(DtDeadReckonTypes alg) = 0; 00081 virtual DtDeadReckonTypes algorithm() const = 0; 00082 00083 virtual DtMotionModel* clone(double time) = 0; 00084 }; 00085 00086 template <typename DeadReckoner> 00090 class DT_DLL_VRVCORE DtVRLDeadReckonerMotionModel : public DtMotionModel, 00091 protected DeadReckoner 00092 { 00093 public: 00095 DtVRLDeadReckonerMotionModel() 00096 : DtMotionModel() 00097 , DeadReckoner() 00098 { 00099 } 00101 DtVRLDeadReckonerMotionModel(const DtVRLDeadReckonerMotionModel& orig, double time) 00102 : DtMotionModel(orig) 00103 , DeadReckoner(orig) 00104 { 00105 setAlgorithm(orig.algorithm()); 00106 setSmoothingEnabled(orig.mySmoothEnable); 00107 setSmoothPeriod(orig.smoothPeriod()); 00108 } 00109 00111 DtMotionModel* clone(double time) 00112 { 00113 return new DtVRLDeadReckonerMotionModel(*this,time); 00114 } 00115 00117 virtual void updateMotion(double dtTime) 00118 { 00119 00120 } 00121 00123 virtual void modelAdded(DtModel*) 00124 { 00125 //Intentionally do nothing 00126 } 00127 00129 virtual void modelRemoved(DtModel*) 00130 { 00131 //Intentionally do nothing 00132 } 00133 00135 virtual void setLocation(const DtVector& loc, DtTime curTime) 00136 { 00137 DeadReckoner::setLocation(loc,curTime); 00138 } 00139 00142 virtual const DtVector& approxLocation(DtTime curTime) const 00143 { 00144 return DeadReckoner::approxLocation(curTime); 00145 } 00146 00148 virtual void setVelocity(const DtVector& vel, DtTime curTime) 00149 { 00150 return DeadReckoner::setVelocity(vel,curTime); 00151 } 00152 00155 virtual const DtVector& approxVelocity(DtTime curTime) const 00156 { 00157 return DeadReckoner::approxVelocity(curTime); 00158 } 00159 00161 virtual void setOrientation(const DtTaitBryan& ori, DtTime curTime) 00162 { 00163 DeadReckoner::setOrientation(ori,curTime); 00164 } 00165 00166 virtual void setSmoothPeriod(float period) 00167 { 00168 DeadReckoner::setSmoothPeriod(period); 00169 } 00170 00171 virtual void setSmoothingEnabled(bool enabled) 00172 { 00173 DeadReckoner::setSmoothEnable(enabled); 00174 } 00175 00178 virtual const DtTaitBryan& approxEuler(DtTime curTime) const 00179 { 00180 return DeadReckoner::approxEuler(curTime); 00181 } 00182 00184 virtual void setAcceleration(const DtVector& acc, DtTime curTime) 00185 { 00186 DeadReckoner::setAcceleration(acc,curTime); 00187 } 00188 00189 virtual const DtVector& acceleration(DtTime curTime) const 00190 { 00191 return DeadReckoner::acceleration(curTime); 00192 } 00193 00195 virtual void setRotationalVelocity(const DtVector& vel, DtTime curTime) 00196 { 00197 DeadReckoner::setRotationalVelocity(vel,curTime); 00198 } 00199 00200 virtual const DtVector& rotationalVelocity(DtTime curTime) const 00201 { 00202 return DeadReckoner::rotationalVelocity(curTime); 00203 } 00204 00207 virtual void setAlgorithm(DtDeadReckonTypes alg) 00208 { 00209 DeadReckoner::setAlgorithm(alg); 00210 } 00211 00212 virtual DtDeadReckonTypes algorithm() const 00213 { 00214 return DeadReckoner::algorithm(); 00215 } 00216 00217 }; 00218 00221 class DT_DLL_VRVCORE DtMotionModelCreator 00222 { 00223 public: 00224 virtual ~DtMotionModelCreator(); 00225 virtual DtMotionModel* create(DtSceneObject* owner, DtDe& de) = 0; 00226 }; 00227 00231 class DT_DLL_VRVCORE DtDefaultMotionModelCreator : public DtMotionModelCreator 00232 { 00233 public: 00234 DtMotionModel* create(DtSceneObject* owner, DtDe& de); 00235 }; 00236 00237 }