00001 #ifndef __AIFixedMath__
00002 #define __AIFixedMath__
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 #ifndef __AITypes__
00031 #include "AITypes.h"
00032 #endif
00033
00034 #include "AIHeaderBegin.h"
00035
00039
00040
00041
00042
00043
00044
00045 #define kAIFixedMathSuite "AI Fixed Math Suite"
00046 #define kAIFixedMathSuiteVersion AIAPI_VERSION(4)
00047 #define kAIFixedMathVersion kAIFixedMathSuiteVersion
00048
00049
00050
00051 #define kFixedMin ((AIFixed) 0x80000000)
00052 #define kFixedMax ((AIFixed) 0x7FFFFFFF)
00053 #define kFixedUnknown ((AIFixed) 0x80000000)
00054
00055 #ifndef kFixedOne
00056 #define kFixedOne ((AIFixed) 0x00010000)
00057 #endif
00058 #ifndef kFixedZero
00059 #define kFixedZero ((AIFixed) 0x00000000)
00060 #endif
00061 #define kFixedHundredth ((AIFixed) 0x0000028F)
00062 #define kFixedSixteenth ((AIFixed) 0x00001000)
00063 #define kFixedTenth ((AIFixed) 0x00001999)
00064 #define kFixedEighth ((AIFixed) 0x00002000)
00065 #ifndef kFixedQuarter
00066 #define kFixedQuarter ((AIFixed) 0x00004000)
00067 #endif
00068 #ifndef kFixedHalf
00069 #define kFixedHalf ((AIFixed) 0x00008000)
00070 #endif
00071 #define kFixedSevenEighths ((AIFixed) 0x0000E000)
00072 #define kFixedOne1 ((AIFixed) 0x0000FFFF)
00073 #define kFixedOneThird ((AIFixed) 0x00005555)
00074 #define kFixedFourThirds ((AIFixed) 0x00015555)
00075 #define kFixedThreeHalves ((AIFixed) 0x00018000)
00076
00077 #define kFixedPi4 ((AIFixed) 0x0000C910)
00078 #define kFixedPi2 ((AIFixed) 0x00019220)
00079 #define kFixedPi ((AIFixed) 0x00032440)
00080 #define kFixedTwoPi ((AIFixed) 0x00064880)
00081 #define kFixedGolden ((AIFixed) 0x00019E37)
00082
00083
00084 #define kFractZero ((AIFract) 0x00000000)
00085 #define kFractFixedRound ((AIFract) 0x00002000)
00086 #define kFractPi180 ((AIFract) 0x011DF4A0)
00087 #define kFractQuarter ((AIFract) 0x10000000)
00088 #define kFractHalf ((AIFract) 0x20000000)
00089 #define kFractOne ((AIFract) 0x40000000)
00090 #define kFractFourThirds ((AIFract) 0x55555555)
00091 #define kFractSqrtTwo ((AIFract) 0x5A82799A)
00092 #define kFractUnknown ((AIFract) 0x80000000)
00093
00094
00095
00096
00097
00098
00099
00100
00101 #if __BUILD_PLUGIN__
00102
00103
00104 #define _FixedToFract(a) ((AIFract)(a) << 14)
00105 #define _FractRoundToFixed(a) ((AIFixed) (((a) + kFractFixedRound) >> 14))
00106 #define _FractTruncToFixed(a) ((AIFixed) ((a) >> 14))
00107
00108 #define _ShortToFixed(a) ((AIFixed)(a) << 16)
00109 #define _FixedRoundToShort(a) ((ai::int16) (((a) + kFixedHalf) >> 16))
00110 #define _FixedTruncToShort(a) ((ai::int16) ((a) >> 16))
00111
00112 #define _FloatToFixed(a) ((AIFixed)((a) * 65536.0)) // useful for constants; eg, _FloatToFixed(1.5) generates 0x00018000
00113
00114
00115
00116 #define _FixedFloor(a) ((AIFixed) ((a) & 0xFFFF0000L))
00117 #define _FixedCeiling(a) _FixedFloor((a) + kFixedOne1)
00118 #define _FixedRound(a) _FixedFloor((a) + kFixedHalf)
00119 #define _FixedFraction(a) ((a) & 0x0000FFFFL)
00120 #define _FixedAverage(a, b) (((a) + (b) + 1) >> 1)
00121 #define _FixedHalf(a) (((a) + 1) >> 1)
00122 #define _FixedOverflow(a) ((a) == kFixedMax || (a) == kFixedMin)
00123
00124 #endif
00125
00126
00127
00128
00129
00130
00131
00140 typedef struct {
00141
00142 AIAPI AIFixed (*FixedAdd) ( AIFixed a, AIFixed b );
00143 AIAPI AIFixed (*FixedMul) ( AIFixed a, AIFixed b );
00144 AIAPI AIFract (*FractMul) ( AIFract a, AIFract b );
00145 AIAPI AIFixed (*FractFixedMul) ( AIFract a, AIFixed b );
00146 AIAPI AIFixed (*FixedDiv) ( AIFixed a, AIFixed b );
00147 AIAPI AIFract (*FractDiv) ( AIFract a, AIFract b );
00148 AIAPI AIFixed (*ShortRatio) ( ai::int16 a, ai::int16 b );
00149 AIAPI AIFract (*FixedRatio) ( AIFixed a, AIFixed b );
00150 AIAPI AIFixed (*FractRatio) ( AIFract a, AIFract b );
00151 AIAPI AIFixed (*FixedMulAdd) ( AIFixed a, AIFixed b, AIFixed c, AIFixed d );
00152 AIAPI AIFixed (*FixedMultiple) (AIFixed a, AIFixed multiple, AIBoolean ceiling );
00153
00154 AIAPI AIFract (*FixedSin) ( AIFixed a );
00155 AIAPI AIFract (*FixedCos) ( AIFixed a );
00156 AIAPI AIFixed (*FixedATan) ( AIFixed a, AIFixed b );
00157 AIAPI AIFixed (*DegreeToRadian) ( AIFixed degree );
00158 AIAPI AIFixed (*RadianToDegree) ( AIFixed radian );
00159
00160 AIAPI AIUFract (*FractSqrt) ( AIUFract a );
00161 AIAPI AIFixed (*FixedLength) ( AIFixed a, AIFixed b );
00162 AIAPI AIFixed (*FixedInterpolate) ( AIFixed a, AIFixed b, AIFixed t );
00163
00164 AIAPI AIFloat (*FixedToFloat) ( AIFixed a );
00165 AIAPI AIFixed (*FloatToFixed) ( AIFloat a );
00166 AIAPI AIFloat (*FractToFloat) ( AIFract a );
00167 AIAPI AIFract (*FloatToFract) ( AIFloat a );
00168
00169 AIAPI void (*FixedPointAdd) ( AIFixedPoint *a, AIFixedPoint *b, AIFixedPoint *result );
00170 AIAPI void (*FixedPointSubtract) ( AIFixedPoint *a, AIFixedPoint *b, AIFixedPoint *result );
00171 AIAPI AIBoolean (*FixedPointEqual) ( AIFixedPoint *a, AIFixedPoint *b );
00172 AIAPI AIBoolean (*FixedPointClose) ( AIFixedPoint *a, AIFixedPoint *b, AIFixed tolerance );
00173 AIAPI AIFixed (*FixedPointAngle) ( AIFixedPoint *a, AIFixedPoint *b );
00174 AIAPI AIFixed (*FixedPointLength) ( AIFixedPoint *a, AIFixedPoint *b );
00175 AIAPI void (*FixedPointLengthAngle) ( AIFixed length, AIFixed angle, AIFixedPoint *result );
00176 AIAPI void (*FixedPointInterpolate) ( AIFixedPoint *a, AIFixedPoint *b, AIFixed t, AIFixedPoint *result );
00177
00178 AIAPI void (*FixedRectSet) ( AIFixedRect *a, AIFixed left, AIFixed top, AIFixed right, AIFixed bottom );
00179 AIAPI AIBoolean (*FixedRectEqual) ( AIFixedRect *a, AIFixedRect *b );
00180 AIAPI AIBoolean (*FixedRectEmpty) ( AIFixedRect *a );
00181 AIAPI void (*FixedRectInset) ( AIFixedRect *a, AIFixed h, AIFixed v );
00182 AIAPI void (*FixedRectOffset) ( AIFixedRect *a, AIFixed h, AIFixed v );
00183 AIAPI void (*FixedRectUnion) ( AIFixedRect *a, AIFixedRect *b, AIFixedRect *result );
00184 AIAPI void (*FixedPointUnion) ( AIFixedPoint *a, AIFixedRect *b, AIFixedRect *result );
00185 AIAPI AIBoolean (*FixedRectOverlap) ( AIFixedRect *a, AIFixedRect *b );
00186 AIAPI AIBoolean (*FixedRectIntersect) ( AIFixedRect *a, AIFixedRect *b, AIFixedRect *result );
00187 AIAPI AIBoolean (*FixedRectInFixedRect) ( AIFixedRect *a, AIFixedRect *b );
00188 AIAPI AIBoolean (*FixedPointInFixedRect) ( AIFixedPoint *a, AIFixedRect *b );
00189 AIAPI void (*FixedRectAlign) ( AIFixedRect *a, AIFixedRect *result );
00190
00191 AIAPI void (*FixedMatrixSet) ( AIFixedMatrix *m, AIFixed a, AIFixed b, AIFixed c, AIFixed d, AIFixed tx, AIFixed ty );
00192 AIAPI void (*FixedMatrixSetIdentity) ( AIFixedMatrix *m );
00193 AIAPI AIBoolean (*FixedMatrixEqual) ( AIFixedMatrix *m, AIFixedMatrix *n );
00194 AIAPI AIBoolean (*FixedMatrixIdentity) ( AIFixedMatrix *m );
00195 AIAPI AIBoolean (*FixedMatrixSingular) ( AIFixedMatrix *m );
00196 AIAPI void (*FixedMatrixSetTranslate) ( AIFixedMatrix *m, AIFixed tx, AIFixed ty );
00197 AIAPI void (*FixedMatrixSetScale) ( AIFixedMatrix *m, AIFixed h, AIFixed v );
00198 AIAPI void (*FixedMatrixSetRotate) ( AIFixedMatrix *m, AIFixed angle );
00199 AIAPI void (*FixedMatrixConcatTranslate) ( AIFixedMatrix *m, AIFixed tx, AIFixed ty );
00200 AIAPI void (*FixedMatrixConcatScale) ( AIFixedMatrix *m, AIFixed h, AIFixed v );
00201 AIAPI void (*FixedMatrixConcatRotate) ( AIFixedMatrix *m, AIFixed angle );
00202 AIAPI void (*FixedMatrixConcat) (AIFixedMatrix *m, AIFixedMatrix *n, AIFixedMatrix *result );
00203 AIAPI short (*FixedMatrixInvert) (AIFixedMatrix *m );
00204 AIAPI void (*FixedMatrixXformPoint) ( AIFixedMatrix *m, AIFixedPoint *a, AIFixedPoint *result );
00205
00206 } AIFixedMathSuite;
00207
00208
00209 #include "AIHeaderEnd.h"
00210
00211
00212 #endif