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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef __FIXEDPOINT_HEADERFILE__
00042 #define __FIXEDPOINT_HEADERFILE__
00043
00044
00045 namespace ARToolKitPlus {
00046
00047
00048 #define FIXED_Float_To_Fixed_n(x, n) ((I32)(x * (float)(1 << n) + 0.5f))
00049 #define FIXED_Fixed_n_To_Float(x, n) ((float)x / (float)(1 << n))
00050
00051
00052
00053 #ifdef _USEGPP_
00054 # include <gpp.h>
00055 # define _USE_GPP_ARITHMETIC_
00056 # define _USE_GPP_TRIGONOMETRIC_
00057 # define _USE_GPP_VECTOR_
00058 # define _FIXEDPOINT_MATH_ACTIVATED_
00059
00060
00061 # ifdef DEBUG
00062 # pragma comment( lib, "gpp_WMMX40_d.lib" )
00063 # else
00064 # pragma comment( lib, "gpp_WMMX40_r.lib" )
00065 # endif
00066 #endif
00067
00068
00069 #ifdef _USEFIXED_
00070 # if defined(_WIN32) || defined(WIN32)
00071 typedef unsigned __int64 U64;
00072 typedef __int64 I64;
00073 typedef unsigned int U32;
00074 typedef int I32;
00075 # endif
00076 # define _USE_GENERIC_ARITHMETIC_
00077 # define _USE_GENERIC_TRIGONOMETRIC_
00078 # define _USE_GENERIC_VECTOR_
00079 # define _FIXEDPOINT_MATH_ACTIVATED_
00080 #endif
00081
00082
00083 #ifdef _USE_GPP_ARITHMETIC_
00084
00085 #define FIXED_MUL2(a,b, res, bits) \
00086 gppMul_n_32s((a), (b), &res, bits);
00087
00088 #define FIXED_MUL3(a,b,c, res, bits) \
00089 gppMul_n_32s((a), (b), &_tmp1, bits); \
00090 gppMul_n_32s(_tmp1, (c), &res, bits);
00091
00092 #define FIXED_MUL4(a,b,c,d, res, bits) \
00093 gppMul_n_32s((a), (b), &_tmp1, bits); \
00094 gppMul_n_32s(_tmp1, (c), &_tmp2, bits); \
00095 gppMul_n_32s(_tmp2, (d), &res, bits);
00096
00097 #define FIXED_DIV2(a,b, res, bits) \
00098 gppDiv_n_32s((a), (b), &res, bits);
00099
00100 #endif //_USE_GPP_ARITHMETIC_
00101
00102
00103 #ifdef _USE_GPP_TRIGONOMETRIC_
00104
00105 #define FIXED_SIN(theta, sin_theta, n) \
00106 gppSinHP_n_32s((theta), sin_theta, n);
00107
00108 #define FIXED_COS(theta, cos_theta, n) \
00109 gppCosHP_n_32s((theta), cos_theta, n);
00110
00111 #define FIXED_SINCOS(theta, sin_theta, cos_theta, n) \
00112 gppSinCosHP_n_32s((theta), sin_theta, cos_theta, n);
00113
00114 #endif // _USE_GPP_TRIGONOMETRIC_
00115
00116
00117 #ifdef _USE_GPP_VECTOR_
00118
00119 typedef GPP_VEC3D FIXED_VEC3D;
00120
00121 #define FIXED_VEC3_DOT(vec1, vec2, res, n) \
00122 gppVec3DDot_n_32s((vec1), (vec2), (res), (n));
00123
00124 #define FIXED_VEC3_SUB(vec1, vec2, res) \
00125 gppVec3DSub_n_32s((vec1), (vec2), (res));
00126
00127 #define FIXED_VEC3_LENGTH_SQ(vec, res, n) \
00128 gppVec3DLengthSq_n_32s((vec), (res), (n));
00129
00130 #endif // _USE_GPP_VECTOR_
00131
00132
00133
00134 #ifdef _USE_GENERIC_ARITHMETIC_
00135
00136 # define FIXED_MUL2(a,b, res, bits) \
00137 res = ((I32) (((I64)a * (I64)b) >> bits));
00138
00139 # define FIXED_MUL3(a,b,c, res, bits) \
00140 FIXED_MUL2((a), (b), (res), bits); \
00141 FIXED_MUL2((res), (c), (res), bits);
00142
00143 # define FIXED_MUL4(a,b,c,d, res, bits) \
00144 FIXED_MUL2((a), (b), (res), bits); \
00145 FIXED_MUL2((res), (c), (res), bits); \
00146 FIXED_MUL2((res), (d), (res), bits);
00147
00148 # define FIXED_DIV2(a,b, res, bits) \
00149 res = (I32) ((((I64)a)<<bits)/(I64)b);
00150
00151 #endif //_USE_GENERIC_ARITHMETIC_
00152
00153
00154 #ifdef _USE_GENERIC_TRIGONOMETRIC_
00155
00156 void Fixed28_Init();
00157 void Fixed28_Deinit();
00158
00159 inline void Fixed28_SinCos(I32 phi, I32 &sin, I32 &cos);
00160
00161 #define FIXED_SINCOS(theta, sin_theta, cos_theta, n) \
00162 Fixed28_SinCos((theta), *(sin_theta), *(cos_theta));
00163
00164 #endif //_USE_GENERIC_TRIGONOMETRIC_
00165
00166
00167 #ifdef _USE_GENERIC_VECTOR_
00168
00169 typedef struct{
00170 I32 x, y, z;
00171 } FIXED_VEC3D;
00172
00173 inline void FIXED_VEC3_DOT(FIXED_VEC3D* vec1, FIXED_VEC3D* vec2, I32* res, I32 n)
00174 {
00175 I32 x,y,z;
00176 FIXED_MUL2(vec1->x, vec2->x, x, n);
00177 FIXED_MUL2(vec1->y, vec2->y, y, n);
00178 FIXED_MUL2(vec1->z, vec2->z, z, n);
00179
00180 *res = x+y+z;
00181 }
00182
00183 inline void FIXED_VEC3_SUB(FIXED_VEC3D* vec1, FIXED_VEC3D* vec2, FIXED_VEC3D* res)
00184 {
00185 res->x = vec1->x - vec2->x;
00186 res->y = vec1->y - vec2->y;
00187 res->z = vec1->z - vec2->z;
00188 }
00189
00190 inline void FIXED_VEC3_LENGTH_SQ(FIXED_VEC3D* vec, U32* res, I32 n)
00191 {
00192 I32 x,y,z;
00193 FIXED_MUL2(vec->x, vec->x, x, n);
00194 FIXED_MUL2(vec->y, vec->y, y, n);
00195 FIXED_MUL2(vec->z, vec->z, z, n);
00196
00197 *res = x+y+z;
00198 }
00199
00200 #endif //_USE_GENERIC_VECTOR_
00201
00202
00203 }
00204
00205
00206 #endif //__FIXEDPOINT_HEADERFILE__