
/******************************************/
/*                                        */
/*    RenderWare(TM) Graphics Library     */
/*                                        */
/******************************************/

/*
 * This file is a product of Criterion Software Ltd.
 *
 * This file is provided as is with no warranties of any kind and is
 * provided without any obligation on Criterion Software Ltd.
 * or Canon Inc. to assist in its use or modification.
 *
 * Criterion Software Ltd. and Canon Inc. will not, under any
 * circumstances, be liable for any lost revenue or other damages
 * arising from the use of this file.
 *
 * Copyright (c) 1998. Criterion Software Ltd.
 * All Rights Reserved.
 */


/****************************************************************************
 *                                                                         
 * Morph animation controller
 * Copyright (C) 1998 Criterion Technologies
 *
 * Module  : rpmorph.h
 *                                                                         
 * Purpose : Functions for controlling morph target animation
 *                                                                         
 ****************************************************************************/

#ifndef RPMORPH_H
#define RPMORPH_H


/**
 * \defgroup rpmorph RpMorph
 * \ingroup rpplugin
 *
 * Morphing Plugin for RenderWare Graphics.
 */

/****************************************************************************
 Includes
 */

#include "rwcore.h"
#include "rpworld.h"

#include "rpmorph.rpe"    /* automatically generated header file */

/****************************************************************************
 Global Types
 */
typedef struct RpMorphInterpolator RpMorphInterpolator;

/**
 * \ingroup rpmorph
 * \struct RpMorphInterpolator
 * structure describing morph interpolator
 */
struct RpMorphInterpolator
{
    RwInt32  flags; /**< flags */
    RwInt16  startMorphTarget; /**< startMorphTarget */
    RwInt16  endMorphTarget; /**< endMorphTarget */
    RwReal   time; /**< time */
    RwReal   recipTime; /**< recipTime */
    RpMorphInterpolator *next; /**< next */
};

/* Morph Animation */

/**
 * \ingroup rpmorph
 * \typedef RpMorphGeometryCallBack
 * This is the callback function supplied to \ref RpMorphGeometrySetCallBack 
 * and returned from \ref RpMorphGeometryGetCallBack.
 * The supplied function will be passed a pointer to the geometry's parent atomic,
 * and the position of the current interpolator.
 * The function will only be called when the position of the geometry's current
 * interpolator moves out of the current range.
 *
 * \param  atomic     Pointer to the geometry's parent atomic.
 * \param  position   Value of the current interpolator.
 * 
 * \return
 * 
 * \see RpMorphGeometrySetCallBack
 * \see RpMorphGeometryGetCallBack
 */
typedef RwReal (*RpMorphGeometryCallBack)(RpAtomic *atomic, RwReal position);

/****************************************************************************
 Function prototypes
 */

#ifdef    __cplusplus
extern "C"
{
#endif /* __cplusplus */

extern RwBool                    RpMorphPluginAttach(void);

/* Morph Animation */
extern RpGeometry               *RpMorphGeometryCreateInterpolators(RpGeometry *geometry, RwInt32 numInterps);
extern RpGeometry               *RpMorphGeometrySetInterpolator(RpGeometry *geometry,
                                                                RwInt32 interpNum,
                                                                RwInt32 startKey, RwInt32 endKey, RwReal time);
extern RpGeometry               *RpMorphGeometrySetNextInterpolator(RpGeometry *geometry,
                                                                RwInt32 interpNum, RwInt32 interpNumNext);
extern RpGeometry               *RpMorphGeometrySetCallBack(RpGeometry *geometry, RpMorphGeometryCallBack animCB);
extern RpMorphGeometryCallBack   RpMorphGeometryGetCallBack(const RpGeometry *geometry);

extern RpAtomic                 *RpMorphAtomicSetCurrentInterpolator(RpAtomic *atomic, RwInt32 interpNum);
extern RwInt32                   RpMorphAtomicGetCurrentInterpolator(RpAtomic *atomic);

extern RpMorphInterpolator      *RpMorphGeometryGetInterpolator(RpGeometry *geometry, RwInt32 interpNum);

extern RpAtomic                 *RpMorphAtomicSetTime(RpAtomic *atomic, RwReal time);
extern RpAtomic                 *RpMorphAtomicAddTime(RpAtomic *atomic, RwReal time);


/* LEGACY-SUPPORT version: */
extern RpMorphInterpolator      *_rpMorphAtomicGetInterpolator(RpAtomic *atomic, RwInt32 interpNum);

#ifdef    __cplusplus
}
#endif /* __cplusplus */

#define RpMorphAtomicGetInterpolator(_atomic, _interpNum) \
        _rpMorphAtomicGetInterpolator(_atomic, _interpNum)

#endif /* RPMORPH_H */

