diff options
Diffstat (limited to 'src/physics/physics.h')
-rw-r--r-- | src/physics/physics.h | 492 |
1 files changed, 246 insertions, 246 deletions
diff --git a/src/physics/physics.h b/src/physics/physics.h index 53aff8a..6865b6a 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -1,246 +1,246 @@ -// * This file is part of the COLOBOT source code
-// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
-// *
-// * 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/.
-
-// physics.h
-
-#pragma once
-
-
-#include "old/d3dengine.h"
-#include "common/misc.h"
-#include "object/object.h"
-
-
-class CInstanceManager;
-class CD3DEngine;
-class CLight;
-class CParticule;
-class CTerrain;
-class CWater;
-class CCamera;
-class CObject;
-class CBrain;
-class CMotion;
-class CSound;
-
-
-enum PhysicsType
-{
- TYPE_ROLLING = 1,
- TYPE_FLYING = 2,
-};
-
-enum PhysicsMode
-{
- MO_ADVACCEL = 0,
- MO_RECACCEL = 1,
- MO_STOACCEL = 2,
- MO_MOTACCEL = 3,
- MO_ADVSPEED = 4,
- MO_RECSPEED = 5,
- MO_MOTSPEED = 6,
- MO_CURSPEED = 7,
- MO_TERFORCE = 8,
- MO_TERSPEED = 9,
- MO_TERSLIDE = 10,
- MO_REASPEED = 11,
-};
-
-
-struct Motion
-{
- Math::Vector advanceAccel; // acceleration starting (+)
- Math::Vector recedeAccel; // acceleration starting (+)
- Math::Vector stopAccel; // acceleration stoping (+)
- Math::Vector motorAccel; // current acceleration (+/-)
-
- Math::Vector advanceSpeed; // forward speed (+)
- Math::Vector recedeSpeed; // reversing speed (+)
- Math::Vector motorSpeed; // desired speed (+/-)
- Math::Vector currentSpeed; // current speed (+/-)
-
- Math::Vector terrainForce; // power of resistance of the ground (+)
- Math::Vector terrainSpeed; // speed of the ground (+/-)
- Math::Vector terrainSlide; // limit sliding speed (+)
-
- Math::Vector realSpeed; // real speed(+/-)
-
- Math::Vector finalInclin; // final inclination
-};
-
-
-
-
-class CPhysics
-{
-public:
- CPhysics(CInstanceManager* iMan, CObject* object);
- ~CPhysics();
-
- void DeleteObject(bool bAll=false);
-
- bool EventProcess(const Event &event);
-
- void SetBrain(CBrain* brain);
- void SetMotion(CMotion* motion);
-
- void SetType(PhysicsType type);
- PhysicsType RetType();
-
- bool Write(char *line);
- bool Read(char *line);
-
- void SetGravity(float value);
- float RetGravity();
-
- float RetFloorHeight();
-
- void SetLinMotion(PhysicsMode mode, Math::Vector value);
- Math::Vector RetLinMotion(PhysicsMode mode);
- void SetLinMotionX(PhysicsMode mode, float value);
- void SetLinMotionY(PhysicsMode mode, float value);
- void SetLinMotionZ(PhysicsMode mode, float value);
- float RetLinMotionX(PhysicsMode mode);
- float RetLinMotionY(PhysicsMode mode);
- float RetLinMotionZ(PhysicsMode mode);
-
- void SetCirMotion(PhysicsMode mode, Math::Vector value);
- Math::Vector RetCirMotion(PhysicsMode mode);
- void SetCirMotionX(PhysicsMode mode, float value);
- void SetCirMotionY(PhysicsMode mode, float value);
- void SetCirMotionZ(PhysicsMode mode, float value);
- float RetCirMotionX(PhysicsMode mode);
- float RetCirMotionY(PhysicsMode mode);
- float RetCirMotionZ(PhysicsMode mode);
-
- float RetLinStopLength(PhysicsMode sMode=MO_ADVSPEED, PhysicsMode aMode=MO_STOACCEL);
- float RetCirStopLength();
- float RetLinMaxLength(float dir);
- float RetLinTimeLength(float dist, float dir=1.0f);
- float RetLinLength(float dist);
-
- void SetMotor(bool bState);
- bool RetMotor();
- void SetLand(bool bState);
- bool RetLand();
- void SetSwim(bool bState);
- bool RetSwim();
- void SetCollision(bool bCollision);
- bool RetCollision();
- void SetFreeze(bool bFreeze);
- bool RetFreeze();
- void SetReactorRange(float range);
- float RetReactorRange();
-
- void SetMotorSpeed(Math::Vector speed);
- void SetMotorSpeedX(float speed);
- void SetMotorSpeedY(float speed);
- void SetMotorSpeedZ(float speed);
- Math::Vector RetMotorSpeed();
- float RetMotorSpeedX();
- float RetMotorSpeedY();
- float RetMotorSpeedZ();
-
- void CreateInterface(bool bSelect);
- Error RetError();
-
-protected:
- bool EventFrame(const Event &event);
- void WaterFrame(float aTime, float rTime);
- void SoundMotor(float rTime);
- void SoundMotorFull(float rTime, ObjectType type);
- void SoundMotorSlow(float rTime, ObjectType type);
- void SoundMotorStop(float rTime, ObjectType type);
- void SoundReactorFull(float rTime, ObjectType type);
- void SoundReactorStop(float rTime, ObjectType type);
- void FrameParticule(float aTime, float rTime);
- void MotorUpdate(float aTime, float rTime);
- void EffectUpdate(float aTime, float rTime);
- void UpdateMotionStruct(float rTime, Motion &motion);
- void FloorAdapt(float aTime, float rTime, Math::Vector &pos, Math::Vector &angle);
- void FloorAngle(const Math::Vector &pos, Math::Vector &angle);
- int ObjectAdapt(const Math::Vector &pos, const Math::Vector &angle);
- bool JostleObject(CObject* pObj, Math::Vector iPos, float iRad, Math::Vector oPos, float oRad);
- bool JostleObject(CObject* pObj, float force);
- bool ExploOther(ObjectType iType, CObject *pObj, ObjectType oType, float force);
- int ExploHimself(ObjectType iType, ObjectType oType, float force);
-
- void PowerParticule(float factor, bool bBreak);
- void CrashParticule(float crash);
- void MotorParticule(float aTime, float rTime);
- void WaterParticule(float aTime, Math::Vector pos, ObjectType type, float floor, float advance, float turn);
- void WheelParticule(int color, float width);
-
-protected:
- CInstanceManager* m_iMan;
- CD3DEngine* m_engine;
- CLight* m_light;
- CParticule* m_particule;
- CTerrain* m_terrain;
- CWater* m_water;
- CCamera* m_camera;
- CObject* m_object;
- CBrain* m_brain;
- CMotion* m_motion;
- CSound* m_sound;
-
- PhysicsType m_type; // TYPE_*
- float m_gravity; // force of gravity
- float m_time; // absolute time
- Math::Vector m_motorSpeed; // motor speed (-1..1)
- Motion m_linMotion; // linear motion
- Motion m_cirMotion; // circular motion
- bool m_bMotor;
- bool m_bLand;
- bool m_bSwim;
- bool m_bCollision;
- bool m_bObstacle;
- bool m_bFreeze;
- int m_repeatCollision;
- float m_linVibrationFactor;
- float m_cirVibrationFactor;
- float m_inclinaisonFactor;
- float m_lastPowerParticule;
- float m_lastSlideParticule;
- float m_lastMotorParticule;
- float m_lastWaterParticule;
- float m_lastUnderParticule;
- float m_lastPloufParticule;
- float m_lastFlameParticule;
- bool m_bWheelParticuleBrake;
- Math::Vector m_wheelParticulePos[2];
- float m_absorbWater;
- float m_reactorTemperature;
- float m_reactorRange;
- float m_timeReactorFail;
- float m_timeUnderWater;
- float m_lastEnergy;
- float m_lastSoundWater;
- float m_lastSoundInsect;
- float m_restBreakParticule;
- float m_floorLevel; // ground level
- float m_floorHeight; // height above the ground
- int m_soundChannel;
- int m_soundChannelSlide;
- float m_soundTimePshhh;
- float m_soundTimeJostle;
- float m_soundTimeBoum;
- bool m_bSoundSlow;
- bool m_bForceUpdate;
- bool m_bLowLevel;
-};
-
-
+// * This file is part of the COLOBOT source code +// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch +// * +// * 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/. + +// physics.h + +#pragma once + + +#include "old/d3dengine.h" +#include "common/misc.h" +#include "object/object.h" + + +class CInstanceManager; +class CD3DEngine; +class CLight; +class CParticule; +class CTerrain; +class CWater; +class CCamera; +class CObject; +class CBrain; +class CMotion; +class CSound; + + +enum PhysicsType +{ + TYPE_ROLLING = 1, + TYPE_FLYING = 2, +}; + +enum PhysicsMode +{ + MO_ADVACCEL = 0, + MO_RECACCEL = 1, + MO_STOACCEL = 2, + MO_MOTACCEL = 3, + MO_ADVSPEED = 4, + MO_RECSPEED = 5, + MO_MOTSPEED = 6, + MO_CURSPEED = 7, + MO_TERFORCE = 8, + MO_TERSPEED = 9, + MO_TERSLIDE = 10, + MO_REASPEED = 11, +}; + + +struct Motion +{ + Math::Vector advanceAccel; // acceleration starting (+) + Math::Vector recedeAccel; // acceleration starting (+) + Math::Vector stopAccel; // acceleration stoping (+) + Math::Vector motorAccel; // current acceleration (+/-) + + Math::Vector advanceSpeed; // forward speed (+) + Math::Vector recedeSpeed; // reversing speed (+) + Math::Vector motorSpeed; // desired speed (+/-) + Math::Vector currentSpeed; // current speed (+/-) + + Math::Vector terrainForce; // power of resistance of the ground (+) + Math::Vector terrainSpeed; // speed of the ground (+/-) + Math::Vector terrainSlide; // limit sliding speed (+) + + Math::Vector realSpeed; // real speed(+/-) + + Math::Vector finalInclin; // final inclination +}; + + + + +class CPhysics +{ +public: + CPhysics(CInstanceManager* iMan, CObject* object); + ~CPhysics(); + + void DeleteObject(bool bAll=false); + + bool EventProcess(const Event &event); + + void SetBrain(CBrain* brain); + void SetMotion(CMotion* motion); + + void SetType(PhysicsType type); + PhysicsType RetType(); + + bool Write(char *line); + bool Read(char *line); + + void SetGravity(float value); + float RetGravity(); + + float RetFloorHeight(); + + void SetLinMotion(PhysicsMode mode, Math::Vector value); + Math::Vector RetLinMotion(PhysicsMode mode); + void SetLinMotionX(PhysicsMode mode, float value); + void SetLinMotionY(PhysicsMode mode, float value); + void SetLinMotionZ(PhysicsMode mode, float value); + float RetLinMotionX(PhysicsMode mode); + float RetLinMotionY(PhysicsMode mode); + float RetLinMotionZ(PhysicsMode mode); + + void SetCirMotion(PhysicsMode mode, Math::Vector value); + Math::Vector RetCirMotion(PhysicsMode mode); + void SetCirMotionX(PhysicsMode mode, float value); + void SetCirMotionY(PhysicsMode mode, float value); + void SetCirMotionZ(PhysicsMode mode, float value); + float RetCirMotionX(PhysicsMode mode); + float RetCirMotionY(PhysicsMode mode); + float RetCirMotionZ(PhysicsMode mode); + + float RetLinStopLength(PhysicsMode sMode=MO_ADVSPEED, PhysicsMode aMode=MO_STOACCEL); + float RetCirStopLength(); + float RetLinMaxLength(float dir); + float RetLinTimeLength(float dist, float dir=1.0f); + float RetLinLength(float dist); + + void SetMotor(bool bState); + bool RetMotor(); + void SetLand(bool bState); + bool RetLand(); + void SetSwim(bool bState); + bool RetSwim(); + void SetCollision(bool bCollision); + bool RetCollision(); + void SetFreeze(bool bFreeze); + bool RetFreeze(); + void SetReactorRange(float range); + float RetReactorRange(); + + void SetMotorSpeed(Math::Vector speed); + void SetMotorSpeedX(float speed); + void SetMotorSpeedY(float speed); + void SetMotorSpeedZ(float speed); + Math::Vector RetMotorSpeed(); + float RetMotorSpeedX(); + float RetMotorSpeedY(); + float RetMotorSpeedZ(); + + void CreateInterface(bool bSelect); + Error RetError(); + +protected: + bool EventFrame(const Event &event); + void WaterFrame(float aTime, float rTime); + void SoundMotor(float rTime); + void SoundMotorFull(float rTime, ObjectType type); + void SoundMotorSlow(float rTime, ObjectType type); + void SoundMotorStop(float rTime, ObjectType type); + void SoundReactorFull(float rTime, ObjectType type); + void SoundReactorStop(float rTime, ObjectType type); + void FrameParticule(float aTime, float rTime); + void MotorUpdate(float aTime, float rTime); + void EffectUpdate(float aTime, float rTime); + void UpdateMotionStruct(float rTime, Motion &motion); + void FloorAdapt(float aTime, float rTime, Math::Vector &pos, Math::Vector &angle); + void FloorAngle(const Math::Vector &pos, Math::Vector &angle); + int ObjectAdapt(const Math::Vector &pos, const Math::Vector &angle); + bool JostleObject(CObject* pObj, Math::Vector iPos, float iRad, Math::Vector oPos, float oRad); + bool JostleObject(CObject* pObj, float force); + bool ExploOther(ObjectType iType, CObject *pObj, ObjectType oType, float force); + int ExploHimself(ObjectType iType, ObjectType oType, float force); + + void PowerParticule(float factor, bool bBreak); + void CrashParticule(float crash); + void MotorParticule(float aTime, float rTime); + void WaterParticule(float aTime, Math::Vector pos, ObjectType type, float floor, float advance, float turn); + void WheelParticule(int color, float width); + +protected: + CInstanceManager* m_iMan; + CD3DEngine* m_engine; + CLight* m_light; + CParticule* m_particule; + CTerrain* m_terrain; + CWater* m_water; + CCamera* m_camera; + CObject* m_object; + CBrain* m_brain; + CMotion* m_motion; + CSound* m_sound; + + PhysicsType m_type; // TYPE_* + float m_gravity; // force of gravity + float m_time; // absolute time + Math::Vector m_motorSpeed; // motor speed (-1..1) + Motion m_linMotion; // linear motion + Motion m_cirMotion; // circular motion + bool m_bMotor; + bool m_bLand; + bool m_bSwim; + bool m_bCollision; + bool m_bObstacle; + bool m_bFreeze; + int m_repeatCollision; + float m_linVibrationFactor; + float m_cirVibrationFactor; + float m_inclinaisonFactor; + float m_lastPowerParticule; + float m_lastSlideParticule; + float m_lastMotorParticule; + float m_lastWaterParticule; + float m_lastUnderParticule; + float m_lastPloufParticule; + float m_lastFlameParticule; + bool m_bWheelParticuleBrake; + Math::Vector m_wheelParticulePos[2]; + float m_absorbWater; + float m_reactorTemperature; + float m_reactorRange; + float m_timeReactorFail; + float m_timeUnderWater; + float m_lastEnergy; + float m_lastSoundWater; + float m_lastSoundInsect; + float m_restBreakParticule; + float m_floorLevel; // ground level + float m_floorHeight; // height above the ground + int m_soundChannel; + int m_soundChannelSlide; + float m_soundTimePshhh; + float m_soundTimeJostle; + float m_soundTimeBoum; + bool m_bSoundSlow; + bool m_bForceUpdate; + bool m_bLowLevel; +}; + + |