mirror of
				https://github.com/halpz/re3.git
				synced 2025-11-04 15:35:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			142 lines
		
	
	
		
			5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			142 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 */
 |