topical media & game development

talk show tell print

lib-of-vs-libs-QTDevWin-CIncludes-QD3DMath.h / h



  /*
       File:       QD3DMath.h
   
       Contains:   Math & matrix routines and definitions.
   
       Version:    Technology: Quickdraw 3D 1.6
                   Release:    QuickTime 6.0.2
   
       Copyright:  (c) 1995-2001 by Apple Computer, Inc., all rights reserved.
   
       Bugs?:      For bug reports, consult the following page on
                   the World Wide Web:
   
                       http://developer.apple.com/bugreporter/
   
  */
  ifndef __QD3DMATH__
  define __QD3DMATH__
  
  ifndef __QD3D__
  include <QD3D.h>
  endif
  
  include <float.h>
  
  if PRAGMA_ONCE
  #pragma once
  endif
  
  ifdef __cplusplus
  extern "C" {
  endif
  
  if PRAGMA_IMPORT
  #pragma import on
  endif
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=power
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(push, 2)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack(2)
  endif
  
  if PRAGMA_ENUM_ALWAYSINT
      #if defined(__fourbyteints__) && !__fourbyteints__ 
          #define __QD3DMATH__RESTORE_TWOBYTEINTS
          #pragma fourbyteints on
      #endif
      #pragma enumsalwaysint on
  #elif PRAGMA_ENUM_OPTIONS
      #pragma option enum=int
  #elif PRAGMA_ENUM_PACK
      #if __option(pack_enums)
          #define __QD3DMATH__RESTORE_PACKED_ENUMS
          #pragma options(!pack_enums)
      #endif
  endif
  
  
**************************************************************************** * ** * Constant Definitions ** * ** ***************************************************************************

  
  /*
   *  Real zero definition
   */
  
  ifdef FLT_EPSILON
      #define kQ3RealZero         (FLT_EPSILON)
  else
      #define kQ3RealZero         ((float)1.19209290e-07)
  endif
  
  ifdef FLT_MAX
   #define kQ3MaxFloat         (FLT_MAX)
  else
      #define kQ3MaxFloat         ((float)3.40282347e+38)
  endif
  
  /*
   *  Values of PI
   */
  define kQ3Pi                   ((float)3.1415926535898)
  define kQ32Pi                  ((float)(2.0 * 3.1415926535898))
  define kQ3PiOver2              ((float)(3.1415926535898 / 2.0))
  define kQ33PiOver2             ((float)(3.0 * 3.1415926535898 / 2.0))
  
  
**************************************************************************** * ** * Miscellaneous Functions ** * ** ***************************************************************************

  
  define Q3Math_DegreesToRadians(x)  ((float)((x) *  kQ3Pi / 180.0f))
  define Q3Math_RadiansToDegrees(x)  ((float)((x) * 180.0f / kQ3Pi))
  define Q3Math_Min(x,y)             ((x) <= (y) ? (x) : (y))
  define Q3Math_Max(x,y)             ((x) >= (y) ? (x) : (y))
  
  
**************************************************************************** * ** * Point and Vector Creation ** * ** ***************************************************************************

  
  if CALL_NOT_IN_CARBON
  EXTERN_API_C( TQ3Point2D *)
  Q3Point2D_Set                   (TQ3Point2D *           point2D,
                                   float                  x,
                                   float                  y);
  
  EXTERN_API_C( TQ3Param2D *)
  Q3Param2D_Set                   (TQ3Param2D *           param2D,
                                   float                  u,
                                   float                  v);
  
  EXTERN_API_C( TQ3Point3D *)
  Q3Point3D_Set                   (TQ3Point3D *           point3D,
                                   float                  x,
                                   float                  y,
                                   float                  z);
  
  EXTERN_API_C( TQ3RationalPoint3D *)
  Q3RationalPoint3D_Set           (TQ3RationalPoint3D *   point3D,
                                   float                  x,
                                   float                  y,
                                   float                  w);
  
  EXTERN_API_C( TQ3RationalPoint4D *)
  Q3RationalPoint4D_Set           (TQ3RationalPoint4D *   point4D,
                                   float                  x,
                                   float                  y,
                                   float                  z,
                                   float                  w);
  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Vector2D_Set                  (TQ3Vector2D *          vector2D,
                                   float                  x,
                                   float                  y);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector3D_Set                  (TQ3Vector3D *          vector3D,
                                   float                  x,
                                   float                  y,
                                   float                  z);
  
  EXTERN_API_C( TQ3PolarPoint *)
  Q3PolarPoint_Set                (TQ3PolarPoint *        polarPoint,
                                   float                  r,
                                   float                  theta);
  
  EXTERN_API_C( TQ3SphericalPoint *)
  Q3SphericalPoint_Set            (TQ3SphericalPoint *    sphericalPoint,
                                   float                  rho,
                                   float                  theta,
                                   float                  phi);
  
  
**************************************************************************** * ** * Point and Vector Dimension Conversion ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Point3D *)
  Q3Point2D_To3D                  (const TQ3Point2D *     point2D,
                                   TQ3Point3D *           result);
  
  EXTERN_API_C( TQ3Point2D *)
  Q3RationalPoint3D_To2D          (const TQ3RationalPoint3D * point3D,
                                   TQ3Point2D *           result);
  
  EXTERN_API_C( TQ3RationalPoint4D *)
  Q3Point3D_To4D                  (const TQ3Point3D *     point3D,
                                   TQ3RationalPoint4D *   result);
  
  EXTERN_API_C( TQ3Point3D *)
  Q3RationalPoint4D_To3D          (const TQ3RationalPoint4D * point4D,
                                   TQ3Point3D *           result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector2D_To3D                 (const TQ3Vector2D *    vector2D,
                                   TQ3Vector3D *          result);
  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Vector3D_To2D                 (const TQ3Vector3D *    vector3D,
                                   TQ3Vector2D *          result);
  
  
**************************************************************************** * ** * Point Subtraction ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Point2D_Subtract              (const TQ3Point2D *     p1,
                                   const TQ3Point2D *     p2,
                                   TQ3Vector2D *          result);
  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Param2D_Subtract              (const TQ3Param2D *     p1,
                                   const TQ3Param2D *     p2,
                                   TQ3Vector2D *          result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Point3D_Subtract              (const TQ3Point3D *     p1,
                                   const TQ3Point3D *     p2,
                                   TQ3Vector3D *          result);
  
  
**************************************************************************** * ** * Point Distance ** * ** ***************************************************************************

  
  EXTERN_API_C( float )
  Q3Point2D_Distance              (const TQ3Point2D *     p1,
                                   const TQ3Point2D *     p2);
  
  EXTERN_API_C( float )
  Q3Point2D_DistanceSquared       (const TQ3Point2D *     p1,
                                   const TQ3Point2D *     p2);
  
  EXTERN_API_C( float )
  Q3Param2D_Distance              (const TQ3Param2D *     p1,
                                   const TQ3Param2D *     p2);
  
  EXTERN_API_C( float )
  Q3Param2D_DistanceSquared       (const TQ3Param2D *     p1,
                                   const TQ3Param2D *     p2);
  
  EXTERN_API_C( float )
  Q3RationalPoint3D_Distance      (const TQ3RationalPoint3D * p1,
                                   const TQ3RationalPoint3D * p2);
  
  EXTERN_API_C( float )
  Q3RationalPoint3D_DistanceSquared (const TQ3RationalPoint3D * p1,
                                   const TQ3RationalPoint3D * p2);
  
  EXTERN_API_C( float )
  Q3Point3D_Distance              (const TQ3Point3D *     p1,
                                   const TQ3Point3D *     p2);
  
  EXTERN_API_C( float )
  Q3Point3D_DistanceSquared       (const TQ3Point3D *     p1,
                                   const TQ3Point3D *     p2);
  
  EXTERN_API_C( float )
  Q3RationalPoint4D_Distance      (const TQ3RationalPoint4D * p1,
                                   const TQ3RationalPoint4D * p2);
  
  EXTERN_API_C( float )
  Q3RationalPoint4D_DistanceSquared (const TQ3RationalPoint4D * p1,
                                   const TQ3RationalPoint4D * p2);
  
  
**************************************************************************** * ** * Point Relative Ratio ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Point2D *)
  Q3Point2D_RRatio                (const TQ3Point2D *     p1,
                                   const TQ3Point2D *     p2,
                                   float                  r1,
                                   float                  r2,
                                   TQ3Point2D *           result);
  
  EXTERN_API_C( TQ3Param2D *)
  Q3Param2D_RRatio                (const TQ3Param2D *     p1,
                                   const TQ3Param2D *     p2,
                                   float                  r1,
                                   float                  r2,
                                   TQ3Param2D *           result);
  
  EXTERN_API_C( TQ3Point3D *)
  Q3Point3D_RRatio                (const TQ3Point3D *     p1,
                                   const TQ3Point3D *     p2,
                                   float                  r1,
                                   float                  r2,
                                   TQ3Point3D *           result);
  
  EXTERN_API_C( TQ3RationalPoint4D *)
  Q3RationalPoint4D_RRatio        (const TQ3RationalPoint4D * p1,
                                   const TQ3RationalPoint4D * p2,
                                   float                  r1,
                                   float                  r2,
                                   TQ3RationalPoint4D *   result);
  
  
**************************************************************************** * ** * Point / Vector Addition & Subtraction ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Point2D *)
  Q3Point2D_Vector2D_Add          (const TQ3Point2D *     point2D,
                                   const TQ3Vector2D *    vector2D,
                                   TQ3Point2D *           result);
  
  EXTERN_API_C( TQ3Param2D *)
  Q3Param2D_Vector2D_Add          (const TQ3Param2D *     param2D,
                                   const TQ3Vector2D *    vector2D,
                                   TQ3Param2D *           result);
  
  EXTERN_API_C( TQ3Point3D *)
  Q3Point3D_Vector3D_Add          (const TQ3Point3D *     point3D,
                                   const TQ3Vector3D *    vector3D,
                                   TQ3Point3D *           result);
  
  EXTERN_API_C( TQ3Point2D *)
  Q3Point2D_Vector2D_Subtract     (const TQ3Point2D *     point2D,
                                   const TQ3Vector2D *    vector2D,
                                   TQ3Point2D *           result);
  
  EXTERN_API_C( TQ3Param2D *)
  Q3Param2D_Vector2D_Subtract     (const TQ3Param2D *     param2D,
                                   const TQ3Vector2D *    vector2D,
                                   TQ3Param2D *           result);
  
  EXTERN_API_C( TQ3Point3D *)
  Q3Point3D_Vector3D_Subtract     (const TQ3Point3D *     point3D,
                                   const TQ3Vector3D *    vector3D,
                                   TQ3Point3D *           result);
  
  
