00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _BASE_LINESEGPATHREP_
00026 #define _BASE_LINESEGPATHREP_
00027
00028 #include <base/PathRep>
00029 #include <base/Math>
00030
00031
00032 namespace base {
00033
00034
00035
00036 class LineSegPathRep : public PathRep
00037 {
00038 public:
00039 LineSegPathRep()
00040 : flags(ConstPos | ConstOrient) {}
00041 LineSegPathRep(const Point3& sp, const Orient& so, const Point3& ep, const Orient& eo)
00042 : sp(sp), so(so), ep(ep), eo(eo), flags(None)
00043 {
00044 if (sp == ep) flags |= ConstPos;
00045 if (so == eo) flags |= ConstOrient;
00046 }
00047
00048 virtual Object& clone() const
00049 { return *NewObj LineSegPathRep(sp, so, ep, eo); }
00050
00051 virtual String className() const { return String("LineSegPathRep"); }
00052
00053
00054 virtual Point3 position(Real s) const
00055 {
00056 if (flags & ConstPos)
00057 return sp;
00058 else {
00059 Math::bound(s,0.0,1.0);
00060 return sp+(s*(ep-sp));
00061 }
00062 }
00063
00064
00065 virtual Orient orientation(Real s) const
00066 {
00067 if (flags & ConstOrient)
00068 return so;
00069 else
00070 return Orient::interpolate(so, eo, s);
00071 }
00072
00073
00074
00075 virtual void translate(const Vector3& t)
00076 { sp += t; ep += t; }
00077
00078
00079 virtual void rotate(const Quat4& r)
00080 {
00081 r.rotatePoint(sp);
00082 r.rotatePoint(ep);
00083 Quat4 sq(so.getQuat4());
00084 Quat4 eq(eo.getQuat4());
00085 so = r*sq;
00086 eo = r*eq;
00087 }
00088
00089
00090
00091 virtual void transform(const Matrix4& m)
00092 {
00093 Point4 sp4(sp);
00094 sp4 = m*sp4;
00095 sp = Point3(sp4.x,sp4.y,sp4.z);
00096
00097 Point4 ep4(ep);
00098 ep4 = m*ep4;
00099 ep = Point3(ep4.x,ep4.y,ep4.z);
00100
00101 Quat4 r;
00102 r.setRotation(m);
00103 Quat4 sq(so.getQuat4());
00104 Quat4 eq(eo.getQuat4());
00105 so = r*sq;
00106 eo = r*eq;
00107 }
00108
00109
00110 virtual void scalePosition(Real s)
00111 {
00112 sp *= s;
00113 ep *= s;
00114 }
00115
00116
00117 virtual void serialize(Serializer& s)
00118 {
00119 s(flags,"flags");
00120 s(sp,"startPoint");
00121 s(so,"startOrient");
00122 s(ep,"endPoint");
00123 s(eo,"endOrient");
00124 }
00125
00126 protected:
00127 Point3 sp;
00128 Orient so;
00129 Point3 ep;
00130 Orient eo;
00131
00132 enum Flags { None=0, ConstPos=1, ConstOrient=2 };
00133 Int flags;
00134 };
00135
00136
00137 }
00138
00139 #endif