|
|
|
/*==LICENSE==*
|
|
|
|
|
|
|
|
CyanWorlds.com Engine - MMOG client, server and tools
|
|
|
|
Copyright (C) 2011 Cyan Worlds, Inc.
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
Additional permissions under GNU GPL version 3 section 7
|
|
|
|
|
|
|
|
If you modify this Program, or any covered work, by linking or
|
|
|
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
|
|
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
|
|
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
|
|
|
(or a modified version of those libraries),
|
|
|
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
|
|
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
|
|
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
|
|
|
licensors of this Program grant you additional
|
|
|
|
permission to convey the resulting work. Corresponding Source for a
|
|
|
|
non-source form of such a combination shall include the source code for
|
|
|
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
|
|
|
work.
|
|
|
|
|
|
|
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
|
|
|
or by snail mail at:
|
|
|
|
Cyan Worlds, Inc.
|
|
|
|
14617 N Newport Hwy
|
|
|
|
Mead, WA 99021
|
|
|
|
|
|
|
|
*==LICENSE==*/
|
|
|
|
// SIMULATION MESSAGES
|
|
|
|
// Messages that influence the movement of a physically simulated object
|
|
|
|
|
|
|
|
#ifndef PLSIMINFLUENCEMSG_H
|
|
|
|
#define PLSIMINFLUENCEMSG_H
|
|
|
|
/*
|
|
|
|
#include "pnMessage/plSimulationMsg.h"
|
|
|
|
#include "hsGeometry3.h"
|
|
|
|
|
|
|
|
////////////
|
|
|
|
//
|
|
|
|
// INFLUENCE
|
|
|
|
//
|
|
|
|
////////////
|
|
|
|
|
|
|
|
// PLSIMULATIONINFLUENCEMSG (virtual)
|
|
|
|
// base for messages that are used to push physical objects around in one way or another
|
|
|
|
class plSimInfluenceMsg : public plSimulationMsg
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
plSimInfluenceMsg() : plSimulationMsg() {};
|
|
|
|
plSimInfluenceMsg(const plKey& sender, const plKey &receiver, double *time)
|
|
|
|
:plSimulationMsg(sender, receiver, time){};
|
|
|
|
|
|
|
|
CLASSNAME_REGISTER( plSimInfluenceMsg );
|
|
|
|
GETINTERFACE_ANY( plSimInfluenceMsg, plSimulationMsg);
|
|
|
|
|
|
|
|
virtual void Read(hsStream *stream, hsResMgr *mgr);
|
|
|
|
virtual void Write(hsStream *stream, hsResMgr *mgr);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// FORCES
|
|
|
|
/////////
|
|
|
|
|
|
|
|
// PLFORCEMSG
|
|
|
|
// apply a force to the center of mass of the receiver
|
|
|
|
class plForceMsg : public plSimInfluenceMsg
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
plForceMsg() : plSimInfluenceMsg() { };
|
|
|
|
plForceMsg::plForceMsg(const plKey& sender, const plKey &receiver, hsVector3 &force)
|
|
|
|
:plSimInfluenceMsg(sender, receiver, nil), fForce(force) {};
|
|
|
|
plForceMsg::plForceMsg(const plKey& sender, const plKey &receiver, double *time, hsVector3 &force)
|
|
|
|
:plSimInfluenceMsg(sender, receiver, time), fForce(force) {};
|
|
|
|
|
|
|
|
CLASSNAME_REGISTER( plForceMsg );
|
|
|
|
GETINTERFACE_ANY( plForceMsg, plSimInfluenceMsg);
|
|
|
|
|
|
|
|
void Read(hsStream *stream, hsResMgr *mgr);
|
|
|
|
void Write(hsStream *stream, hsResMgr *mgr);
|
|
|
|
|
|
|
|
hsVector3 GetForce() const { return fForce; }
|
|
|
|
|
|
|
|
void SetForce(const hsVector3 &the_Force)
|
|
|
|
{ fForce = the_Force; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
hsVector3 fForce;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// PLOFFSETFORCE
|
|
|
|
// apply a force to the receiver as though it were being impacted at the
|
|
|
|
// given point in global space
|
|
|
|
class plOffsetForceMsg : public plForceMsg
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
plOffsetForceMsg() : plForceMsg() { };
|
|
|
|
plOffsetForceMsg(const plKey& sender, const plKey &receiver, hsVector3 &force, hsPoint3 &point)
|
|
|
|
:plForceMsg(sender, receiver, nil, force), fPoint(point) {};
|
|
|
|
plOffsetForceMsg(const plKey& sender, const plKey &receiver, double *time, hsVector3 &force, hsPoint3 &point)
|
|
|
|
:plForceMsg(sender, receiver, time, force), fPoint(point) {};
|
|
|
|
|
|
|
|
CLASSNAME_REGISTER( plOffsetForceMsg );
|
|
|
|
GETINTERFACE_ANY( plOffsetForceMsg, plForceMsg);
|
|
|
|
|
|
|
|
void Read(hsStream *stream, hsResMgr *mgr);
|
|
|
|
void Write(hsStream *stream, hsResMgr *mgr);
|
|
|
|
|
|
|
|
hsPoint3 GetPoint() const { return fPoint; }
|
|
|
|
|
|
|
|
void SetPoint(const hsPoint3 &the_Point)
|
|
|
|
{ fPoint = the_Point; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
hsPoint3 fPoint;
|
|
|
|
};
|
|
|
|
|
|
|
|
// PLTORQUEMSG
|
|
|
|
// Apply the given torque force to the body
|
|
|
|
// The vector indicates the axes, and the magnitude indicates the strength
|
|
|
|
class plTorqueMsg : public plSimInfluenceMsg
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
plTorqueMsg() : plSimInfluenceMsg() { };
|
|
|
|
plTorqueMsg(const plKey& sender, const plKey &receiver, hsVector3 & torque)
|
|
|
|
:plSimInfluenceMsg(sender, receiver, nil), fTorque(torque) {};
|
|
|
|
|
|
|
|
CLASSNAME_REGISTER( plTorqueMsg );
|
|
|
|
GETINTERFACE_ANY( plTorqueMsg, plSimInfluenceMsg);
|
|
|
|
|
|
|
|
void Read(hsStream *stream, hsResMgr *mgr);
|
|
|
|
void Write(hsStream *stream, hsResMgr *mgr);
|
|
|
|
|
|
|
|
hsVector3 GetTorque() const { return fTorque; }
|
|
|
|
void SetTorque(const hsVector3 &the_Torque) { fTorque = the_Torque; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
hsVector3 fTorque;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
// IMPULSES
|
|
|
|
///////////
|
|
|
|
|
|
|
|
// PLIMPULSE
|
|
|
|
// Add the given vector to the objects velocity
|
|
|
|
class plImpulseMsg : public plSimInfluenceMsg
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
plImpulseMsg() : plSimInfluenceMsg() { };
|
|
|
|
plImpulseMsg(const plKey& sender, const plKey &receiver, hsVector3 &impulse)
|
|
|
|
:plSimInfluenceMsg(sender, receiver, nil), fImpulse(impulse) {};
|
|
|
|
plImpulseMsg(const plKey& sender, const plKey &receiver, double *time, hsVector3 &impulse)
|
|
|
|
:plSimInfluenceMsg(sender, receiver, time), fImpulse(impulse) {};
|
|
|
|
|
|
|
|
CLASSNAME_REGISTER( plImpulseMsg );
|
|
|
|
GETINTERFACE_ANY( plImpulseMsg, plSimInfluenceMsg);
|
|
|
|
|
|
|
|
void Read(hsStream *stream, hsResMgr *mgr);
|
|
|
|
void Write(hsStream *stream, hsResMgr *mgr);
|
|
|
|
|
|
|
|
hsVector3 GetImpulse() const { return fImpulse; }
|
|
|
|
void SetImpulse(const hsVector3 &the_Impulse) { fImpulse = the_Impulse; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
hsVector3 fImpulse;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
// PLOFFSETIMPULSE
|
|
|
|
// Apply the given impulse to the object at the given point in global space
|
|
|
|
// Will impart torque if not applied to center of mass
|
|
|
|
class plOffsetImpulseMsg : public plImpulseMsg
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
plOffsetImpulseMsg() : plImpulseMsg() { };
|
|
|
|
plOffsetImpulseMsg(const plKey& sender, const plKey &receiver, hsVector3 & impulse, hsPoint3 &point)
|
|
|
|
: plImpulseMsg(sender, receiver, impulse), fPoint(point) {};
|
|
|
|
plOffsetImpulseMsg(const plKey& sender, const plKey &receiver, double *time, hsVector3 & impulse, hsPoint3 &point)
|
|
|
|
: plImpulseMsg(sender, receiver, time, impulse), fPoint(point) {};
|
|
|
|
|
|
|
|
CLASSNAME_REGISTER( plOffsetImpulseMsg );
|
|
|
|
GETINTERFACE_ANY( plOffsetImpulseMsg, plImpulseMsg);
|
|
|
|
|
|
|
|
void Read(hsStream *stream, hsResMgr *mgr);
|
|
|
|
void Write(hsStream *stream, hsResMgr *mgr);
|
|
|
|
|
|
|
|
hsPoint3 GetPoint() const { return fPoint; }
|
|
|
|
void SetPoint(const hsPoint3 &the_Point) { fPoint = the_Point; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
hsPoint3 fPoint;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// PLANGULARIMPULSE
|
|
|
|
// Add the given vector (representing a rotation axis and magnitude)
|
|
|
|
// to the
|
|
|
|
class plAngularImpulseMsg : public plSimInfluenceMsg
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
plAngularImpulseMsg() : plSimInfluenceMsg() { };
|
|
|
|
plAngularImpulseMsg(const plKey& sender, const plKey &receiver, hsVector3 &impulse)
|
|
|
|
: plSimInfluenceMsg(sender, receiver, nil), fImpulse(impulse) {};
|
|
|
|
plAngularImpulseMsg(const plKey& sender, const plKey &receiver, double *time, hsVector3 &impulse)
|
|
|
|
: plSimInfluenceMsg(sender, receiver, time), fImpulse(impulse) {};
|
|
|
|
|
|
|
|
CLASSNAME_REGISTER( plAngularImpulseMsg );
|
|
|
|
GETINTERFACE_ANY( plAngularImpulseMsg, plSimInfluenceMsg);
|
|
|
|
|
|
|
|
void Read(hsStream *stream, hsResMgr *mgr);
|
|
|
|
void Write(hsStream *stream, hsResMgr *mgr);
|
|
|
|
|
|
|
|
hsVector3 GetImpulse() const { return fImpulse; }
|
|
|
|
|
|
|
|
void SetImpulse(const hsVector3 &the_Impulse)
|
|
|
|
{ fImpulse = the_Impulse; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
hsVector3 fImpulse;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// MISCELLANEOUS INFLUENCES
|
|
|
|
///////////////////////////
|
|
|
|
|
|
|
|
// PLDAMPMSG
|
|
|
|
// Decrease all velocities on the given object.
|
|
|
|
// A damp factor of 0 nulls them all entirely;
|
|
|
|
// A damp factor of 1 leaves them alone.
|
|
|
|
class plDampMsg : public plSimInfluenceMsg
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
plDampMsg() : plSimInfluenceMsg() { };
|
|
|
|
plDampMsg(const plKey& sender, const plKey &receiver, float dampFactor)
|
|
|
|
: plSimInfluenceMsg(sender, receiver, nil), fDamp(dampFactor) {};
|
|
|
|
plDampMsg(const plKey& sender, const plKey &receiver, double *time, float dampFactor)
|
|
|
|
: plSimInfluenceMsg(sender, receiver, time), fDamp(dampFactor) {};
|
|
|
|
|
|
|
|
CLASSNAME_REGISTER( plDampMsg );
|
|
|
|
GETINTERFACE_ANY( plDampMsg, plSimInfluenceMsg);
|
|
|
|
|
|
|
|
void Read(hsStream *stream, hsResMgr *mgr);
|
|
|
|
void Write(hsStream *stream, hsResMgr *mgr);
|
|
|
|
|
|
|
|
float GetDamp() const { return fDamp; }
|
|
|
|
|
|
|
|
void SetDamp( float the_Damp )
|
|
|
|
{ fDamp = the_Damp; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
float fDamp;
|
|
|
|
};
|
|
|
|
|
|
|
|
// PLSHIFTCENTERMSG
|
|
|
|
// Shift the center of mass of the given object by the given
|
|
|
|
// amount in the given direction.
|
|
|
|
class plShiftMassMsg : public plSimInfluenceMsg
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
plShiftMassMsg() : plSimInfluenceMsg() { };
|
|
|
|
plShiftMassMsg(const plKey& sender, const plKey &receiver, hsVector3 &offset)
|
|
|
|
:plSimInfluenceMsg(sender, receiver, nil), fOffset(offset) {};
|
|
|
|
plShiftMassMsg(const plKey& sender, const plKey &receiver, double *time, hsVector3 &offset)
|
|
|
|
:plSimInfluenceMsg(sender, receiver, time), fOffset(offset) {};
|
|
|
|
|
|
|
|
CLASSNAME_REGISTER( plShiftMassMsg );
|
|
|
|
GETINTERFACE_ANY( plShiftMassMsg, plSimInfluenceMsg);
|
|
|
|
|
|
|
|
void Read(hsStream *stream, hsResMgr *mgr);
|
|
|
|
void Write(hsStream *stream, hsResMgr *mgr);
|
|
|
|
|
|
|
|
hsVector3 GetOffset() const { return fOffset; }
|
|
|
|
|
|
|
|
void SetOffset(const hsVector3 &the_Offset)
|
|
|
|
{ fOffset = the_Offset; }
|
|
|
|
|
|
|
|
protected:
|
|
|
|
hsVector3 fOffset;
|
|
|
|
};
|
|
|
|
*/
|
|
|
|
#endif // PLSIMINFLUENCEMSG_H
|
|
|
|
|
|
|
|
|