[BACK]Return to pfiInputXform.h CVS log [TXT][DIR] Up to [Development] / performer / src / lib / libpfui

File: [Development] / performer / src / lib / libpfui / pfiInputXform.h (download)

Revision 1.1, Tue Nov 21 21:39:35 2000 UTC (16 years, 10 months ago) by flynnt
Branch: MAIN
CVS Tags: HEAD

Initial check-in based on OpenGL Performer 2.4 tree.
-flynnt

/*
 * Copyright 1993, 1994, 1995, Silicon Graphics, Inc.
 * ALL RIGHTS RESERVED
 *
 * UNPUBLISHED -- Rights reserved under the copyright laws of the United
 * States.   Use of a copyright notice is precautionary only and does not
 * imply publication or disclosure.
 *
 * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
 * Use, duplication or disclosure by the Government is subject to restrictions
 * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights
 * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or
 * in similar or successor clauses in the FAR, or the DOD or NASA FAR
 * Supplement.  Contractor/manufacturer is Silicon Graphics, Inc.,
 * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311.
 *
 * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY
 * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION,
 * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY
 * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON
 * GRAPHICS, INC.
 */


/*
 * pfiInputXform.h
 *
 * $Revision: 1.1 $
 * $Date: 2000/11/21 21:39:35 $
 *
 */

#ifndef __INPUTXFORM_H__
#define __INPUTXFORM_H__

#define PFIX_INFPUTXFORM_CLASS	    100
#define PFIX_INFPUTXFORM_TYPE	    100

#include <Performer/pfui.h>


extern void _pfiClassInitCheck(void);

#if PF_CPLUSPLUS_API


class pfiInputCoord : public pfObject
{
  private:
    static pfType *classType;
  public:
    int			focus;
  public:
    pfiInputCoord(void);
  public:	/****** type *****/
    static void	   init();
    static pfType* getClassType() { return classType; }
    virtual const char*	getTypeName(void) const { return "pfiInputCoord"; }
  public:	/****** basic interface *****/
    virtual void	setFocus(int _focus) { focus = _focus; }
    virtual int		getFocus(void) const { return (focus != 0); }
    virtual int		inMotion(void) const { return 0; }
    virtual void	reset(void) { focus = 0; }
    virtual void	setVec(float *vec);
    virtual void	setPrev(float *vec);
    virtual void	getVec(float *vec) const;
    virtual void	getPrev(float *vec) const;
    virtual float	getCoord(int index) const;
    virtual float	getPrevCoord(int index) const;
    virtual float	getDelta(int index) const;
    virtual void	updatePrev(void);
    
		/***** parent class copy routines - don't copy what we don't know ****/
    virtual int copy(const pfMemory *_src) {return pfMemory::copy(_src);}
    virtual void copy(const pfObject *_src) {pfObject::copy(_src);}
		/***** our copy routine ****/
    void	copy(pfiInputCoord *_src) {focus = _src->focus;}
  
};

class pfi2DInputCoord : public pfiInputCoord
{
  private:
    static pfType *classType;
  public:
    pfVec2		pos;
    pfVec2		prevPos;
  public:	/****** constructor/destructors ******/
    pfi2DInputCoord(void);
  public:	/****** type *****/
    static void	   init();
    static pfType* getClassType() { return classType; }
    virtual const char*	getTypeName(void) const { return "pfi2DInputCoord"; }
  public:	/****** sets/gets ******/
    virtual void	reset(void) { 
	PFSET_VEC2(pos, -2.0f, -2.0f);
	PFSET_VEC2(prevPos, -2.0f, -2.0f);
    }
    virtual int		inMotion(void) const {
	if ((prevPos[PF_X] < -1.0f) || (prevPos[PF_Y] < -1.0f))
	    return 0;
	return (!(PFALMOST_EQUAL_VEC2(prevPos, pos, 0.00001f)));
    }
    virtual float	getCoord(int _index) const {
	return	pos[_index];
    }
    virtual float	getPrevCoord(int _index) const {
	return	prevPos[_index];
    }
    virtual float	getDelta(int _index) const {
	if (prevPos[_index] < -1.0f)
	    return 0.0f;
	return (pos[_index] - prevPos[_index]);
    }
    virtual void	getVec(float *vec) const {
	vec[PF_X] = pos[PF_X];
	vec[PF_Y] = pos[PF_Y];
    }
    virtual void	getPrev(float *vec) const {
	vec[PF_X] = prevPos[PF_X];
	vec[PF_Y] = prevPos[PF_Y];
    }
    virtual void	setVec(float *vec) {
	updatePrev();
	PFSET_VEC2(pos, vec[PF_X], vec[PF_Y]);
    }
    virtual void	setPrev(float *vec) {
	PFSET_VEC2(prevPos, vec[PF_X], vec[PF_Y]);
    }
    virtual void	updatePrev(void) {
	PFCOPY_VEC2(prevPos, pos);
    }
};

