math engine
DESCRIPTION
Math Engine. CIS 488/588 Bruce R. Maxim UM-Dearborn. Overview. T3DLIB1.CPP/ T3DLIB1. H globals T3DLIB2.CPP/ T3DLIB2. H I/O, joystick, music, keyboard T3DLIB3.CPP/ T3DLIB3. H sound, music T3DLIB4.CPP/ T3DLIB4. H math engine (depends on T3DLIB1) External Libraries - PowerPoint PPT PresentationTRANSCRIPT
04/19/23 1
Math Engine
CIS 488/588
Bruce R. Maxim
UM-Dearborn
04/19/23 2
Overview
• T3DLIB1.CPP/ T3DLIB1. H– globals
• T3DLIB2.CPP/ T3DLIB2. H– I/O, joystick, music, keyboard
• T3DLIB3.CPP/ T3DLIB3. H– sound, music
• T3DLIB4.CPP/ T3DLIB4. H– math engine (depends on T3DLIB1)
• External Libraries– DDRAW.LIB, DSOUND.LIB, DINPUT.LIB, DINPUT8.LIB
04/19/23 3
Conventions Used
• When functions are updated without changing the interface number added to name (e.g. Multiply2( ) )
• Class/structure name will be used as part of the descriptive function name
• Class/structure names and defines will be all uppercase
• There is no exception handling in the library functions (its up to you to add it)
04/19/23 4
From LaMothe
04/19/23 5
Some Types and Constants// defines for small numbers#define EPSILON_E3 (float)(1E-3) #define EPSILON_E4 (float)(1E-4) #define EPSILON_E5 (float)(1E-5)#define EPSILON_E6 (float)(1E-6)// defines for parametric line intersections#define PARM_LINE_NO_INTERSECT 0#define PARM_LINE_INTERSECT_IN_SEGMENT 1#define PARM_LINE_INTERSECT_OUT_SEGMENT 2#define PARM_LINE_INTERSECT_EVERYWHERE 3// fixed point typestypedef int FIXP16;typedef int *FIXP16_PTR;
04/19/23 6
Data Types - 1
// 3D vector, point without the w typedef struct VECTOR3D_TYP{ union { float M[3]; // array indexed storage // explicit names struct { float x,y,z; }; // end struct }; // end union} VECTOR3D, POINT3D, *VECTOR3D_PTR, *POINT3D_PTR;
04/19/23 7
Data Types - 2
// 4D homogenous vector, point with wtypedef struct VECTOR4D_TYP{ union { float M[4]; // array indexed storage // explicit names struct { float x,y,z,w; }; // end struct }; // end union} VECTOR4D, POINT4D, *VECTOR4D_PTR, *POINT4D_PTR;
04/19/23 8
Data Types - 3
// 3D parametric line
typedef struct PARMLINE3D_TYP
{
POINT3D p0; // start point
POINT3D p1; // end point
VECTOR3D v; // direction vector of line segment
// |v|=|p0->p1|
} PARMLINE3D, *PARMLINE3D_PTR;
04/19/23 9
Data Types - 4
// 3D plane
typedef struct PLANE3D_TYP
{
POINT3D p0; // point on the plane
VECTOR3D n; // normal to the plane
// (not necessarily a unit vector)
} PLANE3D, *PLANE3D_PTR;
04/19/23 10
Data Types - 5
// 2x2 matrix (also need 1x2,1x3,3x2,3x3,1x4,4x4,4x3)typedef struct MATRIX2X2_TYP{ union { float M[2][2]; // array indexed data storage struct // explicit names – row major storage { float M00, M01; float M10, M11; }; // end explicit names }; // end union} MATRIX2X2, *MATRIX2X2_PTR;
04/19/23 11
Data Types - 6typedef struct QUAT_TYP // 4d quaternion{ union { // array indexed storage w,x,y,z order float M[4]; // vector part, real part format struct { float q0; // the real part VECTOR3D qv; // the imaginary part xi+yj+zk }; struct { float w,x,y,z;}; }; // end union} QUAT, *QUAT_PTR;
04/19/23 12
Quaternion Access
QUAT q = {1, 1, 2, 3};
q.w = 5; // access with explicit name
q.q0 = 5; // access with real/float vector name
q.M[0] = 5; // access with array name
04/19/23 13
Data Types - 6
// 3D cylindrical coordinates
typedef struct CYLINDRICAL3D_TYP
{
float r; // radi of the point
float theta; // angle in degrees about z axis
float z; // the z-height of the point
} CYLINDRICAL3D, *CYLINDRICAL3D_PTR;
04/19/23 14
Data Types - 7
// 3D spherical coordinates
typedef struct SPHERICAL3D_TYP
{
float p; // rho, distance to point from origin
float theta; // angle from z-axis and line
// segment o->p
float phi; // angle from projection of o->p
// onto x-y plane and x-axis
} SPHERICAL3D, *SPHERICAL3D_PTR;
04/19/23 15
Macros and In-line Functions - 1
• Pages 384-395 list several macros and in-line functions
• The reason for going in this direction is to improve performance by eliminating the overhead associated with function calls
• They improve the readability and write ability of the source code
• The actual source code must be available at compile time to any function using them
04/19/23 16
Macros and In-line Functions - 2
// convert integer and float to fixed point 16.16
#define INT_TO_FIXP16(i) ((i) << FIXP16_SHIFT)
#define FLOAT_TO_FIXP16(f)
(((float)(f) * (float)FIXP16_MAG+0.5))
// convert fixed point to float
#define FIXP16_TO_FLOAT(fp)
(((float)fp)/FIXP16_MAG)
// extract whole part and decimal part from a
// fixed point 16.16
#define FIXP16_WP(fp) ((fp) >> FIXP16_SHIFT)
#define FIXP16_DP(fp) ((fp) && FIXP16_DP_MASK)
04/19/23 17
Macros and In-line Functions - 3
// some quaternion macros
inline void QUAT_ZERO(QUAT_PTR q)
{(q)->x = (q)->y = (q)->z = (q)->w = 0.0;}
inline void QUAT_INIT(QUAT_PTR qdst, QUAT_PTR qsrc)
{(qdst)->w = (qsrc)->w; (qdst)->x = (qsrc)->x;
(qdst)->y = (qsrc)->y; (qdst)->z = (qsrc)->z; }
inline void QUAT_COPY(QUAT_PTR qdst, QUAT_PTR qsrc)
{(qdst)->x = (qsrc)->x; (qdst)->y = (qsrc)->y;
(qdst)->z = (qsrc)->z; (qdst)->w = (qsrc)->w; }
04/19/23 18
Function Prototypes
• Pages 395-468 contains the function prototypes and Math engine API listing
• There a dozens of prototypes and functions described in this section
• Obviously this where functions for initializion, operations, and type conversions are defined for each data type
04/19/23 19
Only Globals Used
// from T3DLIB1.CPP and T3DLIB1.H
// trig value look up tables populated by a
// single call to Build_Sin_Cos_Tables( )
extern float cos_look[361]; // 0 to 360 inclusive
extern float cos_look[361]; // 0 to 360 inclusive
04/19/23 20
Fast_Sin
// from T3DLIB.CPP and T3DLIB.H
// trig value look up tables populated by a
// single call to Build_Sin_Cos_Tables( )
extern float cos_look[361]; // 0 to 360 inclusive
extern float cos_look[361]; // 0 to 360 inclusive
// Fast_Sin and Fast_Cos are also defined in
// T3DLIB.CPP and T3DLIB.H using degree values
// for theta
float Fast_Sin(float theta);
float Fast_Cos(float theta);
04/19/23 21
Other Routine
• Fixed-point mathematics support comes from T3DLIB1.CPP and T3DLIB1.H and is reviewed on pages 458-464
• The equation solving routines are new and appear on pages 464-468
• FPU programming needs to be done using the in-line assembly language programming to hand-optimize code produced by VC++ (described on pages 468-488)
04/19/23 22
Using the Math Engine
• The new Game Console is TD3DCONSOLE3.CPP
• The only change from TD3DCONSOLE2.CPP is the addition of the include#include “T3DLIB4.h”
• There are lots of includes in the older version of the Game Console
04/19/23 23
Demo Program
• Use text interfaces to exercise the following processes– 2D parametric line intersection tester– 3D half-space tester– 3D parametric line intersection tester– Quaternion operations– Fixed-point number operations– 2D Linear System Solver