mirror of
https://github.com/GTAmodding/re3.git
synced 2024-11-25 16:13:43 +00:00
141 lines
5 KiB
C
141 lines
5 KiB
C
/***************************************************************************
|
|
* *
|
|
* Module : rtbary.h *
|
|
* *
|
|
* Purpose : Barycentric operations *
|
|
* *
|
|
**************************************************************************/
|
|
|
|
#ifndef RTBARY_H
|
|
#define RTBARY_H
|
|
|
|
/**
|
|
* \defgroup rtbary RtBary
|
|
* \ingroup rttool
|
|
*
|
|
* Barycentric Toolkit for RenderWare.
|
|
*/
|
|
|
|
|
|
/****************************************************************************
|
|
Includes
|
|
*/
|
|
|
|
#include <rwcore.h>
|
|
|
|
#include <rtbary.rpe> /* automatically generated header file */
|
|
|
|
|
|
/****************************************************************************
|
|
Global types
|
|
*/
|
|
|
|
/**
|
|
* \ingroup rtbary
|
|
* \typedef RtBaryV4d
|
|
* typedef for the 4 element homogeneous row of a transform matrix mapping
|
|
* a point from Cartesian space to the barycentric space defined by a triangle.
|
|
*/
|
|
typedef RwReal RtBaryV4d[4];
|
|
|
|
/**
|
|
* \ingroup rtbary
|
|
* \typedef RtBaryTransform
|
|
* typedef for the 4x4 homogeneous transform matrix mapping a point
|
|
* from Cartesian space to the barycentric space defined by a triangle.
|
|
*/
|
|
typedef RtBaryV4d RtBaryTransform[4];
|
|
|
|
/****************************************************************************
|
|
Defines
|
|
*/
|
|
|
|
#define RtBaryV3dFromWeightsMacro(_out, _b, _v0, _v1, _v2) \
|
|
MACRO_START \
|
|
{ \
|
|
(_out)->x = (RwReal)( ((_v0)->x * (_b)[0]) + \
|
|
((_v1)->x * (_b)[1]) + \
|
|
((_v2)->x * (_b)[2]) ); \
|
|
(_out)->y = (RwReal)( ((_v0)->y * (_b)[0]) + \
|
|
((_v1)->y * (_b)[1]) + \
|
|
((_v2)->y * (_b)[2]) ); \
|
|
(_out)->z = (RwReal)( ((_v0)->z * (_b)[0]) + \
|
|
((_v1)->z * (_b)[1]) + \
|
|
((_v2)->z * (_b)[2]) ); \
|
|
} \
|
|
MACRO_STOP
|
|
|
|
#define RtBaryWeightsFromV3dMacro(_out, _m, _in) \
|
|
MACRO_START \
|
|
{ \
|
|
(_out)[0] = ( (_m)[0][0] * (_in)->x + \
|
|
(_m)[1][0] * (_in)->y + \
|
|
(_m)[2][0] * (_in)->z + \
|
|
(_m)[3][0] ); \
|
|
(_out)[1] = ( (_m)[0][1] * (_in)->x + \
|
|
(_m)[1][1] * (_in)->y + \
|
|
(_m)[2][1] * (_in)->z + \
|
|
(_m)[3][1] ); \
|
|
(_out)[2] = ( (_m)[0][2] * (_in)->x + \
|
|
(_m)[1][2] * (_in)->y + \
|
|
(_m)[2][2] * (_in)->z + \
|
|
(_m)[3][2] ); \
|
|
(_out)[3] = ( (_m)[0][3] * (_in)->x + \
|
|
(_m)[1][3] * (_in)->y + \
|
|
(_m)[2][3] * (_in)->z + \
|
|
(_m)[3][3] ); \
|
|
} \
|
|
MACRO_STOP
|
|
|
|
#if (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ))
|
|
|
|
#define RtBaryV3dFromWeights(_out, _b, _v0, _v1, _v2) \
|
|
RtBaryV3dFromWeightsMacro(_out, _b, _v0, _v1, _v2)
|
|
|
|
#define RtBaryWeightsFromV3d(_out, _m, _in) \
|
|
RtBaryWeightsFromV3dMacro(_out, _m, _in)
|
|
|
|
#endif /* (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )) */
|
|
|
|
/****************************************************************************
|
|
Function prototypes
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif /* __cplusplus */
|
|
|
|
extern RwBool
|
|
RtBaryGetTransform(RtBaryTransform m,
|
|
RwReal * const area,
|
|
const RwV3d * const v0,
|
|
const RwV3d * const v1,
|
|
const RwV3d * const v2);
|
|
|
|
#if ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )
|
|
|
|
extern void
|
|
RtBaryV3dFromWeights(RwV3d * const out,
|
|
const RtBaryV4d weights,
|
|
const RwV3d * const v0,
|
|
const RwV3d * const v1,
|
|
const RwV3d * const v2);
|
|
|
|
extern void
|
|
RtBaryWeightsFromV3d(RtBaryV4d out,
|
|
RtBaryTransform mat,
|
|
const RwV3d * const in);
|
|
|
|
extern void
|
|
_rtImportWorldBaryFromEdge(RtBaryV4d out,
|
|
RtBaryTransform mat,
|
|
const RwV3d * const in);
|
|
|
|
#endif /* ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ) */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* RTBARY_H */
|