class pfiMotionCoord : public pfObject
{
  private:
    static pfType *classType;
  public:
		/* position parameters */
    pfCoord		startPos, prevPos, pos;
    double		startTime, prevTime, time;
    pfMatrix		mat;
		/* motion parameters */
    float		speed, minSpeed, maxSpeed, startSpeed;
    float		angularVel, minAngVel, maxAngVel, startAngVel, angAccel;
    float		accel, minAccel, maxAccel, startAccel;
  public:	/* constructor/destructors */
    pfiMotionCoord(void);
  public:	/****** type *****/
    static void	   init();
    static pfType* getClassType() { return classType; }
    virtual const char*	getTypeName(void) const { return "pfiMotionCoord"; }

  public:	/***** parent class copy routines - don't copy what we don't know ****/
    virtual int copy(const pfMemory *_src) {return pfMemory::copy(_src);}
    virtual void copy(const pfObject *_src) {pfObject::copy(_src);}
  public:	/****** basic interface *****/
    void		makeMat(void);
    void		reset(void);
    void		resetPosition(void);
    void		setMat(pfMatrix& _mat);
    void		setCoord(pfCoord *_coord);
		/***** our copy routines ****/
    void		copy(pfiMotionCoord *_src);
    void		copyPos(pfiMotionCoord *_src);
    void		copyMotion(pfiMotionCoord *_src);
  public:
};

class pfiInput : public pfObject
{
  private:
    static pfType *classType;
  public:
    char		xName[PF_MAXSTRING];
    short		xFocus;
    int			xEventMask;
    pfuEventStream	*xEventStream;
    void		*xEventStreamCollectorData;
    void		*xEventStreamProcessorData;
    void		*xEventHandlerData;

  public:	/****** callbacks and associated CB data *****/
    pfuEventHandlerFuncType	 xHandler; /* called from input process,
					    * gets events not for transform handlers
					    */
    pfiEventStreamHandlerType	xEventStreamCollector;
    pfiEventStreamHandlerType	xEventStreamProcessor;
  public:	/* constructor/destructors */
    pfiInput(void);
    virtual ~pfiInput(void);
  public:	/****** sets/gets *****/
    void		setName(const char *_name);
    const char 		*getName(void) {
	return xName;
    }
    void		setEventMask(int _emask) {
	xEventMask = _emask;
    }
    int			getEventMask(void) const { return xEventMask; }
    void		setEventStream(pfuEventStream *_es) {
	xEventStream = _es;
    }
    pfuEventStream	*getEventStream(void) { return xEventStream; }
    void		setEventStreamProcessor(pfiEventStreamHandlerType _func, void *_data) {
		xEventStreamProcessor = _func;
		xEventStreamProcessorData = _data;
    }
    void 		getEventStreamProcessor(pfiEventStreamHandlerType *_func, void **_data) const {
	*_func = xEventStreamProcessor;
	*_data = xEventStreamProcessorData;
    }
    void		setEventStreamCollector(pfiEventStreamHandlerType _func, void *_data) {
		xEventStreamCollector = _func;
		xEventStreamCollectorData = _data;
    }
    void getEventStreamCollector(pfiEventStreamHandlerType *_func, void **_data) const {
	*_func = xEventStreamCollector;
	*_data = xEventStreamCollectorData;
    }
    void		setEventHandler(pfuEventHandlerFuncType _func, void *_data) {
		xHandler = _func;
		xEventHandlerData = _data;
    }
    void 		getEventHandler(pfuEventHandlerFuncType *_func, void **_data) const {
	*_func = xHandler;
	*_data = xEventHandlerData;
    }
    
