90 lines
2.3 KiB
C++
90 lines
2.3 KiB
C++
|
#ifndef DGL_DGLFIXP_H_INCLUDED
|
||
|
#define DGL_DGLFIXP_H_INCLUDED
|
||
|
|
||
|
#include "dglcmn.h"
|
||
|
#include <math.h>
|
||
|
|
||
|
typedef int fixed;
|
||
|
|
||
|
#define FP_INT_SHIFT 16
|
||
|
#define FP_FLOAT_SHIFT 65536.0f
|
||
|
|
||
|
static fixed fix_sin(fixed x);
|
||
|
static fixed fix_cos(fixed x);
|
||
|
static fixed fix_tan(fixed x);
|
||
|
|
||
|
fixed fix_sqrt(fixed x);
|
||
|
|
||
|
fixed fix_mul(fixed a, fixed b);
|
||
|
#pragma aux fix_mul = \
|
||
|
"imul ebx" \
|
||
|
"shrd eax, edx, 16" \
|
||
|
parm [eax] [ebx] \
|
||
|
modify [eax ebx edx];
|
||
|
|
||
|
fixed fix_div(fixed a, fixed b);
|
||
|
#pragma aux fix_div = \
|
||
|
"cdq" \
|
||
|
"shld edx, eax, 16" \
|
||
|
"sal eax, 16" \
|
||
|
"idiv ebx" \
|
||
|
parm [eax] [ebx] \
|
||
|
modify [eax ebx edx];
|
||
|
|
||
|
#define FTOFIX(f) ((fixed)((f) * FP_FLOAT_SHIFT))
|
||
|
#define ITOFIX(i) ((fixed)((i) << FP_INT_SHIFT))
|
||
|
#define FIXTOF(x) ((float)((x) / FP_FLOAT_SHIFT))
|
||
|
#define FIXTOI(x) ((int)(((x) + 0x8000) >> FP_INT_SHIFT))
|
||
|
|
||
|
#define FP_1 ITOFIX(1)
|
||
|
#define FP_2 ITOFIX(2)
|
||
|
#define FP_3 ITOFIX(3)
|
||
|
#define FP_4 ITOFIX(4)
|
||
|
#define FP_5 ITOFIX(5)
|
||
|
#define FP_6 ITOFIX(6)
|
||
|
#define FP_7 ITOFIX(7)
|
||
|
#define FP_8 ITOFIX(8)
|
||
|
#define FP_9 ITOFIX(9)
|
||
|
#define FP_10 ITOFIX(10)
|
||
|
|
||
|
#define FP_16 ITOFIX(16)
|
||
|
#define FP_32 ITOFIX(32)
|
||
|
#define FP_64 ITOFIX(64)
|
||
|
#define FP_128 ITOFIX(128)
|
||
|
#define FP_256 ITOFIX(256)
|
||
|
|
||
|
#define FP_0_1 FTOFIX(0.1f)
|
||
|
#define FP_0_2 FTOFIX(0.2f)
|
||
|
#define FP_0_3 FTOFIX(0.3f)
|
||
|
#define FP_0_4 FTOFIX(0.4f)
|
||
|
#define FP_0_5 FTOFIX(0.5f)
|
||
|
#define FP_0_6 FTOFIX(0.6f)
|
||
|
#define FP_0_7 FTOFIX(0.7f)
|
||
|
#define FP_0_8 FTOFIX(0.8f)
|
||
|
#define FP_0_9 FTOFIX(0.9f)
|
||
|
|
||
|
#define FP_0_25 FTOFIX(0.25f)
|
||
|
#define FP_0_75 FTOFIX(0.75f)
|
||
|
|
||
|
#define FP_1_OVER_3 FTOFIX(1.0f / 3.0f)
|
||
|
#define FP_2_OVER_3 FTOFIX(2.0f / 3.0f)
|
||
|
|
||
|
#define FP_PI FTOFIX(3.1415927f)
|
||
|
|
||
|
// ---------------------------------------------------------------------------
|
||
|
|
||
|
static fixed fix_sin(fixed x) {
|
||
|
return FTOFIX(sin(FIXTOF(x)));
|
||
|
}
|
||
|
|
||
|
static fixed fix_cos(fixed x) {
|
||
|
return FTOFIX(cos(FIXTOF(x)));
|
||
|
}
|
||
|
|
||
|
static fixed fix_tan(fixed x) {
|
||
|
return FTOFIX(tan(FIXTOF(x)));
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|