**************************************************************************** * ** * Vector Scale ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Vector2D_Scale                (const TQ3Vector2D *    vector2D,
                                   float                  scalar,
                                   TQ3Vector2D *          result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector3D_Scale                (const TQ3Vector3D *    vector3D,
                                   float                  scalar,
                                   TQ3Vector3D *          result);
  
  
**************************************************************************** * ** * Vector Length ** * ** ***************************************************************************

  
  EXTERN_API_C( float )
  Q3Vector2D_Length               (const TQ3Vector2D *    vector2D);
  
  EXTERN_API_C( float )
  Q3Vector3D_Length               (const TQ3Vector3D *    vector3D);
  
  
**************************************************************************** * ** * Vector Normalize ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Vector2D_Normalize            (const TQ3Vector2D *    vector2D,
                                   TQ3Vector2D *          result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector3D_Normalize            (const TQ3Vector3D *    vector3D,
                                   TQ3Vector3D *          result);
  
  
**************************************************************************** * ** * Vector/Vector Addition and Subtraction ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Vector2D_Add                  (const TQ3Vector2D *    v1,
                                   const TQ3Vector2D *    v2,
                                   TQ3Vector2D *          result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector3D_Add                  (const TQ3Vector3D *    v1,
                                   const TQ3Vector3D *    v2,
                                   TQ3Vector3D *          result);
  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Vector2D_Subtract             (const TQ3Vector2D *    v1,
                                   const TQ3Vector2D *    v2,
                                   TQ3Vector2D *          result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector3D_Subtract             (const TQ3Vector3D *    v1,
                                   const TQ3Vector3D *    v2,
                                   TQ3Vector3D *          result);
  
  
**************************************************************************** * ** * Cross Product ** * ** ***************************************************************************

  
  EXTERN_API_C( float )
  Q3Vector2D_Cross                (const TQ3Vector2D *    v1,
                                   const TQ3Vector2D *    v2);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector3D_Cross                (const TQ3Vector3D *    v1,
                                   const TQ3Vector3D *    v2,
                                   TQ3Vector3D *          result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Point3D_CrossProductTri       (const TQ3Point3D *     point1,
                                   const TQ3Point3D *     point2,
                                   const TQ3Point3D *     point3,
                                   TQ3Vector3D *          crossVector);
  
  
**************************************************************************** * ** * Dot Product ** * ** ***************************************************************************

  
  EXTERN_API_C( float )
  Q3Vector2D_Dot                  (const TQ3Vector2D *    v1,
                                   const TQ3Vector2D *    v2);
  
  EXTERN_API_C( float )
  Q3Vector3D_Dot                  (const TQ3Vector3D *    v1,
                                   const TQ3Vector3D *    v2);
  
  
**************************************************************************** * ** * Point and Vector Transformation ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Vector2D_Transform            (const TQ3Vector2D *    vector2D,
                                   const TQ3Matrix3x3 *   matrix3x3,
                                   TQ3Vector2D *          result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector3D_Transform            (const TQ3Vector3D *    vector3D,
                                   const TQ3Matrix4x4 *   matrix4x4,
                                   TQ3Vector3D *          result);
  
  EXTERN_API_C( TQ3Point2D *)
  Q3Point2D_Transform             (const TQ3Point2D *     point2D,
                                   const TQ3Matrix3x3 *   matrix3x3,
                                   TQ3Point2D *           result);
  
  EXTERN_API_C( TQ3Param2D *)
  Q3Param2D_Transform             (const TQ3Param2D *     param2D,
                                   const TQ3Matrix3x3 *   matrix3x3,
                                   TQ3Param2D *           result);
  
  EXTERN_API_C( TQ3Point3D *)
  Q3Point3D_Transform             (const TQ3Point3D *     point3D,
                                   const TQ3Matrix4x4 *   matrix4x4,
                                   TQ3Point3D *           result);
  
  EXTERN_API_C( TQ3RationalPoint4D *)
  Q3RationalPoint4D_Transform     (const TQ3RationalPoint4D * point4D,
                                   const TQ3Matrix4x4 *   matrix4x4,
                                   TQ3RationalPoint4D *   result);
  
  EXTERN_API_C( TQ3Status )
  Q3Point3D_To3DTransformArray    (const TQ3Point3D *     inPoint3D,
                                   const TQ3Matrix4x4 *   matrix,
                                   TQ3Point3D *           outPoint3D,
                                   long                   numPoints,
                                   unsigned long          inStructSize,
                                   unsigned long          outStructSize);
  
  EXTERN_API_C( TQ3Status )
  Q3Point3D_To4DTransformArray    (const TQ3Point3D *     inPoint3D,
                                   const TQ3Matrix4x4 *   matrix,
                                   TQ3RationalPoint4D *   outPoint4D,
                                   long                   numPoints,
                                   unsigned long          inStructSize,
                                   unsigned long          outStructSize);
  
  EXTERN_API_C( TQ3Status )
  Q3RationalPoint4D_To4DTransformArray (const TQ3RationalPoint4D * inPoint4D,
                                   const TQ3Matrix4x4 *   matrix,
                                   TQ3RationalPoint4D *   outPoint4D,
                                   long                   numPoints,
                                   unsigned long          inStructSize,
                                   unsigned long          outStructSize);
  
  
**************************************************************************** * ** * Vector Negation ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Vector2D *)
  Q3Vector2D_Negate               (const TQ3Vector2D *    vector2D,
                                   TQ3Vector2D *          result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector3D_Negate               (const TQ3Vector3D *    vector3D,
                                   TQ3Vector3D *          result);
  
  
**************************************************************************** * ** * Point conversion from cartesian to polar ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3PolarPoint *)
  Q3Point2D_ToPolar               (const TQ3Point2D *     point2D,
                                   TQ3PolarPoint *        result);
  
  EXTERN_API_C( TQ3Point2D *)
  Q3PolarPoint_ToPoint2D          (const TQ3PolarPoint *  polarPoint,
                                   TQ3Point2D *           result);
  
  EXTERN_API_C( TQ3SphericalPoint *)
  Q3Point3D_ToSpherical           (const TQ3Point3D *     point3D,
                                   TQ3SphericalPoint *    result);
  
  EXTERN_API_C( TQ3Point3D *)
  Q3SphericalPoint_ToPoint3D      (const TQ3SphericalPoint * sphericalPoint,
                                   TQ3Point3D *           result);
  
  
**************************************************************************** * ** * Point Affine Combinations ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Point2D *)
  Q3Point2D_AffineComb            (const TQ3Point2D *     points2D,
                                   const float *          weights,
                                   unsigned long          nPoints,
                                   TQ3Point2D *           result);
  
  EXTERN_API_C( TQ3Param2D *)
  Q3Param2D_AffineComb            (const TQ3Param2D *     params2D,
                                   const float *          weights,
                                   unsigned long          nPoints,
                                   TQ3Param2D *           result);
  
  EXTERN_API_C( TQ3RationalPoint3D *)
  Q3RationalPoint3D_AffineComb    (const TQ3RationalPoint3D * points3D,
                                   const float *          weights,
                                   unsigned long          numPoints,
                                   TQ3RationalPoint3D *   result);
  
  EXTERN_API_C( TQ3Point3D *)
  Q3Point3D_AffineComb            (const TQ3Point3D *     points3D,
                                   const float *          weights,
                                   unsigned long          numPoints,
                                   TQ3Point3D *           result);
  
  EXTERN_API_C( TQ3RationalPoint4D *)
  Q3RationalPoint4D_AffineComb    (const TQ3RationalPoint4D * points4D,
                                   const float *          weights,
                                   unsigned long          numPoints,
                                   TQ3RationalPoint4D *   result);
  
  
**************************************************************************** * ** * Matrix Functions ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Matrix3x3 *)
  Q3Matrix3x3_Copy                (const TQ3Matrix3x3 *   matrix3x3,
                                   TQ3Matrix3x3 *         result);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_Copy                (const TQ3Matrix4x4 *   matrix4x4,
                                   TQ3Matrix4x4 *         result);
  
  EXTERN_API_C( TQ3Matrix3x3 *)
  Q3Matrix3x3_SetIdentity         (TQ3Matrix3x3 *         matrix3x3);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetIdentity         (TQ3Matrix4x4 *         matrix4x4);
  
  EXTERN_API_C( TQ3Matrix3x3 *)
  Q3Matrix3x3_Transpose           (const TQ3Matrix3x3 *   matrix3x3,
                                   TQ3Matrix3x3 *         result);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_Transpose           (const TQ3Matrix4x4 *   matrix4x4,
                                   TQ3Matrix4x4 *         result);
  
  EXTERN_API_C( TQ3Matrix3x3 *)
  Q3Matrix3x3_Invert              (const TQ3Matrix3x3 *   matrix3x3,
                                   TQ3Matrix3x3 *         result);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_Invert              (const TQ3Matrix4x4 *   matrix4x4,
                                   TQ3Matrix4x4 *         result);
  
  EXTERN_API_C( TQ3Matrix3x3 *)
  Q3Matrix3x3_Adjoint             (const TQ3Matrix3x3 *   matrix3x3,
                                   TQ3Matrix3x3 *         result);
  
  EXTERN_API_C( TQ3Matrix3x3 *)
  Q3Matrix3x3_Multiply            (const TQ3Matrix3x3 *   matrixA,
                                   const TQ3Matrix3x3 *   matrixB,
                                   TQ3Matrix3x3 *         result);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_Multiply            (const TQ3Matrix4x4 *   matrixA,
                                   const TQ3Matrix4x4 *   matrixB,
                                   TQ3Matrix4x4 *         result);
  
  EXTERN_API_C( TQ3Matrix3x3 *)
  Q3Matrix3x3_SetTranslate        (TQ3Matrix3x3 *         matrix3x3,
                                   float                  xTrans,
                                   float                  yTrans);
  
  EXTERN_API_C( TQ3Matrix3x3 *)
  Q3Matrix3x3_SetScale            (TQ3Matrix3x3 *         matrix3x3,
                                   float                  xScale,
                                   float                  yScale);
  
  EXTERN_API_C( TQ3Matrix3x3 *)
  Q3Matrix3x3_SetRotateAboutPoint (TQ3Matrix3x3 *         matrix3x3,
                                   const TQ3Point2D *     origin,
                                   float                  angle);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetTranslate        (TQ3Matrix4x4 *         matrix4x4,
                                   float                  xTrans,
                                   float                  yTrans,
                                   float                  zTrans);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetScale            (TQ3Matrix4x4 *         matrix4x4,
                                   float                  xScale,
                                   float                  yScale,
                                   float                  zScale);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetRotateAboutPoint (TQ3Matrix4x4 *         matrix4x4,
                                   const TQ3Point3D *     origin,
                                   float                  xAngle,
                                   float                  yAngle,
                                   float                  zAngle);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetRotateAboutAxis  (TQ3Matrix4x4 *         matrix4x4,
                                   const TQ3Point3D *     origin,
                                   const TQ3Vector3D *    orientation,
                                   float                  angle);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetRotate_X         (TQ3Matrix4x4 *         matrix4x4,
                                   float                  angle);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetRotate_Y         (TQ3Matrix4x4 *         matrix4x4,
                                   float                  angle);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetRotate_Z         (TQ3Matrix4x4 *         matrix4x4,
                                   float                  angle);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetRotate_XYZ       (TQ3Matrix4x4 *         matrix4x4,
                                   float                  xAngle,
                                   float                  yAngle,
                                   float                  zAngle);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetRotateVectorToVector (TQ3Matrix4x4 *     matrix4x4,
                                   const TQ3Vector3D *    v1,
                                   const TQ3Vector3D *    v2);
  
  EXTERN_API_C( TQ3Matrix4x4 *)
  Q3Matrix4x4_SetQuaternion       (TQ3Matrix4x4 *         matrix,
                                   const TQ3Quaternion *  quaternion);
  
  EXTERN_API_C( float )
  Q3Matrix3x3_Determinant         (const TQ3Matrix3x3 *   matrix3x3);
  
  EXTERN_API_C( float )
  Q3Matrix4x4_Determinant         (const TQ3Matrix4x4 *   matrix4x4);
  
  
**************************************************************************** * ** * Quaternion Routines ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_Set                (TQ3Quaternion *        quaternion,
                                   float                  w,
                                   float                  x,
                                   float                  y,
                                   float                  z);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_SetIdentity        (TQ3Quaternion *        quaternion);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_Copy               (const TQ3Quaternion *  quaternion,
                                   TQ3Quaternion *        result);
  
  EXTERN_API_C( TQ3Boolean )
  Q3Quaternion_IsIdentity         (const TQ3Quaternion *  quaternion);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_Invert             (const TQ3Quaternion *  quaternion,
                                   TQ3Quaternion *        result);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_Normalize          (const TQ3Quaternion *  quaternion,
                                   TQ3Quaternion *        result);
  
  EXTERN_API_C( float )
  Q3Quaternion_Dot                (const TQ3Quaternion *  q1,
                                   const TQ3Quaternion *  q2);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_Multiply           (const TQ3Quaternion *  q1,
                                   const TQ3Quaternion *  q2,
                                   TQ3Quaternion *        result);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_SetRotateAboutAxis (TQ3Quaternion *        quaternion,
                                   const TQ3Vector3D *    axis,
                                   float                  angle);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_SetRotate_XYZ      (TQ3Quaternion *        quaternion,
                                   float                  xAngle,
                                   float                  yAngle,
                                   float                  zAngle);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_SetRotate_X        (TQ3Quaternion *        quaternion,
                                   float                  angle);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_SetRotate_Y        (TQ3Quaternion *        quaternion,
                                   float                  angle);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_SetRotate_Z        (TQ3Quaternion *        quaternion,
                                   float                  angle);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_SetMatrix          (TQ3Quaternion *        quaternion,
                                   const TQ3Matrix4x4 *   matrix);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_SetRotateVectorToVector (TQ3Quaternion *   quaternion,
                                   const TQ3Vector3D *    v1,
                                   const TQ3Vector3D *    v2);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_MatchReflection    (const TQ3Quaternion *  q1,
                                   const TQ3Quaternion *  q2,
                                   TQ3Quaternion *        result);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_InterpolateFast    (const TQ3Quaternion *  q1,
                                   const TQ3Quaternion *  q2,
                                   float                  t,
                                   TQ3Quaternion *        result);
  
  EXTERN_API_C( TQ3Quaternion *)
  Q3Quaternion_InterpolateLinear  (const TQ3Quaternion *  q1,
                                   const TQ3Quaternion *  q2,
                                   float                  t,
                                   TQ3Quaternion *        result);
  
  EXTERN_API_C( TQ3Vector3D *)
  Q3Vector3D_TransformQuaternion  (const TQ3Vector3D *    vector3D,
                                   const TQ3Quaternion *  quaternion,
                                   TQ3Vector3D *          result);
  
  EXTERN_API_C( TQ3Point3D *)
  Q3Point3D_TransformQuaternion   (const TQ3Point3D *     point3D,
                                   const TQ3Quaternion *  quaternion,
                                   TQ3Point3D *           result);
  
  
**************************************************************************** * ** * Volume Routines ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3BoundingBox *)
  Q3BoundingBox_Copy              (const TQ3BoundingBox * src,
                                   TQ3BoundingBox *       dest);
  
  EXTERN_API_C( TQ3BoundingBox *)
  Q3BoundingBox_Union             (const TQ3BoundingBox * v1,
                                   const TQ3BoundingBox * v2,
                                   TQ3BoundingBox *       result);
  
  EXTERN_API_C( TQ3BoundingBox *)
  Q3BoundingBox_Set               (TQ3BoundingBox *       bBox,
                                   const TQ3Point3D *     min,
                                   const TQ3Point3D *     max,
                                   TQ3Boolean             isEmpty);
  
  EXTERN_API_C( TQ3BoundingBox *)
  Q3BoundingBox_UnionPoint3D      (const TQ3BoundingBox * bBox,
                                   const TQ3Point3D *     point3D,
                                   TQ3BoundingBox *       result);
  
  EXTERN_API_C( TQ3BoundingBox *)
  Q3BoundingBox_UnionRationalPoint4D (const TQ3BoundingBox * bBox,
                                   const TQ3RationalPoint4D * point4D,
                                   TQ3BoundingBox *       result);
  
  EXTERN_API_C( TQ3BoundingBox *)
  Q3BoundingBox_SetFromPoints3D   (TQ3BoundingBox *       bBox,
                                   const TQ3Point3D *     points3D,
                                   unsigned long          numPoints,
                                   unsigned long          structSize);
  
  EXTERN_API_C( TQ3BoundingBox *)
  Q3BoundingBox_SetFromRationalPoints4D (TQ3BoundingBox * bBox,
                                   const TQ3RationalPoint4D * points4D,
                                   unsigned long          numPoints,
                                   unsigned long          structSize);
  
  
**************************************************************************** * ** * Sphere Routines ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3BoundingSphere *)
  Q3BoundingSphere_Copy           (const TQ3BoundingSphere * src,
                                   TQ3BoundingSphere *    dest);
  
  EXTERN_API_C( TQ3BoundingSphere *)
  Q3BoundingSphere_Union          (const TQ3BoundingSphere * s1,
                                   const TQ3BoundingSphere * s2,
                                   TQ3BoundingSphere *    result);
  
  EXTERN_API_C( TQ3BoundingSphere *)
  Q3BoundingSphere_Set            (TQ3BoundingSphere *    bSphere,
                                   const TQ3Point3D *     origin,
                                   float                  radius,
                                   TQ3Boolean             isEmpty);
  
  EXTERN_API_C( TQ3BoundingSphere *)
  Q3BoundingSphere_UnionPoint3D   (const TQ3BoundingSphere * bSphere,
                                   const TQ3Point3D *     point3D,
                                   TQ3BoundingSphere *    result);
  
  EXTERN_API_C( TQ3BoundingSphere *)
  Q3BoundingSphere_UnionRationalPoint4D (const TQ3BoundingSphere * bSphere,
                                   const TQ3RationalPoint4D * point4D,
                                   TQ3BoundingSphere *    result);
  
  EXTERN_API_C( TQ3BoundingSphere *)
  Q3BoundingSphere_SetFromPoints3D (TQ3BoundingSphere *   bSphere,
                                   const TQ3Point3D *     points3D,
                                   unsigned long          numPoints,
                                   unsigned long          structSize);
  
  EXTERN_API_C( TQ3BoundingSphere *)
  Q3BoundingSphere_SetFromRationalPoints4D (TQ3BoundingSphere * bSphere,
                                   const TQ3RationalPoint4D * points4D,
                                   unsigned long          numPoints,
                                   unsigned long          structSize);
  
  endif  /* CALL_NOT_IN_CARBON */
  
  if PRAGMA_ENUM_ALWAYSINT
      #pragma enumsalwaysint reset
      #ifdef __QD3DMATH__RESTORE_TWOBYTEINTS
          #pragma fourbyteints off
      #endif
  #elif PRAGMA_ENUM_OPTIONS
      #pragma option enum=reset
  #elif defined(__QD3DMATH__RESTORE_PACKED_ENUMS)
      #pragma options(pack_enums)
  endif
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=reset
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(pop)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack()
  endif
  
  ifdef PRAGMA_IMPORT_OFF
  #pragma import off
  #elif PRAGMA_IMPORT
  #pragma import reset
  endif
  
  ifdef __cplusplus
  }
  endif
  
  endif /* __QD3DMATH__ */
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.