  public:	/****** type *****/
    static void	   init();
    static pfType* getClassType() { return classType; }
    virtual const char*	getTypeName(void) const { return "pfiInput"; }
  public:	/****** generic interface *****/
    virtual void	setFocus(int _focus) { xFocus = _focus; }
    virtual int 	getFocus(void) { return (xFocus); }
    virtual void	reset(void);
    virtual void	collectEvents(void) {
	if (xEventStreamCollector)
	    xEventStreamCollector(this, xEventStream, xEventStreamCollectorData);
    }
    virtual void	processEvents(void) {
	if (xEventStreamProcessor)
	    xEventStreamProcessor(this, xEventStream, xEventStreamProcessorData);
    }
};

// masks to record which parameters user has set and need to
// be preserved
#define _PFIX_USET_START_MOTION	    0x001
#define _PFIX_USET_MOTION_LIMITS    0x002
#define _PFIX_USET_DB_LIMITS	    0x004
#define _PFIX_USET_BSPHERE	    0x008
#define _PFIX_USET_DB_SIZE	    0x010
#define _PFIX_USET_RESET_POS	    0x020
#define _PFIX_USET_SPHERIC_LIMITS   0x040

/* limit modes */
#define _PFIX_LIMIT_POS		    0x1
#define _PFIX_LIMIT_SPEED	    0x2
#define _PFIX_LIMIT_ACCEL	    0x4

