00001 #ifndef __UNITS_H__
00002 #define __UNITS_H__
00003
00005
00006
00007
00009
00010
00011 #if defined(_PSX) || defined(_RCONV)
00012
00013
00014 #define SCALE(x, scale) (((scale) < 0)? (x) >> -(scale): (x) << (scale))
00015
00016 #define PSX_LENGTH_SHIFT (-4)
00017 #define PSX_TIME_SHIFT (7)
00018 #define PSX_MASS_SHIFT (0)
00019
00020 #define SMALL_SHIFT 4
00021
00022 #define TO_LENGTH(x) SCALE((x), PSX_LENGTH_SHIFT)
00023 #define TO_TIME(x) SCALE((x), PSX_TIME_SHIFT)
00024 #define TO_MASS(x) SCALE((x), PSX_MASS_SHIFT)
00025
00026 #define TO_FREQ(x) SCALE((x), -PSX_TIME_SHIFT)
00027 #define TO_VEL(x) SCALE((x), PSX_LENGTH_SHIFT - PSX_TIME_SHIFT)
00028 #define TO_ACC(x) SCALE((x), PSX_LENGTH_SHIFT - PSX_TIME_SHIFT - PSX_TIME_SHIFT)
00029 #define TO_FORCE(x) SCALE((x), PSX_MASS_SHIFT + PSX_LENGTH_SHIFT - PSX_TIME_SHIFT - PSX_TIME_SHIFT)
00030 #define TO_TORQUE(x) SCALE((x), PSX_MASS_SHIFT + PSX_LENGTH_SHIFT + PSX_LENGTH_SHIFT - PSX_TIME_SHIFT - PSX_TIME_SHIFT)
00031 #define TO_IMP(x) SCALE((x), PSX_MASS_SHIFT + PSX_LENGTH_SHIFT - PSX_TIME_SHIFT)
00032 #define TO_INERTIA(x) SCALE((x), PSX_MASS_SHIFT + PSX_LENGTH_SHIFT + PSX_LENGTH_SHIFT)
00033 #define TO_ANGVEL(x) SCALE((x), -PSX_TIME_SHIFT)
00034 #define TO_ANGACC(x) SCALE((x), -PSX_TIME_SHIFT - PSX_TIME_SHIFT)
00035 #define TO_GRIP(x) SCALE((x), -PSX_LENGTH_SHIFT + PSX_TIME_SHIFT)
00036 #define TO_STIFFNESS(x) SCALE((x), PSX_MASS_SHIFT - PSX_TIME_SHIFT - PSX_TIME_SHIFT)
00037 #define TO_DAMPING(x) SCALE((x), PSX_MASS_SHIFT - PSX_TIME_SHIFT)
00038 #define TO_AXLEFRICTION(x) SCALE((x), PSX_MASS_SHIFT + PSX_LENGTH_SHIFT)
00039
00040 #define FROM_LENGTH(x) SCALE((x), -PSX_LENGTH_SHIFT)
00041 #define FROM_TIME(x) SCALE((x), -PSX_TIME_SHIFT)
00042 #define FROM_MASS(x) SCALE((x), -PSX_MASS_SHIFT)
00043
00044 #define FROM_FREQ(x) SCALE((x), PSX_TIME_SHIFT)
00045 #define FROM_VEL(x) SCALE((x), -PSX_LENGTH_SHIFT + PSX_TIME_SHIFT)
00046 #define FROM_ACC(x) SCALE((x), -PSX_LENGTH_SHIFT + PSX_TIME_SHIFT + PSX_TIME_SHIFT)
00047 #define FROM_FORCE(x) SCALE((x), -PSX_MASS_SHIFT + PSX_LENGTH_SHIFT + PSX_TIME_SHIFT + PSX_TIME_SHIFT)
00048 #define FROM_TORQUE(x) SCALE((x), -PSX_MASS_SHIFT - PSX_LENGTH_SHIFT - PSX_LENGTH_SHIFT + PSX_TIME_SHIFT + PSX_TIME_SHIFT)
00049 #define FROM_IMP(x) SCALE((x), -PSX_MASS_SHIFT - PSX_LENGTH_SHIFT + PSX_TIME_SHIFT)
00050 #define FROM_INERTIA(x) SCALE((x), -PSX_MASS_SHIFT - PSX_LENGTH_SHIFT - PSX_LENGTH_SHIFT)
00051 #define FROM_ANGVEL(x) SCALE((x), PSX_TIME_SHIFT)
00052 #define FROM_ANGACC(x) SCALE((x), PSX_TIME_SHIFT + PSX_TIME_SHIFT)
00053 #define FROM_GRIP(x) SCALE((x), PSX_LENGTH_SHIFT - PSX_TIME_SHIFT)
00054 #define FROM_STIFFNESS(x) SCALE((x), -PSX_MASS_SHIFT + PSX_TIME_SHIFT + PSX_TIME_SHIFT)
00055 #define FROM_DAMPING(x) SCALE((x), -PSX_MASS_SHIFT + PSX_TIME_SHIFT)
00056
00057 #define PSX_LENGTH(x) SCALE((x), -PSX_LENGTH_SHIFT - 16)
00058 #define PSX_MAT(x) SCALE((x), -4)
00059
00060 #define OGU2MPH_SPEED (Real(0.01118))
00061 #define OGU2FPM_SPEED (Real(0.1016))
00062 #define OGU2KPH_SPEED (Real(0.018))
00063
00064 #else // _PSX
00065
00066 #define OGU2MPH_SPEED (Real(0.01118))
00067 #define MPH2OGU_SPEED (ONE / OGU2MPH_SPEED)
00068 #define OGU2FPM_SPEED (Real(0.1016))
00069 #define FPI2OGU_SPEED (ONE / OGU2FPM_SPEED)
00070 #define OGU2KPH_SPEED (Real(0.018))
00071 #define KPH2OGU_SPEED (ONE / OGU2KPH_SPEED)
00072
00073
00074 #define TO_LENGTH(x) (x)
00075 #define TO_TIME(x) (x)
00076 #define TO_MASS(x) (x)
00077
00078 #define TO_FREQ(x) (x)
00079 #define TO_VEL(x) (x)
00080 #define TO_ACC(x) (x)
00081 #define TO_FORCE(x) (x)
00082 #define TO_TORQUE(x) (x)
00083 #define TO_IMP(x) (x)
00084 #define TO_INERTIA(x) (x)
00085 #define TO_ANGVEL(x) (x)
00086 #define TO_ANGACC(x) (x)
00087 #define TO_GRIP(x) (x)
00088 #define TO_STIFFNESS(x) (x)
00089 #define TO_DAMPING(x) (x)
00090
00091 #define FROM_LENGTH(x) (x)
00092 #define FROM_TIME(x) (x)
00093 #define FROM_MASS(x) (x)
00094
00095 #define FROM_FREQ(x) (x)
00096 #define FROM_VEL(x) (x)
00097 #define FROM_ACC(x) (x)
00098 #define FROM_FORCE(x) (x)
00099 #define FROM_IMP(x) (x)
00100 #define FROM_INERTIA(x) (x)
00101 #define FROM_ANGVEL(x) (x)
00102 #define FROM_ANGACC(x) (x)
00103 #define FROM_GRIP(x) (x)
00104 #define FROM_STIFFNESS(x) (x)
00105 #define FROM_DAMPING(x) (x)
00106
00107 #endif
00108
00109
00111
00112
00113
00115
00116 #ifdef _PSX
00117
00118 #define PSXMatrix(mat, matPSX) \
00119 { \
00120 (matPSX)->m[X][X] = PSX_MAT((mat)->m[XX]); \
00121 (matPSX)->m[X][Y] = PSX_MAT((mat)->m[YX]); \
00122 (matPSX)->m[X][Z] = PSX_MAT((mat)->m[ZX]); \
00123 (matPSX)->m[Y][X] = PSX_MAT((mat)->m[XY]); \
00124 (matPSX)->m[Y][Y] = PSX_MAT((mat)->m[YY]); \
00125 (matPSX)->m[Y][Z] = PSX_MAT((mat)->m[ZY]); \
00126 (matPSX)->m[Z][X] = PSX_MAT((mat)->m[XZ]); \
00127 (matPSX)->m[Z][Y] = PSX_MAT((mat)->m[YZ]); \
00128 (matPSX)->m[Z][Z] = PSX_MAT((mat)->m[ZZ]); \
00129 }
00130
00131 #define PSXVector(vec, vecPSX) \
00132 { \
00133 (vecPSX)->vx = PSX_LENGTH((vec)->v[X]); \
00134 (vecPSX)->vy = PSX_LENGTH((vec)->v[Y]); \
00135 (vecPSX)->vz = PSX_LENGTH((vec)->v[Z]); \
00136 }
00137
00138 #endif
00139
00141
00143
00144 #ifdef _PSX
00145
00146 #define PI 205887L
00147 #define RAD (PI * 2)
00148 #define FULL_CIRCLE (ONE)
00149
00150
00151 #else // _PSX
00152
00153 #define PI 3.141592654f
00154 #define RAD (PI * 2)
00155 #define FULL_CIRCLE (PI * 2)
00156
00157
00158 #endif
00159
00160
00162
00164
00165 #define FRICTION_TIME_SCALE FROM_TIME(Real(120))
00166
00167
00168
00169 #endif