1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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/>.
*
*/
/*
* Copyright (C) 2006-2010 - Frictional Games
*
* This file is part of HPL1 Engine.
*/
#ifndef HPL_SURFACE_DATA_H
#define HPL_SURFACE_DATA_H
#include "hpl1/engine/math/MathTypes.h"
#include "hpl1/engine/physics/PhysicsMaterial.h"
namespace hpl {
#define eRollAxisFlag_X 1
#define eRollAxisFlag_Y 2
#define eRollAxisFlag_Z 4
class cPhysics;
class iPhysicsWorld;
class iPhysicsBody;
class cResources;
//----------------------------------------
class cSurfaceImpactData {
friend class cSurfaceData;
public:
float GetMinSpeed() { return mfMinSpeed; }
const tString &GetSoundName() { return msSoundName; }
void SetSoundName(const tString &asName) { msSoundName = asName; }
const tString &GetPSName() { return msPSName; }
void SetPSName(const tString &asName) { msPSName = asName; }
int GetPSPrio() { return mlPSPrio; }
void SetPSPrio(int alPrio) { mlPSPrio = alPrio; }
private:
float mfMinSpeed;
tString msSoundName;
tString msPSName;
int mlPSPrio;
};
typedef Common::Array<cSurfaceImpactData *> tSurfaceImpactDataVec;
typedef tSurfaceImpactDataVec::iterator tSurfaceImpactDataVecIt;
//----------------------------------------
class cSurfaceData {
public:
cSurfaceData(const tString &asName, cPhysics *apPhysics, cResources *apResources);
~cSurfaceData();
const tString &GetName() const { return msName; }
void OnImpact(float afSpeed, const cVector3f &avPos, int alContacts, iPhysicsBody *apBody);
void OnSlide(float afSpeed, const cVector3f &avPos, int alContacts, iPhysicsBody *apBody,
iPhysicsBody *apSlideAgainstBody);
void CreateImpactEffect(float afSpeed, const cVector3f &avPos, int alContacts,
cSurfaceData *apSecondSurface);
void UpdateRollEffect(iPhysicsBody *apBody);
void SetElasticity(float afElasticity);
float GetElasticity() const;
void SetStaticFriction(float afElasticity);
float GetStaticFriction() const;
void SetKineticFriction(float afElasticity);
float GetKineticFriction() const;
void SetPriority(int alPriority);
int GetPriority() const;
void SetFrictionCombMode(ePhysicsMaterialCombMode aMode);
ePhysicsMaterialCombMode GetFrictionCombMode() const;
void SetElasticityCombMode(ePhysicsMaterialCombMode aMode);
ePhysicsMaterialCombMode GetElasticityCombMode() const;
const tString &GetStepType() { return msStepType; }
void GetStepType(const tString &asX) { msStepType = asX; }
void SetMinScrapeSpeed(float afX) { mfMinScrapeSpeed = afX; }
void SetMinScrapeFreq(float afX) { mfMinScrapeFreq = afX; }
void SetMinScrapeFreqSpeed(float afX) { mfMinScrapeFreqSpeed = afX; }
void SetMaxScrapeFreq(float afX) { mfMaxScrapeFreq = afX; }
void SetMaxScrapeFreqSpeed(float afX) { mfMaxScrapeFreqSpeed = afX; }
void SetMiddleScrapeSpeed(float afX) { mfMiddleScrapeSpeed = afX; }
void SetMinScrapeContacts(int alX) { mlMinScrapeContacts = alX; }
void SetScrapeSoundName(const tString &asName) { msScrapeSoundName = asName; }
void SetMinRollSpeed(float afX) { mfMinRollSpeed = afX; }
void SetMinRollFreq(float afX) { mfMinRollFreq = afX; }
void SetMinRollVolume(float afX) { mfMinRollVolume = afX; }
void SetMinRollFreqSpeed(float afX) { mfMinRollFreqSpeed = afX; }
void SetMaxRollFreq(float afX) { mfMaxRollFreq = afX; }
void SetMaxRollVolume(float afX) { mfMaxRollVolume = afX; }
void SetMaxRollFreqSpeed(float afX) { mfMaxRollFreqSpeed = afX; }
void SetMiddleRollSpeed(float afX) { mfMiddleRollSpeed = afX; }
void SetRollSoundName(const tString &asName) { msRollSoundName = asName; }
void SetRollAxisFlags(tFlag aAxisFlags) { mRollAxisFlags = aAxisFlags; }
void PreloadData();
iPhysicsMaterial *ToMaterial(iPhysicsWorld *apWorld);
/**
* This must be added with the largest speed first.
**/
cSurfaceImpactData *CreateImpactData(float afMinSpeed);
cSurfaceImpactData *GetImpactData(int alIdx);
int GetImpactDataNum();
/**
* Gets the the appropriate impact data depending on speed. It gets the data with highest speed not higher than afSpeed
* \param afSpeed The speed value.
* \return
*/
cSurfaceImpactData *GetImpactDataFromSpeed(float afSpeed);
/**
* This must be added with the largest speed first.
**/
cSurfaceImpactData *CreateHitData(float afMinSpeed);
cSurfaceImpactData *GetHitData(int alIdx);
int GetHitDataNum();
/**
* Gets the the appropriate hit data depending on speed. It gets the data with highest speed not higher than afSpeed
* \param afSpeed The speed value.
* \return
*/
cSurfaceImpactData *GetHitDataFromSpeed(float afSpeed);
protected:
cResources *mpResources;
cPhysics *mpPhysics;
tString msName;
// Properties
ePhysicsMaterialCombMode mFrictionMode;
ePhysicsMaterialCombMode mElasticityMode;
float mfElasticity;
float mfStaticFriction;
float mfKineticFriction;
int mlPriority;
float mfMinScrapeSpeed;
float mfMinScrapeFreq;
float mfMinScrapeFreqSpeed;
float mfMaxScrapeFreq;
float mfMaxScrapeFreqSpeed;
float mfMiddleScrapeSpeed;
int mlMinScrapeContacts;
tString msScrapeSoundName;
float mfMinRollSpeed;
float mfMinRollFreq;
float mfMinRollVolume;
float mfMinRollFreqSpeed;
float mfMaxRollFreq;
float mfMaxRollVolume;
float mfMaxRollFreqSpeed;
float mfMiddleRollSpeed;
int mlMinRollContacts;
tString msRollSoundName;
tFlag mRollAxisFlags;
tString msStepType;
tSurfaceImpactDataVec mvImpactData;
tSurfaceImpactDataVec mvHitData;
};
} // namespace hpl
#endif // HPL_SURFACE_DATA_H
|