class pfiInputXform : public pfObject
{
  private:
    static pfType *classType;
    char		xName[PF_MAXSTRING];
  public:
    short		xFocus;
    pfiMotionCoord	xMotionCoord;
    short		xInMotion, xMotionMode, xAccelMode, xAuto;
    int			xUpdateMode;
    int			xLimitPosMask, xLimitSpeedMask, xLimitAccelMask;
    float		xDBSize; /* diameter of xDBSphere */
    float		xDBSizeLg; /* log of DBSize */
    pfBox		xDBLimits; /* tight bounding box on database */
    pfSphere		xDBSphere; /* bounding sphere for xDBLimits */
    int			xUserSetMask; /* mask of user set props, tells us not to auto set */
    pfiInput		*xInput;
    pfiInputCoord	*xInputCoord;
    void		*xMotionCBData;
    pfiInputXformFuncType	xStartMotionCB, xStopMotionCB;
    void		*xUpdateCBData;
    pfiInputXformUpdateFuncType xUpdateCB;
  public:	/****** constructor/destructors ******/
    pfiInputXform(void);
  public:	/****** type ******/
    static void	   init();
    static pfType* getClassType() { return classType; }
    virtual const char*	getTypeName(void) const { return "pfiInputXform"; }
  public:	/****** generic interface ******/
    virtual void	reset(void);
    virtual void	resetPosition(void);
    virtual void	stop(void);
    virtual int		isInMotion(void) const { return xInMotion; }
    virtual void	limitPos(void);
    virtual void	limitSpeed(void);
    virtual void	update(void);
    void		setName(const char *_name);
    const char 		*getName(void) {
	return xName;
    }
    virtual void	setFocus(int _focus) { xFocus = _focus; }
    virtual int 	getFocus(void) { return (xFocus); }
    virtual void	setMode(int _mode, int _val);
    virtual int 	getMode(int _mode) const;
    virtual void		setMat(pfMatrix& _mat);
    virtual void		getMat(pfMatrix& _mat) {
	PFCOPY_MAT(_mat,  xMotionCoord.mat);
    }
    virtual void	setInputCoordPtr(pfiInputCoord *_ic) { xInputCoord = _ic; }
    virtual pfiInputCoord* getInputCoordPtr(void) { return xInputCoord; }
    virtual void	setInput(pfiInput *_in) { xInput = _in; }
    virtual pfiInput*	getInput(void) { return xInput; }
    virtual void	setMotionCoord(pfiMotionCoord *_coord);
    virtual void	getMotionCoord(pfiMotionCoord *_coord);
    virtual void	setCoord(pfCoord *_coord);
    virtual void	getCoord(pfCoord *_coord) {
	*_coord = xMotionCoord.pos;
    }
    virtual void	setResetCoord(pfCoord *_coord) {
	xMotionCoord.startPos = *_coord;
	xUserSetMask |= _PFIX_USET_RESET_POS;
    }
    virtual void	getResetCoord(pfCoord *_coord) {
	*_coord = xMotionCoord.startPos;
    }
    virtual void	setStartSpeed(float _speed) {
	xMotionCoord.startSpeed = _speed;
    }
    virtual float	getStartSpeed(void) const {
	return xMotionCoord.startSpeed; 
    }
    virtual void	setUpdateFunc(pfiInputXformUpdateFuncType _updateCB, 
				void *_updateData) {
	xUpdateCB =_updateCB;
	xUpdateCBData = _updateData;	   
    }
    virtual void	getUpdateFunc(pfiInputXformUpdateFuncType *_updateCB, 
				void **_updateData) {
	*_updateCB = xUpdateCB;
	*_updateData = xUpdateCBData;	   
    }
    // XXX Motion callbacks and isInMotion aren't really the same thing
    virtual void	setMotionFuncs(pfiInputXformFuncType _startCB, 
				       pfiInputXformFuncType _stopCB, 
				       void *_motionData) {
	xStartMotionCB = _startCB;
	xStopMotionCB =_stopCB;
	xMotionCBData = _motionData;	   
   }
   virtual void		getMotionFuncs(pfiInputXformFuncType *_startCB, 
				       pfiInputXformFuncType *_stopCB, 
				       void **_motionData) {
	*_startCB = xStartMotionCB;
	*_stopCB = xStopMotionCB;
	*_motionData = xMotionCBData;
    }
    virtual void	setStartMotion(float _startSpeed, float _startAccel) {
	xUserSetMask |= _PFIX_USET_START_MOTION;
	xMotionCoord.startSpeed = _startSpeed;
	xMotionCoord.accel = xMotionCoord.startAccel = _startAccel;
    }
    virtual void	getStartMotion(float *_startSpeed,
				     float *_startAccel) const {
	*_startSpeed = xMotionCoord.startSpeed;
	*_startAccel = xMotionCoord.startAccel;
    }
    virtual void	setMotionLimits(float _maxSpeed,
				     float _angularVel, float _maxAccel);
    virtual void	getMotionLimits(float *_maxSpeed,
				     float *_angularVel, float *_maxAccel) const;
    virtual void	setDBLimits(pfBox* _dbLimits) {
	_setDBLimits(_dbLimits);
	xUserSetMask |= _PFIX_USET_DB_LIMITS;
    }
    virtual void	setBSphere(pfSphere* _sphere) {
	_setBSphere(_sphere);
	xUserSetMask |= _PFIX_USET_BSPHERE;
    }
    virtual void	_setDBLimits(pfBox* _dbLimits);
    virtual void	getDBLimits(pfBox* _dbLimits) const { *_dbLimits = xDBLimits; }
    virtual void	_setBSphere(pfSphere* _sphere);
    virtual void	getBSphere(pfSphere* _sphere) const { *_sphere = xDBSphere; }
    virtual void	setCenter(float _x, float _y, float _z); /* setCenter updates BSphere */
    virtual void	getCenter(float *_x, float *_y, float *_z) const {
	*_x = xDBSphere.center[0];
	*_y = xDBSphere.center[1];
	*_z = xDBSphere.center[2];
    }
    virtual void	setDBSize(float _size); /* updates BSphere */
    virtual float	getDBSize(void) const { return xDBSize; }
};

class pfiInputXformTravel : public pfiInputXform
{
  private:
    static pfType *classType;
  public:
    int			xMotionMod;
    float		xAccelRate; /* extra acceleration/deceleration multiplier */
  public:	/****** constructor/destructors ******/
    pfiInputXformTravel(void);
  public:	/****** type *****/
    static void	   init();
    static pfType* getClassType() { return classType; }
    virtual const char*	getTypeName(void) const { return "pfiInputXformTravel"; }
  public:	/***** sets/gets *****/
    void		setAccelRate(float _m) { xAccelRate = _m; }
    float		getAccelRate(void) { return xAccelRate; }
  public: 	/**** generic interface ****/
    virtual void	setMode(int _mode, int _val);
    virtual int		getMode(int _mode) const;
    virtual void	reset(void);
    virtual void	stop(void);
};

#endif /* PF_CPLUSPLUS_API */

#endif /* __INPUTXFORM_H__ */