mirror of
https://github.com/microsoft/Microsoft-3D-Movie-Maker.git
synced 2024-11-22 18:32:31 +01:00
142 lines
4.1 KiB
C
142 lines
4.1 KiB
C
/*
|
|
* Copyright (c) 1992,1993-1995 by Argonaut Technologies Limited. All rights reserved.
|
|
*
|
|
* $Id: angles.h 1.9 1995/05/25 13:37:24 sam Exp $
|
|
* $Locker: $
|
|
*
|
|
*/
|
|
#ifndef _ANGLES_H_
|
|
#define _ANGLES_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* Angles are alway 0.16 fixed point
|
|
*/
|
|
typedef br_fixed_luf br_angle;
|
|
|
|
#define BR_ANGLE_DEG(deg) ((br_angle)((deg)*182))
|
|
#define BR_ANGLE_RAD(rad) ((br_angle)((rad)*10430))
|
|
|
|
|
|
#if BASED_FIXED
|
|
|
|
#define BrAngleToDegree(a) BR_MUL((a),BR_SCALAR(360.0))
|
|
#define BrDegreeToAngle(d) ((br_angle)BR_MULDIV((d),BR_SCALAR(1.0),BR_SCALAR(360.0)))
|
|
#define BrAngleToRadian(a) BR_MUL((a),BR_SCALAR(2.0*PI))
|
|
#define BrRadianToAngle(r) ((br_angle)(BR_MUL((r),BR_SCALAR(0.5/PI))))
|
|
#define BrDegreeToRadian(d) (BR_MULDIV((d),BR_SCALAR(PI),BR_SCALAR(180.0)))
|
|
#define BrRadianToDegree(r) (BR_MUL((r),BR_SCALAR(180.0/PI)))
|
|
|
|
#define BrAngleToScalar(a) ((br_scalar)(a))
|
|
#define BrScalarToAngle(s) ((br_angle)(s))
|
|
|
|
#define BR_SIN(a) BrFixedSin(a)
|
|
#define BR_COS(a) BrFixedCos(a)
|
|
#define BR_ASIN(a) BrFixedASin(a)
|
|
#define BR_ACOS(a) BrFixedACos(a)
|
|
#define BR_ATAN2(a,b) BrFixedATan2(a,b)
|
|
#define BR_ATAN2FAST(a,b) BrFixedATan2Fast(a,b)
|
|
|
|
#endif
|
|
|
|
#if BASED_FLOAT
|
|
|
|
#define BrAngleToDegree(a) ((a) * (180.0/32768.0))
|
|
#define BrDegreeToAngle(d) ((br_angle)((d) * (32768.0/180.0)))
|
|
#define BrAngleToRadian(a) ((a) * (PI/32768.0))
|
|
#define BrRadianToAngle(r) ((br_angle)((r)*(32768.0/PI)))
|
|
#define BrDegreeToRadian(d) ((d)*(PI/180.0))
|
|
#define BrRadianToDegree(r) ((r)*(180.0/PI))
|
|
|
|
#define BrAngleToScalar(a) ((a)*(1.0/(float)BR_ONE_LS))
|
|
#define BrScalarToAngle(s) ((br_angle)((s)*(float)BR_ONE_LS))
|
|
|
|
#define BR_SIN(a) sin(BrAngleToRadian(a))
|
|
#define BR_COS(a) cos(BrAngleToRadian(a))
|
|
#define BR_ASIN(a) BrRadianToAngle(asin(a))
|
|
#define BR_ACOS(a) BrRadianToAngle(acos(a))
|
|
#define BR_ATAN2(a,b) BrRadianToAngle(atan2((a),(b)))
|
|
#define BR_ATAN2FAST(a,b) RBradianToAngle(atan2((a),(b)))
|
|
|
|
#endif
|
|
|
|
/*
|
|
* Fields that go into br_euler.order
|
|
*/
|
|
enum {
|
|
BR_EULER_FIRST = 0x03,
|
|
BR_EULER_FIRST_X = 0x00,
|
|
BR_EULER_FIRST_Y = 0x01,
|
|
BR_EULER_FIRST_Z = 0x02,
|
|
|
|
BR_EULER_PARITY = 0x04,
|
|
BR_EULER_PARITY_EVEN = 0x00,
|
|
BR_EULER_PARITY_ODD = 0x04,
|
|
|
|
BR_EULER_REPEAT = 0x08,
|
|
BR_EULER_REPEAT_NO = 0x00,
|
|
BR_EULER_REPEAT_YES = 0x08,
|
|
|
|
BR_EULER_FRAME = 0x10,
|
|
BR_EULER_FRAME_STATIC = 0x00,
|
|
BR_EULER_FRAME_ROTATING = 0x10
|
|
};
|
|
|
|
/*
|
|
* Various possible orders
|
|
*/
|
|
#define BR_EULER_ORDER(a,p,r,f)\
|
|
(BR_EULER_FIRST_##a |\
|
|
BR_EULER_PARITY_##p |\
|
|
BR_EULER_REPEAT_##r |\
|
|
BR_EULER_FRAME_##f)
|
|
|
|
enum {
|
|
BR_EULER_XYZ_S = BR_EULER_ORDER(X,EVEN,NO ,STATIC ),
|
|
BR_EULER_XYX_S = BR_EULER_ORDER(X,EVEN,YES,STATIC ),
|
|
BR_EULER_XZY_S = BR_EULER_ORDER(X,ODD ,NO ,STATIC ),
|
|
BR_EULER_XZX_S = BR_EULER_ORDER(X,ODD ,YES,STATIC ),
|
|
BR_EULER_YZX_S = BR_EULER_ORDER(Y,EVEN,NO ,STATIC ),
|
|
BR_EULER_YZY_S = BR_EULER_ORDER(Y,EVEN,YES,STATIC ),
|
|
BR_EULER_YXZ_S = BR_EULER_ORDER(Y,ODD ,NO ,STATIC ),
|
|
BR_EULER_YXY_S = BR_EULER_ORDER(Y,ODD ,YES,STATIC ),
|
|
BR_EULER_ZXY_S = BR_EULER_ORDER(Z,EVEN,NO ,STATIC ),
|
|
BR_EULER_ZXZ_S = BR_EULER_ORDER(Z,EVEN,YES,STATIC ),
|
|
BR_EULER_ZYX_S = BR_EULER_ORDER(Z,ODD ,NO ,STATIC ),
|
|
BR_EULER_ZYZ_S = BR_EULER_ORDER(Z,ODD ,YES,STATIC ),
|
|
|
|
BR_EULER_ZYX_R = BR_EULER_ORDER(X,EVEN,NO ,ROTATING),
|
|
BR_EULER_XYX_R = BR_EULER_ORDER(X,EVEN,YES,ROTATING),
|
|
BR_EULER_YZX_R = BR_EULER_ORDER(X,ODD ,NO ,ROTATING),
|
|
BR_EULER_XZX_R = BR_EULER_ORDER(X,ODD ,YES,ROTATING),
|
|
BR_EULER_XZY_R = BR_EULER_ORDER(Y,EVEN,NO ,ROTATING),
|
|
BR_EULER_YZY_R = BR_EULER_ORDER(Y,EVEN,YES,ROTATING),
|
|
BR_EULER_ZXY_R = BR_EULER_ORDER(Y,ODD ,NO ,ROTATING),
|
|
BR_EULER_YXY_R = BR_EULER_ORDER(Y,ODD ,YES,ROTATING),
|
|
BR_EULER_YXZ_R = BR_EULER_ORDER(Z,EVEN,NO ,ROTATING),
|
|
BR_EULER_ZXZ_R = BR_EULER_ORDER(Z,EVEN,YES,ROTATING),
|
|
BR_EULER_XYZ_R = BR_EULER_ORDER(Z,ODD ,NO ,ROTATING),
|
|
BR_EULER_ZYZ_R = BR_EULER_ORDER(Z,ODD ,YES,ROTATING)
|
|
};
|
|
|
|
/*
|
|
* A triple of euler angles and a description of how they are to
|
|
* be applied - loosely based on -
|
|
* "Euler Angle Convertion" Ken Shoemake, Graphics Gems IV pp. 222
|
|
*/
|
|
typedef struct br_euler {
|
|
br_angle a;
|
|
br_angle b;
|
|
br_angle c;
|
|
br_uint_8 order;
|
|
} br_euler;
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
#endif
|
|
|