// * 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; };