00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef __SIM_DerScalar_h__
00017 #define __SIM_DerScalar_h__
00018
00019 #include "SIM_API.h"
00020 #include <UT/UT_Vector3.h>
00021
00022 class SIM_DerVector3;
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 class SIM_API SIM_DerScalar
00038 {
00039 public:
00040 SIM_DerScalar() { }
00041
00042 explicit SIM_DerScalar(fpreal v) : myV(v), myD(0.f, 0.f, 0.f)
00043 { }
00044
00045
00046 SIM_DerScalar(fpreal v, const UT_Vector3 &D)
00047 : myV(v), myD(D)
00048 { }
00049
00050
00051
00052
00053
00054 fpreal v() const
00055 { return myV; }
00056
00057 const UT_Vector3&D() const
00058 { return myD; }
00059
00060
00061
00062 SIM_DerScalar &operator=(fpreal rhs)
00063 { return operator=(SIM_DerScalar(rhs)); }
00064
00065 SIM_DerScalar operator-() const
00066 {
00067
00068 return SIM_DerScalar(-v(), -D());
00069 }
00070 SIM_DerScalar operator+(const SIM_DerScalar &rhs) const
00071 {
00072
00073 return SIM_DerScalar(v() + rhs.v(), D() + rhs.D());
00074 }
00075 SIM_DerScalar operator+(fpreal rhs) const
00076 {
00077 return SIM_DerScalar(v() + rhs, D());
00078 }
00079 SIM_DerScalar operator-(const SIM_DerScalar &rhs) const
00080 {
00081
00082 return SIM_DerScalar(v() - rhs.v(), D() - rhs.D());
00083 }
00084 SIM_DerScalar operator-(fpreal rhs) const
00085 {
00086 return SIM_DerScalar(v() - rhs, D());
00087 }
00088 SIM_DerScalar operator*(const SIM_DerScalar &rhs) const
00089 {
00090
00091 return SIM_DerScalar(v() * rhs.v(),
00092 v() * rhs.D() + rhs.v() * D());
00093 }
00094 SIM_DerScalar operator*(fpreal rhs) const
00095 {
00096
00097 return SIM_DerScalar(v() * rhs, rhs * D());
00098 }
00099 SIM_DerScalar sqr() const
00100 {
00101 return SIM_DerScalar(v() * v(), (2 * v()) * D());
00102 }
00103 SIM_DerScalar operator/(const SIM_DerScalar &rhs) const
00104 { return operator*(rhs.inverse()); }
00105 SIM_DerScalar operator/(fpreal rhs) const
00106 { return operator*(1/rhs); }
00107 SIM_DerScalar operator+=(const SIM_DerScalar &rhs)
00108 { return operator=(*this + rhs); }
00109 SIM_DerScalar operator+=(fpreal rhs)
00110 { return operator=(*this + rhs); }
00111 SIM_DerScalar operator-=(const SIM_DerScalar &rhs)
00112 { return operator=(*this - rhs); }
00113 SIM_DerScalar operator-=(fpreal rhs)
00114 { return operator=(*this - rhs); }
00115 SIM_DerScalar operator*=(const SIM_DerScalar &rhs)
00116 { return operator=(*this * rhs); }
00117 SIM_DerScalar operator*=(fpreal rhs)
00118 { return operator=(*this * rhs); }
00119 SIM_DerScalar operator/=(const SIM_DerScalar &rhs)
00120 { return operator=(*this / rhs); }
00121 SIM_DerScalar operator/=(fpreal rhs)
00122 { return operator=(*this * (1/rhs)); }
00123 SIM_DerScalar inverse() const
00124 {
00125
00126 UT_ASSERT_P(v() == v());
00127 UT_ASSERT_P(D() == D());
00128 return SIM_DerScalar(1/v(), D() / (-v() * v()));
00129 }
00130
00131
00132
00133
00134
00135 SIM_DerScalar sqrt() const
00136 {
00137 const fpreal tol = 1e-5;
00138
00139 UT_ASSERT_P(v() == v());
00140 UT_ASSERT_P(D() == D());
00141
00142 UT_ASSERT_P(v() > -tol);
00143 fpreal newVal = SYSsqrt(SYSmax(0.f, v()));
00144 if( newVal < tol )
00145 {
00146 return SIM_DerScalar(newVal);
00147 }
00148 else
00149 {
00150 return SIM_DerScalar(newVal, D() / (2*newVal));
00151 }
00152 }
00153
00154 private:
00155 fpreal myV;
00156 UT_Vector3 myD;
00157 };
00158
00159 inline SIM_DerScalar operator+(fpreal lhs, const SIM_DerScalar &rhs);
00160 inline SIM_DerScalar operator-(fpreal lhs, const SIM_DerScalar &rhs);
00161 inline SIM_DerScalar operator*(fpreal lhs, const SIM_DerScalar &rhs);
00162 inline SIM_DerScalar operator/(fpreal lhs, const SIM_DerScalar &rhs);
00163
00164 inline SIM_DerScalar
00165 operator+(fpreal lhs, const SIM_DerScalar &rhs)
00166 {
00167 return rhs + lhs;
00168 }
00169
00170 inline SIM_DerScalar
00171 operator-(fpreal lhs, const SIM_DerScalar &rhs)
00172 {
00173 return SIM_DerScalar(lhs - rhs.v(), -rhs.D());
00174 }
00175
00176 inline SIM_DerScalar
00177 operator*(fpreal lhs, const SIM_DerScalar &rhs)
00178 {
00179 return rhs * lhs;
00180 }
00181
00182 inline SIM_DerScalar
00183 operator/(fpreal lhs, const SIM_DerScalar &rhs)
00184 {
00185 return lhs * rhs.inverse();
00186 }
00187 #endif